diff --git a/runestone/activecode/js/activecode.js b/runestone/activecode/js/activecode.js index df5022d1e..1f04c3eb8 100755 --- a/runestone/activecode/js/activecode.js +++ b/runestone/activecode/js/activecode.js @@ -70,6 +70,7 @@ export class ActiveCode extends RunestoneBase { this.runButton = null; this.enabledownload = $(orig).data("enabledownload"); this.downloadButton = null; + this.resetButton = null; this.saveButton = null; this.loadButton = null; this.outerDiv = null; @@ -278,6 +279,8 @@ export class ActiveCode extends RunestoneBase { this.runButton.onclick = this.runButtonHandler.bind(this); $(butt).attr("type", "button"); + this.addResetButton(ctrlDiv); + if (this.enabledownload || eBookConfig.downloadsEnabled) { this.addDownloadButton(ctrlDiv); } @@ -354,6 +357,16 @@ export class ActiveCode extends RunestoneBase { $(butt).attr("type", "button"); } + addResetButton(ctrlDiv) { + let butt = document.createElement("button"); + $(butt).text("Reset"); + $(butt).addClass("btn btn-default"); + $(butt).attr("type", "button"); + ctrlDiv.appendChild(butt); + this.resetButton = butt; + $(butt).click(this.resetCode.bind(this)); + } + enableHideShow(ctrlDiv) { $(this.runButton).attr("disabled", "disabled"); let butt = document.createElement("button"); @@ -763,6 +776,11 @@ export class ActiveCode extends RunestoneBase { } } + resetCode() { + localStorage.removeItem(this.divid); + window.location.reload(); + } + async createGradeSummary() { // get grade and comments for this assignment // get summary of all grades for this student diff --git a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js index 82f127b09..e9c1d2c6d 100644 --- a/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js +++ b/runestone/dist/node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js.bundle.js @@ -968,6 +968,7 @@ class ActiveCode extends _common_js_runestonebase_js__WEBPACK_IMPORTED_MODULE_0_ this.runButton = null; this.enabledownload = $(orig).data("enabledownload"); this.downloadButton = null; + this.resetButton = null; this.saveButton = null; this.loadButton = null; this.outerDiv = null; @@ -1176,6 +1177,8 @@ class ActiveCode extends _common_js_runestonebase_js__WEBPACK_IMPORTED_MODULE_0_ this.runButton.onclick = this.runButtonHandler.bind(this); $(butt).attr("type", "button"); + this.addResetButton(ctrlDiv); + if (this.enabledownload || eBookConfig.downloadsEnabled) { this.addDownloadButton(ctrlDiv); } @@ -1252,6 +1255,16 @@ class ActiveCode extends _common_js_runestonebase_js__WEBPACK_IMPORTED_MODULE_0_ $(butt).attr("type", "button"); } + addResetButton(ctrlDiv) { + let butt = document.createElement("button"); + $(butt).text("Reset"); + $(butt).addClass("btn btn-default"); + $(butt).attr("type", "button"); + ctrlDiv.appendChild(butt); + this.resetButton = butt; + $(butt).click(this.resetCode.bind(this)); + } + enableHideShow(ctrlDiv) { $(this.runButton).attr("disabled", "disabled"); let butt = document.createElement("button"); @@ -1661,6 +1674,11 @@ class ActiveCode extends _common_js_runestonebase_js__WEBPACK_IMPORTED_MODULE_0_ } } + resetCode() { + localStorage.removeItem(this.divid); + window.location.reload(); + } + async createGradeSummary() { // get grade and comments for this assignment // get summary of all grades for this student @@ -6016,4 +6034,4 @@ jQuery.fn.removeHighlight = function() { /***/ }) }]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7O0FDOU5EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdKQUF3SjtBQUN4SjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7QUNySEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEhBQThIO0FBQzlIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFZ0Q7QUFDdEI7QUFDTjtBQUNHO0FBQ0U7QUFDRjtBQUNNO0FBQ047QUFDWTtBQUNaO0FBQ2M7QUFDZDtBQUNJO0FBQ0U7QUFDVDtBQUNNO0FBQ2Q7QUFDRztBQUM1QjtBQUMrQjtBQUMvQjtBQUNBLG1CQUFtQixnREFBSzs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNPLHlCQUF5QixnRUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsV0FBVztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EscUJBQXFCLGlEQUFVOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtEQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLG1CQUFtQjtBQUNqRSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixXQUFXO0FBQ3hDO0FBQ0E7QUFDQSx3QkFBd0IsV0FBVztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxPQUFPLEtBQUssUUFBUSxNQUFNLE1BQU07QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEdBQUcsS0FBSyxRQUFRLE1BQU0sTUFBTTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixXQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixPQUFPLEdBQUcsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrRkFBa0YsWUFBWTtBQUM5RjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxtQkFBbUIsUUFBUSxNQUFNO0FBQ3BHO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsVUFBVTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSwwREFBMEQsbUJBQW1CLFFBQVEsTUFBTTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiwwQkFBMEI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw4Q0FBOEMsRUFBRTtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxXQUFXO0FBQzVDO0FBQ0E7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RCxvREFBb0QsUUFBUTtBQUM1RCxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RCw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixXQUFXO0FBQ2hDLGtCQUFrQixXQUFXO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JELHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3NEM2Qzs7QUFFOUIsZ0NBQWdDLHNEQUFVO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDZCQUE2Qiw4QkFBOEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCLHlCQUF5Qix3QkFBd0Isb0JBQW9CO0FBQzVILG9DQUFvQyxhQUFhLFlBQVksZ0JBQWdCLG1CQUFtQixnQkFBZ0IsYUFBYSxjQUFjO0FBQzNJO0FBQ0E7QUFDQSxxQ0FBcUMsZUFBZTtBQUNwRDtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxXQUFXO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxnQ0FBZ0M7QUFDckU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsWUFBWSxJQUFJLE9BQU8sRUFBRSxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsNkNBQTZDO0FBQzdDLGtGQUFrRixxQ0FBcUMseURBQXlEO0FBQ2hMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEk2Qzs7QUFFOUIsNkJBQTZCLHNEQUFVO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLDZCQUE2Qiw4QkFBOEI7QUFDM0Q7QUFDQSxtRkFBbUYsK0JBQStCO0FBQ2xIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckQ2Qzs7QUFFOUIsMkJBQTJCLHNEQUFVO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBLG1DQUFtQyxpQkFBaUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixTQUFTO0FBQ1Q7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qiw4QkFBOEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdEU2QztBQUNMO0FBQ1M7QUFDRDs7QUFFaEQ7O0FBRWUsNEJBQTRCLHNEQUFVO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0IsbUJBQW1CLHVCQUF1QjtBQUN0RjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxTQUFTLEdBQUcsU0FBUztBQUM5RDtBQUNBO0FBQ0E7QUFDQSxRQUFRLDhEQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxXQUFXLEVBQUUsV0FBVztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMscUVBQXFFO0FBQzlHO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQSwyREFBMkQsV0FBVztBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIscUJBQXFCO0FBQ3JCLDJDQUEyQyxvQkFBb0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxxREFBcUQsRUFBRTtBQUN2RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsRUFBRTs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QywyQkFBMkI7QUFDeEUsZ0NBQWdDLFlBQVk7QUFDNUM7QUFDQSxTQUFTLGFBQWEsSUFBSTtBQUMxQix1Q0FBdUMsSUFBSSxVQUFVLFlBQVksVUFBVSxZQUFZO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsNERBQTRELElBQUksYUFBYSxJQUFJO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLE9BQU8sR0FBRyxLQUFLLEdBQUcsU0FBUyxVQUFVLElBQUksVUFBVSwwQkFBMEI7QUFDM0c7QUFDQSxTQUFTO0FBQ1QsK0JBQStCLE9BQU8sR0FBRyxLQUFLLEdBQUcsU0FBUyxVQUFVLElBQUksVUFBVSwwQkFBMEI7QUFDNUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixpREFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSx1QkFBdUIsaUJBQWlCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3Qix1QkFBdUI7O0FBRS9DO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclg2RDs7QUFFN0Q7QUFDZSx3QkFBd0IsZ0VBQWE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qiw4QkFBOEI7QUFDOUIsd0JBQXdCO0FBQ3hCLGdDQUFnQztBQUNoQywwQkFBMEI7QUFDMUIsMEJBQTBCO0FBQzFCLDZCQUE2QjtBQUM3QiwwQkFBMEI7QUFDMUIsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsZUFBZTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwyQkFBMkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsYUFBYSxvQkFBb0Isa0JBQWtCO0FBQzdFO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixhQUFhLG9CQUFvQixrQkFBa0I7QUFDN0U7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGFBQWEsb0JBQW9CLGtCQUFrQjtBQUM3RTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsYUFBYSxvQkFBb0Isa0JBQWtCO0FBQzdFO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixhQUFhLG9CQUFvQixrQkFBa0I7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxpQkFBaUIsb0JBQW9CO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFlBQVk7QUFDbkM7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMkNBQTJDO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGFBQWE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsU0FBUztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNubEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFNBQVM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxvQkFBb0I7QUFDOUUsYUFBYTtBQUNiO0FBQ0E7QUFDQSwwREFBMEQsb0JBQW9CO0FBQzlFO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixzQkFBc0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRjZDO0FBQ2xCO0FBQzJCO0FBQ0g7O0FBRXBDLHVCQUF1QixzREFBVTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsZUFBZTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixnQkFBZ0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGdDQUFnQyxrQ0FBa0M7QUFDbEUsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxnQ0FBZ0MsbUNBQW1DO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdDQUF3QztBQUNoRSx3QkFBd0IsNkNBQTZDO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Qsb0JBQW9CO0FBQ3BFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkIsa0JBQWtCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxnREFBRztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsZ0RBQWdELG9CQUFvQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDhCQUE4QjtBQUMzRDtBQUNBOztBQUVBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDJEQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsc0JBQXNCLFVBQVUseUJBQXlCLFVBQVUseUJBQXlCO0FBQy9JO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDLFdBQVc7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFdBQVc7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU8sZ0JBQWdCO0FBQ3ZDLGdCQUFnQixTQUFTO0FBQ3pCLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxtQ0FBbUMsNkJBQTZCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsaUJBQWlCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLHlDQUF5QztBQUN6QztBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGtCQUFrQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIsNEJBQTRCO0FBQzVCLDRCQUE0QjtBQUM1QjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDdG5CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixtQkFBbUI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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SyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLGdTQUFnUyxNQUFNLEtBQUssTUFBTSx3TEFBd0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTTtBQUNwOUIscUJBQXFCLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLHVFQUF1RSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0saUNBQWlDLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxpSUFBaUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTTtBQUN4akMsNHFEQUE0cUQsTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLHNJQUFzSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxL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QTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEJBQTRCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7Ozs7Ozs7OztBQ3BEQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZSIsImZpbGUiOiJub2RlX21vZHVsZXNfbW9tZW50X2xvY2FsZV9zeW5jX3JlY3Vyc2l2ZV8tcnVuZXN0b25lX2FjdGl2ZWNvZGVfanNfYWNmYWN0b3J5X2pzLmJ1bmRsZS5qcz92PTkyMjI5NWI3NzNiM2E4NGMzNjUyIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIubW9kYWwtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB3aWR0aDogNzAwcHg7XFxuICAgIHBhZGRpbmc6IDI1cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2YyZjJmMjtcXG4gICAgei1pbmRleDogNTA7XFxufVxcblxcbi5tb2RhbC1saWdodHNvdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHotaW5kZXg6IDI1O1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbn1cXG5cXG4ubW9kYWwtY2xvc2UtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaGVpZ2h0OiA0M3B4O1xcbiAgICB3aWR0aDogNDNweDtcXG4gICAgLypiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2Nsb3NlLnBuZycpOyAqL1xcbiAgICB0b3A6IDFweDtcXG4gICAgcmlnaHQ6IDAuNXB4O1xcbn1cXG5cXG4uYWNfYWN0aW9ucyB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmFjX3NlcCB7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luOiAtMTVweCAxMHB4O1xcbiAgICB3aWR0aDogMXB4O1xcbiAgICBoZWlnaHQ6IDM1cHg7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmFjX3NlY3Rpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+ICo6bm90KC5hY19zZWN0aW9uKSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLmNsZWFyZml4IHtcXG4gICAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi5hY19vdXRwdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG4uYWNfb3V0cHV0IHByZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcXG59XFxuXFxuLmFjX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4uYWNfY2FwdGlvbl90ZXh0IHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmFjX3F1ZXN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNCwgMjM2LCAyMTcpO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuLmFjdGl2ZV9vdXQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1pbi13aWR0aDogMjBlbTtcXG4gICAgbWF4LWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmlzaWJsZS1hYy1jYW52YXMge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAuY29sLW1kLTEyIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5mdWxsX3dpZHRoIG9sIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hYy1kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4uYWMtZmVlZGJhY2sge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogM3B4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBncmVlbjtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X2ZhaWx1cmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IHJlZDtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLCtCQUErQjtJQUMvQixvQ0FBb0M7SUFDcEMsdUNBQXVDO0lBQ3ZDLG1CQUFtQjtJQUNuQix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLG1CQUFtQjtJQUNuQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixXQUFXO0lBQ1gsdUNBQXVDO0lBQ3ZDLFFBQVE7SUFDUixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFlBQVk7SUFDWixVQUFVO0lBQ1YsU0FBUztBQUNiOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIseUJBQXlCO0FBQzdCO0FBQ0E7SUFDSSwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsV0FBVztBQUNmOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLDJCQUEyQjtJQUMzQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixZQUFZO0lBQ1osV0FBVztJQUNYLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtBQUM5QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIubW9kYWwtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB3aWR0aDogNzAwcHg7XFxuICAgIHBhZGRpbmc6IDI1cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2YyZjJmMjtcXG4gICAgei1pbmRleDogNTA7XFxufVxcblxcbi5tb2RhbC1saWdodHNvdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHotaW5kZXg6IDI1O1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbn1cXG5cXG4ubW9kYWwtY2xvc2UtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaGVpZ2h0OiA0M3B4O1xcbiAgICB3aWR0aDogNDNweDtcXG4gICAgLypiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2Nsb3NlLnBuZycpOyAqL1xcbiAgICB0b3A6IDFweDtcXG4gICAgcmlnaHQ6IDAuNXB4O1xcbn1cXG5cXG4uYWNfYWN0aW9ucyB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmFjX3NlcCB7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luOiAtMTVweCAxMHB4O1xcbiAgICB3aWR0aDogMXB4O1xcbiAgICBoZWlnaHQ6IDM1cHg7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmFjX3NlY3Rpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+ICo6bm90KC5hY19zZWN0aW9uKSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLmNsZWFyZml4IHtcXG4gICAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi5hY19vdXRwdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG4uYWNfb3V0cHV0IHByZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcXG59XFxuXFxuLmFjX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4uYWNfY2FwdGlvbl90ZXh0IHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmFjX3F1ZXN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNCwgMjM2LCAyMTcpO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuLmFjdGl2ZV9vdXQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1pbi13aWR0aDogMjBlbTtcXG4gICAgbWF4LWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmlzaWJsZS1hYy1jYW52YXMge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAuY29sLW1kLTEyIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5mdWxsX3dpZHRoIG9sIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hYy1kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4uYWMtZmVlZGJhY2sge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogM3B4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBncmVlbjtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X2ZhaWx1cmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IHJlZDtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vYWZcIjogNDI3ODYsXG5cdFwiLi9hZi5qc1wiOiA0Mjc4Nixcblx0XCIuL2FyXCI6IDMwODY3LFxuXHRcIi4vYXItZHpcIjogMTQxMzAsXG5cdFwiLi9hci1kei5qc1wiOiAxNDEzMCxcblx0XCIuL2FyLWt3XCI6IDk2MTM1LFxuXHRcIi4vYXIta3cuanNcIjogOTYxMzUsXG5cdFwiLi9hci1seVwiOiA1NjQ0MCxcblx0XCIuL2FyLWx5LmpzXCI6IDU2NDQwLFxuXHRcIi4vYXItbWFcIjogNDc3MDIsXG5cdFwiLi9hci1tYS5qc1wiOiA0NzcwMixcblx0XCIuL2FyLXNhXCI6IDE2MDQwLFxuXHRcIi4vYXItc2EuanNcIjogMTYwNDAsXG5cdFwiLi9hci10blwiOiAzNzEwMCxcblx0XCIuL2FyLXRuLmpzXCI6IDM3MTAwLFxuXHRcIi4vYXIuanNcIjogMzA4NjcsXG5cdFwiLi9helwiOiAzMTA4Myxcblx0XCIuL2F6LmpzXCI6IDMxMDgzLFxuXHRcIi4vYmVcIjogOTgwOCxcblx0XCIuL2JlLmpzXCI6IDk4MDgsXG5cdFwiLi9iZ1wiOiA2ODMzOCxcblx0XCIuL2JnLmpzXCI6IDY4MzM4LFxuXHRcIi4vYm1cIjogNjc0MzgsXG5cdFwiLi9ibS5qc1wiOiA2NzQzOCxcblx0XCIuL2JuXCI6IDg5MDUsXG5cdFwiLi9ibi5qc1wiOiA4OTA1LFxuXHRcIi4vYm9cIjogMTE1NjAsXG5cdFwiLi9iby5qc1wiOiAxMTU2MCxcblx0XCIuL2JyXCI6IDEyNzgsXG5cdFwiLi9ici5qc1wiOiAxMjc4LFxuXHRcIi4vYnNcIjogODA2MjIsXG5cdFwiLi9icy5qc1wiOiA4MDYyMixcblx0XCIuL2NhXCI6IDI0NjgsXG5cdFwiLi9jYS5qc1wiOiAyNDY4LFxuXHRcIi4vY3NcIjogNTgyMixcblx0XCIuL2NzLmpzXCI6IDU4MjIsXG5cdFwiLi9jdlwiOiA1MDg3Nyxcblx0XCIuL2N2LmpzXCI6IDUwODc3LFxuXHRcIi4vY3lcIjogNDczNzMsXG5cdFwiLi9jeS5qc1wiOiA0NzM3Myxcblx0XCIuL2RhXCI6IDI0NzgwLFxuXHRcIi4vZGEuanNcIjogMjQ3ODAsXG5cdFwiLi9kZVwiOiA1OTc0MCxcblx0XCIuL2RlLWF0XCI6IDYwMjE3LFxuXHRcIi4vZGUtYXQuanNcIjogNjAyMTcsXG5cdFwiLi9kZS1jaFwiOiA2MDg5NCxcblx0XCIuL2RlLWNoLmpzXCI6IDYwODk0LFxuXHRcIi4vZGUuanNcIjogNTk3NDAsXG5cdFwiLi9kdlwiOiA1MzAwLFxuXHRcIi4vZHYuanNcIjogNTMwMCxcblx0XCIuL2VsXCI6IDUwODM3LFxuXHRcIi4vZWwuanNcIjogNTA4MzcsXG5cdFwiLi9lbi1hdVwiOiA3ODM0OCxcblx0XCIuL2VuLWF1LmpzXCI6IDc4MzQ4LFxuXHRcIi4vZW4tY2FcIjogNzc5MjUsXG5cdFwiLi9lbi1jYS5qc1wiOiA3NzkyNSxcblx0XCIuL2VuLWdiXCI6IDIyMjQzLFxuXHRcIi4vZW4tZ2IuanNcIjogMjIyNDMsXG5cdFwiLi9lbi1pZVwiOiA0NjQzNixcblx0XCIuL2VuLWllLmpzXCI6IDQ2NDM2LFxuXHRcIi4vZW4tbnpcIjogNzYzMTksXG5cdFwiLi9lbi1uei5qc1wiOiA3NjMxOSxcblx0XCIuL2VvXCI6IDkyOTE1LFxuXHRcIi4vZW8uanNcIjogOTI5MTUsXG5cdFwiLi9lc1wiOiA1NTY1NSxcblx0XCIuL2VzLWRvXCI6IDU1MjUxLFxuXHRcIi4vZXMtZG8uanNcIjogNTUyNTEsXG5cdFwiLi9lcy11c1wiOiA3MTE0Nixcblx0XCIuL2VzLXVzLmpzXCI6IDcxMTQ2LFxuXHRcIi4vZXMuanNcIjogNTU2NTUsXG5cdFwiLi9ldFwiOiA1NjAzLFxuXHRcIi4vZXQuanNcIjogNTYwMyxcblx0XCIuL2V1XCI6IDc3NzYzLFxuXHRcIi4vZXUuanNcIjogNzc3NjMsXG5cdFwiLi9mYVwiOiA3Njk1OSxcblx0XCIuL2ZhLmpzXCI6IDc2OTU5LFxuXHRcIi4vZmlcIjogMTE4OTcsXG5cdFwiLi9maS5qc1wiOiAxMTg5Nyxcblx0XCIuL2ZvXCI6IDk0Njk0LFxuXHRcIi4vZm8uanNcIjogOTQ2OTQsXG5cdFwiLi9mclwiOiA5NDQ3MCxcblx0XCIuL2ZyLWNhXCI6IDYzMDQ5LFxuXHRcIi4vZnItY2EuanNcIjogNjMwNDksXG5cdFwiLi9mci1jaFwiOiA1MjMzMCxcblx0XCIuL2ZyLWNoLmpzXCI6IDUyMzMwLFxuXHRcIi4vZnIuanNcIjogOTQ0NzAsXG5cdFwiLi9meVwiOiA1MDQ0LFxuXHRcIi4vZnkuanNcIjogNTA0NCxcblx0XCIuL2dkXCI6IDIxMDEsXG5cdFwiLi9nZC5qc1wiOiAyMTAxLFxuXHRcIi4vZ2xcIjogMzg3OTQsXG5cdFwiLi9nbC5qc1wiOiAzODc5NCxcblx0XCIuL2dvbS1sYXRuXCI6IDIzMTY4LFxuXHRcIi4vZ29tLWxhdG4uanNcIjogMjMxNjgsXG5cdFwiLi9ndVwiOiA5NTM0OSxcblx0XCIuL2d1LmpzXCI6IDk1MzQ5LFxuXHRcIi4vaGVcIjogMjQyMDYsXG5cdFwiLi9oZS5qc1wiOiAyNDIwNixcblx0XCIuL2hpXCI6IDMwMDk0LFxuXHRcIi4vaGkuanNcIjogMzAwOTQsXG5cdFwiLi9oclwiOiAzMDMxNixcblx0XCIuL2hyLmpzXCI6IDMwMzE2LFxuXHRcIi4vaHVcIjogMjIxMzgsXG5cdFwiLi9odS5qc1wiOiAyMjEzOCxcblx0XCIuL2h5LWFtXCI6IDExNDIzLFxuXHRcIi4vaHktYW0uanNcIjogMTE0MjMsXG5cdFwiLi9pZFwiOiAyOTIxOCxcblx0XCIuL2lkLmpzXCI6IDI5MjE4LFxuXHRcIi4vaXNcIjogOTAxMzUsXG5cdFwiLi9pcy5qc1wiOiA5MDEzNSxcblx0XCIuL2l0XCI6IDkwNjI2LFxuXHRcIi4vaXQuanNcIjogOTA2MjYsXG5cdFwiLi9qYVwiOiAzOTE4Myxcblx0XCIuL2phLmpzXCI6IDM5MTgzLFxuXHRcIi4vanZcIjogMjQyODYsXG5cdFwiLi9qdi5qc1wiOiAyNDI4Nixcblx0XCIuL2thXCI6IDQwNDE1LFxuXHRcIi4va2EuanNcIjogNDA0MTUsXG5cdFwiLi9ra1wiOiA0Nzc3Mixcblx0XCIuL2trLmpzXCI6IDQ3NzcyLFxuXHRcIi4va21cIjogMTg3NTgsXG5cdFwiLi9rbS5qc1wiOiAxODc1OCxcblx0XCIuL2tuXCI6IDc5MjgyLFxuXHRcIi4va24uanNcIjogNzkyODIsXG5cdFwiLi9rb1wiOiAzMzczMCxcblx0XCIuL2tvLmpzXCI6IDMzNzMwLFxuXHRcIi4va3lcIjogMzMyOTEsXG5cdFwiLi9reS5qc1wiOiAzMzI5MSxcblx0XCIuL2xiXCI6IDM2ODQxLFxuXHRcIi4vbGIuanNcIjogMzY4NDEsXG5cdFwiLi9sb1wiOiA1NTQ2Nixcblx0XCIuL2xvLmpzXCI6IDU1NDY2LFxuXHRcIi4vbHRcIjogNTcwMTAsXG5cdFwiLi9sdC5qc1wiOiA1NzAxMCxcblx0XCIuL2x2XCI6IDM3NTk1LFxuXHRcIi4vbHYuanNcIjogMzc1OTUsXG5cdFwiLi9tZVwiOiAzOTg2MSxcblx0XCIuL21lLmpzXCI6IDM5ODYxLFxuXHRcIi4vbWlcIjogMzU0OTMsXG5cdFwiLi9taS5qc1wiOiAzNTQ5Myxcblx0XCIuL21rXCI6IDk1OTY2LFxuXHRcIi4vbWsuanNcIjogOTU5NjYsXG5cdFwiLi9tbFwiOiA4NzM0MSxcblx0XCIuL21sLmpzXCI6IDg3MzQxLFxuXHRcIi4vbXJcIjogMTAzNzAsXG5cdFwiLi9tci5qc1wiOiAxMDM3MCxcblx0XCIuL21zXCI6IDk4NDcsXG5cdFwiLi9tcy1teVwiOiA0MTIzNyxcblx0XCIuL21zLW15LmpzXCI6IDQxMjM3LFxuXHRcIi4vbXMuanNcIjogOTg0Nyxcblx0XCIuL210XCI6IDcyMTI2LFxuXHRcIi4vbXQuanNcIjogNzIxMjYsXG5cdFwiLi9teVwiOiA1NjE2NSxcblx0XCIuL215LmpzXCI6IDU2MTY1LFxuXHRcIi4vbmJcIjogNjQ5MjQsXG5cdFwiLi9uYi5qc1wiOiA2NDkyNCxcblx0XCIuL25lXCI6IDE2NzQ0LFxuXHRcIi4vbmUuanNcIjogMTY3NDQsXG5cdFwiLi9ubFwiOiA5MzkwMSxcblx0XCIuL25sLWJlXCI6IDU5ODE0LFxuXHRcIi4vbmwtYmUuanNcIjogNTk4MTQsXG5cdFwiLi9ubC5qc1wiOiA5MzkwMSxcblx0XCIuL25uXCI6IDgzODc3LFxuXHRcIi4vbm4uanNcIjogODM4NzcsXG5cdFwiLi9wYS1pblwiOiAxNTg1OCxcblx0XCIuL3BhLWluLmpzXCI6IDE1ODU4LFxuXHRcIi4vcGxcIjogNjQ0OTUsXG5cdFwiLi9wbC5qc1wiOiA2NDQ5NSxcblx0XCIuL3B0XCI6IDg5NTIwLFxuXHRcIi4vcHQtYnJcIjogNTc5NzEsXG5cdFwiLi9wdC1ici5qc1wiOiA1Nzk3MSxcblx0XCIuL3B0LmpzXCI6IDg5NTIwLFxuXHRcIi4vcm9cIjogOTY0NTksXG5cdFwiLi9yby5qc1wiOiA5NjQ1OSxcblx0XCIuL3J1XCI6IDIxNzkzLFxuXHRcIi4vcnUuanNcIjogMjE3OTMsXG5cdFwiLi9zZFwiOiA0MDk1MCxcblx0XCIuL3NkLmpzXCI6IDQwOTUwLFxuXHRcIi4vc2VcIjogMTA0OTAsXG5cdFwiLi9zZS5qc1wiOiAxMDQ5MCxcblx0XCIuL3NpXCI6IDkwMTI0LFxuXHRcIi4vc2kuanNcIjogOTAxMjQsXG5cdFwiLi9za1wiOiA2NDI0OSxcblx0XCIuL3NrLmpzXCI6IDY0MjQ5LFxuXHRcIi4vc2xcIjogMTQ5ODUsXG5cdFwiLi9zbC5qc1wiOiAxNDk4NSxcblx0XCIuL3NxXCI6IDUxMTA0LFxuXHRcIi4vc3EuanNcIjogNTExMDQsXG5cdFwiLi9zclwiOiA0OTEzMSxcblx0XCIuL3NyLWN5cmxcIjogMTM3MDksXG5cdFwiLi9zci1jeXJsLmpzXCI6IDEzNzA5LFxuXHRcIi4vc3IuanNcIjogNDkxMzEsXG5cdFwiLi9zc1wiOiA4NTg5Myxcblx0XCIuL3NzLmpzXCI6IDg1ODkzLFxuXHRcIi4vc3ZcIjogOTg3NjAsXG5cdFwiLi9zdi5qc1wiOiA5ODc2MCxcblx0XCIuL3N3XCI6IDkxMTcyLFxuXHRcIi4vc3cuanNcIjogOTExNzIsXG5cdFwiLi90YVwiOiAyNzMzMyxcblx0XCIuL3RhLmpzXCI6IDI3MzMzLFxuXHRcIi4vdGVcIjogMjMxMTAsXG5cdFwiLi90ZS5qc1wiOiAyMzExMCxcblx0XCIuL3RldFwiOiA1MjA5NSxcblx0XCIuL3RldC5qc1wiOiA1MjA5NSxcblx0XCIuL3RoXCI6IDkwNDEsXG5cdFwiLi90aC5qc1wiOiA5MDQxLFxuXHRcIi4vdGwtcGhcIjogNzU3NjgsXG5cdFwiLi90bC1waC5qc1wiOiA3NTc2OCxcblx0XCIuL3RsaFwiOiA4OTQ0NCxcblx0XCIuL3RsaC5qc1wiOiA4OTQ0NCxcblx0XCIuL3RyXCI6IDcyMzk3LFxuXHRcIi4vdHIuanNcIjogNzIzOTcsXG5cdFwiLi90emxcIjogMjgyNTQsXG5cdFwiLi90emwuanNcIjogMjgyNTQsXG5cdFwiLi90em1cIjogNTExMDYsXG5cdFwiLi90em0tbGF0blwiOiAzMDY5OSxcblx0XCIuL3R6bS1sYXRuLmpzXCI6IDMwNjk5LFxuXHRcIi4vdHptLmpzXCI6IDUxMTA2LFxuXHRcIi4vdWtcIjogNjc2OTEsXG5cdFwiLi91ay5qc1wiOiA2NzY5MSxcblx0XCIuL3VyXCI6IDEzNzk1LFxuXHRcIi4vdXIuanNcIjogMTM3OTUsXG5cdFwiLi91elwiOiA2NzkxLFxuXHRcIi4vdXotbGF0blwiOiA2MDU4OCxcblx0XCIuL3V6LWxhdG4uanNcIjogNjA1ODgsXG5cdFwiLi91ei5qc1wiOiA2NzkxLFxuXHRcIi4vdmlcIjogNjU2NjYsXG5cdFwiLi92aS5qc1wiOiA2NTY2Nixcblx0XCIuL3gtcHNldWRvXCI6IDE0Mzc4LFxuXHRcIi4veC1wc2V1ZG8uanNcIjogMTQzNzgsXG5cdFwiLi95b1wiOiA3NTgwNSxcblx0XCIuL3lvLmpzXCI6IDc1ODA1LFxuXHRcIi4vemgtY25cIjogODM4MzksXG5cdFwiLi96aC1jbi5qc1wiOiA4MzgzOSxcblx0XCIuL3poLWhrXCI6IDU1NzI2LFxuXHRcIi4vemgtaGsuanNcIjogNTU3MjYsXG5cdFwiLi96aC10d1wiOiA3NDE1Mixcblx0XCIuL3poLXR3LmpzXCI6IDc0MTUyXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gNDY3MDA7IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hY3RpdmVjb2RlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5pbXBvcnQgSlNBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfanMuanNcIjtcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWwuanNcIjtcbmltcG9ydCBTUUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfc3FsLmpzXCI7XG5pbXBvcnQgQnJ5dGhvbkFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9icnl0aG9uLmpzXCI7XG5pbXBvcnQgTGl2ZUNvZGUgZnJvbSBcIi4vbGl2ZWNvZGUuanNcIjtcbmltcG9ydCB7XG4gICAgVGltZWRBY3RpdmVDb2RlLFxuICAgIFRpbWVkTGl2ZUNvZGUsXG4gICAgVGltZWRKU0FjdGl2ZUNvZGUsXG4gICAgVGltZWRIVE1MQWN0aXZlQ29kZSxcbiAgICBUaW1lZFNRTEFjdGl2ZUNvZGUsXG4gICAgVGltZWRCcnl0aG9uQWN0aXZlQ29kZSxcbn0gZnJvbSBcIi4vdGltZWRfYWN0aXZlY29kZVwiO1xuaW1wb3J0IFwiLi4vLi4vY29tbW9uL2pzL2pxdWVyeS5oaWdobGlnaHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQUNGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mb28gPSBcImJhclwiO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQWN0aXZlQ29kZShvcmlnLCBsYW5nLCBhZGRvcHRzKSB7XG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogb3JpZyxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgICAgIHB5dGhvbjM6IGVCb29rQ29uZmlnLnB5dGhvbjMsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhZGRvcHRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBhdHRybmFtZSBpbiBhZGRvcHRzKSB7XG4gICAgICAgICAgICAgICAgb3B0c1thdHRybmFtZV0gPSBhZGRvcHRzW2F0dHJuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFuZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYW5nID0gJChvcHRzLm9yaWcpLmZpbmQoXCJbZGF0YS1sYW5nXVwiKS5kYXRhKFwibGFuZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGV4dF9hcmVhID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXVxuICAgICAgICB2YXIgcHl0aG9uM19pbnRlcnByZXRlciA9ICQodGV4dF9hcmVhKS5hdHRyKFwiZGF0YS1weXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICBpZiAob3B0cy50aW1lZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZihweXRob24zX2ludGVycHJldGVyPT09XCJicnl0aG9uXCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRCcnl0aG9uQWN0aXZlQ29kZShvcHRzKTsgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW5nID09PSBcInB5dGhvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiamF2YVwiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjcHBcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiY1wiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJweXRob24zXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRMaXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkSlNBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEhUTUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZFNRTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChsYW5nID09PVwicHl0aG9uM1wiKSAmJiAocHl0aG9uM19pbnRlcnByZXRlciA9PT0gXCJicnl0aG9uXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJyeXRob25BY3RpdmVDb2RlKG9wdHMpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpTQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSFRNTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNRTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIFtcImphdmFcIiwgXCJjcHBcIiwgXCJjXCIsIFwicHl0aG9uM1wiLCBcInB5dGhvbjJcIiwgXCJvY3RhdmVcIl0uaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgbGFuZ1xuICAgICAgICAgICAgICAgICkgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBweXRob25cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSB3ZWIycHkgY29udHJvbGxlcihzKVxuICAgIHN0YXRpYyBhZGRBY3RpdmVDb2RlVG9EaXYob3V0ZXJkaXZpZCwgYWNkaXZpZCwgc2lkLCBpbml0aWFsY29kZSwgbGFuZ3VhZ2UpIHtcbiAgICAgICAgdmFyIHRoZXByZSwgbmV3YWM7XG4gICAgICAgIHZhciBhY2RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjZGl2aWQpO1xuICAgICAgICAkKGFjZGl2KS5lbXB0eSgpO1xuICAgICAgICB0aGVwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgIHRoZXByZVtcImRhdGEtY29tcG9uZW50XCJdID0gXCJhY3RpdmVjb2RlXCI7XG4gICAgICAgIHRoZXByZS5pZCA9IG91dGVyZGl2aWQ7XG4gICAgICAgICQodGhlcHJlKS5kYXRhKFwibGFuZ1wiLCBsYW5ndWFnZSk7XG4gICAgICAgICQoYWNkaXYpLmFwcGVuZCh0aGVwcmUpO1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IHRoZXByZSxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgYWRkb3B0cyA9IHtcbiAgICAgICAgICAgIHNpZDogc2lkLFxuICAgICAgICAgICAgZ3JhZGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAobGFuZ3VhZ2UgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgIGFkZG9wdHNbXCJ2ZXJ0aWNhbFwiXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbmV3YWMgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZSh0aGVwcmUsIGxhbmd1YWdlLCBhZGRvcHRzKTtcbiAgICAgICAgdmFyIHNhdmVkaXYgPSBuZXdhYy5kaXZpZDtcbiAgICAgICAgbmV3YWMuZGl2aWQgPSBzYXZlZGl2O1xuICAgICAgICBuZXdhYy5lZGl0b3Iuc2V0U2l6ZSg1MDAsIDMwMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbmV3YWMuZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUFjdGl2ZUNvZGVGcm9tT3B0cyhvcHRzKSB7XG4gICAgICAgIHJldHVybiBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZShvcHRzLm9yaWcsIG9wdHMubGFuZywgb3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTY3JhdGNoQWN0aXZlY29kZSgpIHtcbiAgICAgICAgLyogc2V0IHVwIHRoZSBzY3JhdGNoIEFjdGl2ZWNvZGUgZWRpdG9yIGluIHRoZSBzZWFyY2ggbWVudSAqL1xuICAgICAgICAvLyB1c2UgdGhlIFVSTCB0byBhc3NpZ24gYSBkaXZpZCAtIGVhY2ggcGFnZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBBY3RpdmVjb2RlIGJsb2NrIGlkLlxuICAgICAgICAvLyBSZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBVUkwgYnV0IHRoZSBjb3Vyc2UgYW5kIHBhZ2UgbmFtZVxuICAgICAgICAvLyB0b2RvOiAgdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBlbGltaW5hdGVkIGFuZCBzaW1wbHkgbW92ZWQgdG8gdGhlIHRlbXBsYXRlIGZpbGVcblxuICAgICAgICBpZiAoZUJvb2tDb25maWcuZW5hYmxlU2NyYXRjaEFDID09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGRpdmlkID0gZUJvb2tDb25maWcuY291cnNlICsgXCJfc2NyYXRjaF9hY1wiO1xuICAgICAgICBkaXZpZCA9IGRpdmlkLnJlcGxhY2UoL1sjLl0vZywgXCJcIik7IC8vIGluIGNhc2UgYm9vayB0aXRsZSBoYXMgY2hhcmFjdGVycyB0aGF0IHdpbGwgbWVzcyB1cCBvdXIgc2VsZWN0b3JzXG4gICAgICAgIGVCb29rQ29uZmlnLnNjcmF0Y2hEaXYgPSBkaXZpZDtcbiAgICAgICAgbGV0IHN0ZGluID0gXCJcIjtcbiAgICAgICAgdmFyIGxhbmcgPSBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgPyBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgOiBcInB5dGhvblwiO1xuICAgICAgICBpZiAobGFuZyA9PT0gXCJqYXZhXCIgfHwgbGFuZyA9PT0gXCJjcHBcIiB8fCBsYW5nID09PSBcInB5dGhvbjNcIikge1xuICAgICAgICAgICAgc3RkaW4gPSBgZGF0YS1zdGRpbj1cInRleHQgZm9yIHN0ZGluXCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBIVE1MXG4gICAgICAgIHZhciBodG1sID0gYDxkaXYgaWQ9XCJhY19tb2RhbF8ke2RpdmlkfVwiIGNsYXNzPVwibW9kYWwgZmFkZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHNjcmF0Y2gtYWMtbW9kYWxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+U2NyYXRjaCBBY3RpdmVDb2RlPC9oND5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1jb21wb25lbnQ9XCJhY3RpdmVjb2RlXCIgaWQ9JHtkaXZpZH0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSR7ZGl2aWR9X3F1ZXN0aW9uIGNsYXNzPVwiYWNfcXVlc3Rpb25cIj48cD5Vc2UgdGhpcyBhcmVhIGZvciB3cml0aW5nIGNvZGUgb3IgdGFraW5nIG5vdGVzLjwvcD48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBkYXRhLWNvZGVsZW5zPVwidHJ1ZVwiIGRhdGEtbGFuZz1cIiR7bGFuZ31cIiAke3N0ZGlufT5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKGVsKTtcbiAgICAgICAgZWwub24oXCJzaG93bi5icy5tb2RhbCBzaG93LmJzLm1vZGFsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsLmZpbmQoXCIuQ29kZU1pcnJvclwiKS5lYWNoKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgZS5Db2RlTWlycm9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICBlLkNvZGVNaXJyb3IuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRvZ2dsZVNjcmF0Y2hBY3RpdmVjb2RlKCkge1xuICAgICAgICB2YXIgZGl2aWQgPSBcImFjX21vZGFsX1wiICsgZUJvb2tDb25maWcuc2NyYXRjaERpdjtcbiAgICAgICAgdmFyIGRpdiA9ICQoXCIjXCIgKyBkaXZpZCk7XG4gICAgICAgICQoYCMke2VCb29rQ29uZmlnLnNjcmF0Y2hEaXZ9YCkucmVtb3ZlQ2xhc3MoXCJhY19zZWN0aW9uXCIpO1xuICAgICAgICBkaXYubW9kYWwoXCJ0b2dnbGVcIik7XG4gICAgfVxufVxuXG4vL1xuLy8gUGFnZSBJbml0aWFsaXphdGlvblxuLy9cblxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgQUNGYWN0b3J5LmNyZWF0ZVNjcmF0Y2hBY3RpdmVjb2RlKCk7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1hY3RpdmVjb2RlXVwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmVkTGlzdFt0aGlzLmlkXSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJ0ZXh0YXJlYVwiKS5kYXRhKFwibGFuZ1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIEFjdGl2ZWNvZGUgUHJvYmxlbSAke3RoaXMuaWR9XG4gICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobG9nZ2Vkb3V0KSB7XG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5kaXNhYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5lbmFibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XG59XG5cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5hY3RpdmVjb2RlID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGVGcm9tT3B0cztcblxuLy8gVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZXhwb3NlIHRoaXMgb3V0c2lkZSB0aGUgbW9kdWxlLlxud2luZG93LkFDRmFjdG9yeSA9IEFDRmFjdG9yeTtcblxuLy8gVGhpcyBzZWVtcyBhIGJpdCBoYWNreSBhbmQgcG9zc2libHkgYnJpdHRsZSwgYnV0IGl0cyBoYXJkIHRvIGtub3cgaG93IGxvbmcgaXQgd2lsbCB0YWtlIHRvXG4vLyBmaWd1cmUgb3V0IHRoZSBsb2dpbi9sb2dvdXQgc3RhdHVzIG9mIHRoZSB1c2VyLiAgU29tZXRpbWVzIGl0cyBpbW1lZGlhdGUsIGFuZCBzb21ldGltZXMgaXRzXG4vLyBsb25nLiAgU28gdG8gYmUgc2FmZSB3ZSdsbCBkbyBpdCBib3RoIHdheXMuLlxudmFyIGxvZ2dlZG91dDtcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9nb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBsb2dnZWRvdXQgPSB0cnVlO1xufSk7XG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ291dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0Lmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmRpc2FibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBlbjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwiTG9hZCBIaXN0b3J5XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwiQXVkaW8gVG91clwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCJMb2FkZWQgeW91ciBzYXZlZCBjb2RlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcIk5vIHNhdmVkIGNvZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIlJ1blwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcIlNob3cgRmVlZGJhY2tcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcIlNob3cgQ29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwiSGlkZSBDb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwiU2hvdyBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcIlNob3cgaW4gQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCJIaWRlIENvZGVsZW5zXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcIkEgcGFyc2UgZXJyb3IgbWVhbnMgdGhhdCBQeXRob24gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgc3ludGF4IG9uIHRoZSBsaW5lIHRoZSBlcnJvciBtZXNzYWdlIHBvaW50cyBvdXQuIENvbW1vbiBleGFtcGxlcyBhcmUgZm9yZ2V0dGluZyBjb21tYXMgYmV0ZXdlZW4gYXJndW1lbnRzIG9yIGZvcmdldHRpbmcgYSA6IG9uIGEgZm9yIHN0YXRlbWVudFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRvIGZpeCBhIHBhcnNlIGVycm9yIHlvdSBqdXN0IG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgdGhlIGxpbmUgd2l0aCB0aGUgZXJyb3IgYW5kIHBvc3NpYmx5IHRoZSBsaW5lIGJlZm9yZSBpdC4gIE1ha2Ugc3VyZSBpdCBjb25mb3JtcyB0byBhbGwgb2YgUHl0aG9uJ3MgcnVsZXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3I6XG4gICAgICAgICAgICBcIlR5cGUgZXJyb3JzIG1vc3Qgb2Z0ZW4gb2NjdXIgd2hlbiBhbiBleHByZXNzaW9uIHRyaWVzIHRvIGNvbWJpbmUgdHdvIG9iamVjdHMgd2l0aCB0eXBlcyB0aGF0IHNob3VsZCBub3QgYmUgY29tYmluZWQuICBMaWtlIHJhaXNpbmcgYSBzdHJpbmcgdG8gYSBwb3dlclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVG8gZml4IGEgdHlwZSBlcnJvciB5b3Ugd2lsbCBtb3N0IGxpa2VseSBuZWVkIHRvIHRyYWNlIHRocm91Z2ggeW91ciBjb2RlIGFuZCBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBoYXZlIHRoZSB0eXBlcyB5b3UgZXhwZWN0IHRoZW0gdG8gaGF2ZS4gIEl0IG1heSBiZSBoZWxwZnVsIHRvIHByaW50IG91dCBlYWNoIHZhcmlhYmxlIGFsb25nIHRoZSB3YXkgdG8gYmUgc3VyZSBpdHMgdmFsdWUgaXMgd2hhdCB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxuICAgICAgICAgICAgXCJBIG5hbWUgZXJyb3IgYWxtb3N0IGFsd2F5cyBtZWFucyB0aGF0IHlvdSBoYXZlIHVzZWQgYSB2YXJpYWJsZSBiZWZvcmUgaXQgaGFzIGEgdmFsdWUuICBPZnRlbiB0aGlzIG1heSBiZSBhIHNpbXBsZSB0eXBvLCBzbyBjaGVjayB0aGUgc3BlbGxpbmcgY2FyZWZ1bGx5LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIHlvdXIgZnVuY3Rpb24gY2FsbHMsIHRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciBhIE5hbWVFcnJvciB0byBiZSBmb3VuZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3I6XG4gICAgICAgICAgICBcIkEgVmFsdWVFcnJvciBtb3N0IG9mdGVuIG9jY3VycyB3aGVuIHlvdSBwYXNzIGEgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBpcyBleHBlY3Rpbmcgb25lIHR5cGUgYW5kIHlvdSBwYXNzIGFub3RoZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhlIGVycm9yIG1lc3NhZ2UgZ2l2ZXMgeW91IGEgcHJldHR5IGdvb2QgaGludCBhYm91dCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgdmFsdWUgdGhhdCBpcyBpbmNvcnJlY3QuIExvb2sgYXQgdGhlIGVycm9yIG1lc3NhZ2UgY2xvc2VseSBhbmQgdGhlbiB0cmFjZSBiYWNrIHRvIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBwcm9ibGVtYXRpYyB2YWx1ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG1lc3NhZ2UgaXMgdGVsbGluZyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90LCBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGUgb3IgbWV0aG9kIG9uIHRoZSByaWdodCBoYW5kIHNpZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoZSBtb3N0IGNvbW1vbiB2YXJpYW50IG9mIHRoaXMgbWVzc2FnZSBpcyB0aGF0IHRoZSBvYmplY3QgdW5kZWZpbmVkIGRvZXMgbm90IGhhdmUgYXR0cmlidXRlIFguICBUaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBkb3QgaXMgbm90IHdoYXQgeW91IHRoaW5rLiBUcmFjZSB0aGUgdmFyaWFibGUgYmFjayBhbmQgcHJpbnQgaXQgb3V0IGluIHZhcmlvdXMgcGxhY2VzIHVudGlsIHlvdSBkaXNjb3ZlciB3aGVyZSBpdCBiZWNvbWVzIHVuZGVmaW5lZC4gIE90aGVyd2lzZSBjaGVjayB0aGUgYXR0cmlidXRlIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGRvdCBmb3IgYSB0eXBvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcbiAgICAgICAgICAgIFwiTW9zdCBvZiB0aGUgdGltZSB0aGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGZvcmdvdHRlbiBhIHJpZ2h0IHBhcmVudGhlc2lzIG9yIGhhdmUgZm9yZ290dGVuIHRvIGNsb3NlIGEgcGFpciBvZiBxdW90ZXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgZWFjaCBsaW5lIG9mIHlvdXIgcHJvZ3JhbSBhbmQgbWFrZSBzdXJlIHRoYXQgeW91ciBwYXJlbnRoZXNpcyBhcmUgYmFsYW5jZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3I6XG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIHRvbyBsb25nLiAgTW9zdCBwcm9ncmFtcyBpbiB0aGlzIGJvb2sgc2hvdWxkIHJ1biBpbiBsZXNzIHRoYW4gMTAgc2Vjb25kcyBlYXNpbHkuIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbml0ZSBsb29wLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQWRkIHNvbWUgcHJpbnQgc3RhdGVtZW50cyB0byBmaWd1cmUgb3V0IGlmIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbnRlIGxvb3AuICBJZiBpdCBpcyBub3QgeW91IGNhbiBpbmNyZWFzZSB0aGUgcnVuIHRpbWUgd2l0aCBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXNlY3MpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIGZvciB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDMwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkFkZCBzb21lIHByaW50IHN0YXRlbWVudHMgdG8gZmlndXJlIG91dCBpZiB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW50ZSBsb29wLiAgSWYgaXQgaXMgbm90IHlvdSBjYW4gaW5jcmVhc2UgdGhlIHJ1biB0aW1lIHdpdGggc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zZWNzKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCBQeXRob24gY2FuJ3QgZmlndXJlIG91dCB0aGUgc3ludGF4IG9mIGEgcGFydGljdWxhciBzdGF0ZW1lbnQuICBTb21lIGV4YW1wbGVzIGFyZSBhc3NpZ25pbmcgdG8gYSBsaXRlcmFsLCBvciBhIGZ1bmN0aW9uIGNhbGxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudCBpcyBhIHZhcmlhYmxlLCBub3QgYSBsaXRlcmFsIG9yIGEgZnVuY3Rpb24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhbiBlbGVtZW50IG9mIGEgZGljdGlvbmFyeSwgYnV0IHRoZSBkaWN0aW9uYXJ5IGRvZXMgbm90IGhhdmUgdGhhdCB0aGUga2V5IHlvdSBhcmUgdXNpbmcuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIllvdSBtYXkgaGF2ZSBhIHR5cG8gaW4gdGhlIG5hbWUgb2YgeW91ciBrZXkuICBJdCBpcyBhbHNvIGdvb2QgcHJhY3RpY2UgdG8gY2hlY2sgaWYgdGhlIGtleSBleGlzdHMgdXNpbmcgYSBzdGF0ZW1lbnQgbGlrZSBpZiBrZXkgaW4gbXlkaWN0LiAgWW91IGNhbiBhbHNvIHVzZSBteWRpY3QuZ2V0KGtleSxkZWZhdWx0dmFsdWUpIHNvIHRoYXQgaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkgeW91IGdldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVycm9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIG1lYW5zIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW5kZXggcGFzdCB0aGUgZW5kIG9mIGEgc3RyaW5nIG9yIGEgbGlzdC4gIEZvciBleGFtcGxlIGlmIHlvdXIgbGlzdCBoYXMgMyB0aGluZ3MgaW4gaXQgYW5kIHlvdSB0cnkgdG8gYWNjZXNzIHRoZSBpdGVtIGF0IHBvc2l0aW9uIDMgb3IgbW9yZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBpdGVtIGluIGEgbGlzdCBvciBzdHJpbmcgaXMgYXQgaW5kZXggcG9zaXRpb24gMCwgcXVpdGUgb2Z0ZW4gdGhpcyBtZXNzYWdlIGNvbWVzIGFib3V0IGJlY2F1c2UgeW91IGFyZSBvZmYgYnkgb25lLiAgUmVtZW1iZXIgaW4gYSBsaXN0IG9mIGxlbmd0aCAzIHRoZSBsYXN0IGxlZ2FsIGluZGV4IGlzIDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4OiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJPbmUgcHJvYmxlbSBtYXkgc2ltcGx5IGJlIHRoYXQgeW91IGhhdmUgYSB0eXBvLiAgSXQgbWF5IGFsc28gYmUgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBleGlzdHMgaW4gJ3JlYWwnIFB5dGhvbiwgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYm9vay4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHBsZWFzZSBzdWJtaXQgYSBmZWF0dXJlIHJlcXVlc3QgdG8gaGF2ZSB0aGUgbW9kdWxlIGFkZGVkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gaW50ZXJuYWwgZXJyb3IsIHBhcnRpY3VsYXJseSBpZiB0aGUgbWVzc2FnZSByZWZlcmVuY2VzIHRoZSBjb25zb2xlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUcnkgcmVmcmVzaGluZyB0aGUgd2VicGFnZSwgYW5kIGlmIHRoZSBlcnJvciBjb250aW51ZXMsIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgYWxvbmcgd2l0aCB5b3VyIGNvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyB0ZWxscyB5b3UgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBkaXZpZGUgYnkgMC4gVHlwaWNhbGx5IHRoaXMgaXMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBkZW5vbWluYXRvciBvZiBhIGRpdmlzaW9uIGV4cHJlc3Npb24gaGFzIHRoZSB2YWx1ZSAwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJZb3UgbWF5IG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGRpdmlkaW5nIGJ5IDAgd2l0aCBhbiBpZiBzdGF0bWVudCwgb3IgeW91IG1heSBuZWVkIHRvIHJleGFtaW5lIHlvdXIgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGxlZ2FsIHZhbHVlcyBvZiB2YXJpYWJsZXMsIGl0IGNvdWxkIGJlIGFuIGVhcmxpZXIgc3RhdG1lbnQgdGhhdCBpcyB1bmV4cGVjdGVkbHkgYXNzaWduaW5nIGEgdmFsdWUgb2YgemVybyB0byB0aGUgdmFyaWFibGUgaW4gcXVlc3Rpb24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgYWxtb3N0IGFsd2F5cyBzaG93cyB1cCBpbiB0aGUgZm9ybSBvZiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGlzIGFsd2F5cyBvY2N1cnMgd2hlbiBhIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZi4gIEl0cyBwcmV0dHkgbGlrZWx5IHRoYXQgeW91IGFyZSBub3QgZG9pbmcgdGhpcyBvbiBwdXJwb3NlLiBFeGNlcHQgaW4gdGhlIGNoYXB0ZXIgb24gcmVjdXJzaW9uLiAgSWYgeW91IGFyZSBpbiB0aGF0IGNoYXB0ZXIgdGhlbiBpdHMgbGlrZWx5IHlvdSBoYXZlbid0IGlkZW50aWZpZWQgYSBnb29kIGJhc2UgY2FzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3I6XG4gICAgICAgICAgICBcIkFuIEludGVybmFsIGVycm9yIG1heSBtZWFuIHRoYXQgeW91J3ZlIHRyaWdnZXJlZCBhIGJ1ZyBpbiBvdXIgUHl0aG9uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVwb3J0IHRoaXMgZXJyb3IsIGFsb25nIHdpdGggeW91ciBjb2RlIGFzIGEgYnVnLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgaGF2ZSBub3QgaW5kZW50ZWQgeW91ciBjb2RlIHByb3Blcmx5LiAgVGhpcyBpcyBtb3N0IGxpa2VseSB0byBoYXBwZW4gYXMgcGFydCBvZiBhbiBpZiwgZm9yLCB3aGlsZSBvciBkZWYgc3RhdGVtZW50LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHlvdXIgaWYsIGRlZiwgZm9yLCBhbmQgd2hpbGUgc3RhdGVtZW50cyB0byBiZSBzdXJlIHRoZSBsaW5lcyBhcmUgcHJvcGVybHkgaW5kZW50ZWQgYmVuZWF0aCB0aGVtLiAgQW5vdGhlciBzb3VyY2Ugb2YgdGhpcyBlcnJvciBjb21lcyBmcm9tIGNvcHlpbmcgYW5kIHBhc3RpbmcgY29kZSB3aGVyZSB5b3UgaGF2ZSBhY2NpZGVudGFsbHkgbGVmdCBzb21lIGJpdHMgb2YgY29kZSBseWluZyBhcm91bmQgdGhhdCBkb24ndCBiZWxvbmcgdGhlcmUgYW55bW9yZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSB0cnkgdG8gdXNlIGEgYnVpbHRpbiBmdW5jdGlvbiBvZiBQeXRob24gdGhhdCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhpcyBpbi1icm93c2VyIHZlcnNpb24gb2YgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJGb3Igbm93IHRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byBub3QgdXNlIHRoZSBmdW5jdGlvbi4gIFRoZXJlIG1heSBiZSB3b3JrYXJvdW5kcy4gIElmIHlvdSByZWFsbHkgbmVlZCB0aGlzIGJ1aWx0aW4gZnVuY3Rpb24gdGhlbiBmaWxlIGEgYnVnIHJlcG9ydCBhbmQgdGVsbCB1cyBob3cgeW91IGFyZSB0cnlpbmcgdG8gdXNlIHRoZSBmdW5jdGlvbi5cIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZDogXCJGaWxlIG5vdCBmb3VuZDogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcbiAgICAgICAgICAgIFwiW0Vycm5vIDJdIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmc6IFwiQ2xpY2sgdGhlIHBsYXkgYnV0dG9uIHRvIGJlZ2luIHRoZSAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIlBsYXlpbmcgdGhlICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW86XG4gICAgICAgICAgICBcIkxvYWRpbmcgYXVkaW8uICBQbGVhc2Ugd2FpdC4gICBJZiB0aGUgdG91ciBkb2Vzbid0IHN0YXJ0IHNvb24gY2xpY2sgb24gdGhlIGxlZnRtb3N0IGNvbnRyb2wgYnV0dG9uIChQbGF5IGZpcnN0IGF1ZGlvIGluIHRvdXIpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2UgY3VycmVudCBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzZSBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpbzogXCJQbGF5IHBhdXNlZCBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWQ6XG4gICAgICAgICAgICBcIlRoZSAkMSBoYXMgYmVlbiBwYXVzZWQuIENsaWNrIG9uIHRoZSBwbGF5IGJ1dHRvbiB0byByZXN1bWUgdGhlIHRvdXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2lucHV0X3ByZzogXCJJbnB1dCBmb3IgUHJvZ3JhbVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XG4gICAgICAgICAgICBcIlRoZXJlIHdlcmUgZXJyb3JzIGNvbXBpbGluZyB5b3VyIGNvZGUuIFNlZSBiZWxvdy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGM6IFwiVGltZSBMaW1pdCBFeGNlZWRlZCBvbiB5b3VyIHByb2dyYW1cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VycjogXCJBIHNlcnZlciBlcnJvciBvY2N1cnJlZDogJDEgJDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XG4gICAgICAgICAgICBcIkNvbXBpbGluZyBhbmQgUnVubmluZyB5b3VyIENvZGUgTm93Li4uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2F2ZSAmIFJ1blwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZW5kZXI6IFwiU2F2ZSAmIFJlbmRlclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIkFuIGFzc2VydGlvbiBlcnJvciBoYXBwZW5zIHdoZW4gcHl0aG9uIGVuY291bnRlcnMgYW4gYXNzZXJ0aW9uIHN0YXRlbWVudC4gIFB5dGhvbiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSB3b3JkIGFzc2VydDsgaWYgdGhhdCBleHByZXNzaW9uIGlzIFRydWUgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCB0aGUgcHJvZ3JhbSBjb250aW51ZXMuICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBQeXRob24gcmFpc2VzIGFuIGVycm9yIGFuZCBzdG9wcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIGFzc2VydC4gIFRoZSBleHByZXNzaW9uIGlzIEZhbHNlIGFuZCB5b3Ugd2lsbCBuZWVkIHRvIGRldGVybWluZSB3aHkgdGhhdCBpcy4gIFlvdSBtYXkgd2FudCB0byBzaW1wbHkgcHJpbnQgb3V0IHRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBleHByZXNzaW9uIHRvIHVuZGVyc3RhbmQgd2h5IGl0IGlzIGV2YWx1YXRpbmcgdG8gRmFsc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiTG9hZGluZyBEQi4uLlwiLFxuICAgIH0sXG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIFwicHQtYnJcIjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwiQ2FycmVnYXIgaGlzdMOzcmljb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIlRvdXIgZGUgw6F1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcIkPDs2RpZ28gc2Fsdm8gY2FycmVnYWRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcIk7Do28gaMOhIGPDs2RpZ28gc2Fsdm8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIkV4ZWN1dGFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwiRXhpYmlyIEZlZWRiYWNrc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwiTW9zdHJhciBDw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCJPY3VsdGFyIEPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCJNb3N0cmFyIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwiTW9zdHJhciBlbSBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcIk9jdWx0YXIgQ29kZWxlbnNcIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBQYXJzZSBzaWduaWZpY2EgcXVlIFB5dGhvbiBuw6NvIGVudGVuZGUgYSBzaW50YXhlIGRhIGxpbmhhIHF1ZSBhIG1lbnNhZ2VtIGRlIGVycm8gYXBvbnRhLiBFeGVtcGxvcyBjb211bnMgc8OjbyBlc3F1ZWNlciB2w61yZ3VsYXMgZW50cmUgYXJndW1lbnRvcyBvdSBlc3F1ZWNlciAnOicgZW0gdW0gY29tYW5kbyBmb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIFBhcnNlLCB2b2PDqiBzw7MgcHJlY2lzYSBvbGhhciBjdWlkYWRvc2FtZW50ZSBhIGxpbmhhIGNvbSBvIGVycm8gZSBwb3NzaXZlbG1lbnRlIGEgbGluaGEgYW50ZXMgZGVsYS4gVGVuaGEgY2VydGV6YSBxdWUgZXN0w6NvIGRlIGFjb3JkbyBjb20gdG9kYXMgYXMgcmVncmFzIGRlIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXJyb3MgZGUgdGlwYWdlbSBvY29ycmVtIG1haXMgZnJlcXVlbnRlbWVudGUgcXVhbmRvIHVtYSBleHByZXNzw6NvIHRlbnRhIGNvbWJpbmFyIGRvaXMgb2JqZXRvcyBjb20gdGlwb3MgcXVlIG7Do28gZGV2ZXJpYW0gc2VyIGNvbWJpbmFkb3MuIENvbW8gZWxldmFyIHVtYSBTdHJpbmcgYSB1bWEgcG90w6puY2lhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIHRpcGFnZW0gdm9jw6ogcHJvdmF2ZWxtZW50ZSBwcmVjaXNhcsOhIHBlcmNvcnJlciBzZXUgY8OzZGlnbyBlIHRlciBjZXJ0ZXphIGRlIHF1ZSBhcyB2YXJpw6F2ZWlzIHBvc3N1ZW0gb3MgdGlwb3MgcXVlIHZvY8OqIGVzcGVyYSBxdWUgZWxhcyB0ZW5oYW0uIFBvZGUgc2VyIMO6dGlsIGltcHJpbWlyIGNhZGEgdmFyacOhdmVsIGFvIGxvbmdvIGRvIGNhbWluaG8gcGFyYSBjaGVjYXIgc2UgZWxhcyBwb3NzdWVtIG8gdmFsb3IgcXVlIHZvY8OqIGFjaGEgcXVlIGRldmVyaWFtIHRlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBub21lIHF1YXNlIHNlbXByZSBzaWduaWZpY2EgcXVlIHZvY8OqIHVzb3UgdW1hIHZhcmnDoXZlbCBhbnRlcyBkZWxhIHRlciB1bSB2YWxvci4gRnJlcXVlbnRlbWVudGUgaXNzbyBwb2RlIHNlciB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvLCBlbnTDo28gY2hlcXVlIGEgb3J0b2dyYWZpYSBjdWlkYWRvc2FtZW50ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBvIGxhZG8gZGlyZWl0byBkYXMgYXRyaWJ1acOnw7VlcyBlIHN1YXMgY2hhbWFkYXMgZGUgZnVuw6fDtWVzLCBzw6NvIG9zIGx1Z2FyZXMgbWFpcyBwcm92w6F2ZWlzIGRlIGVuY29udHJhciB1bSBlcnJvIGRlIG5vbWUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIHZhbG9yIG9jb3JyZSBtYWlzIGZyZXF1ZW50ZW1lbnRlIHF1YW5kbyB1bWEgZnVuw6fDo28gZXN0w6EgZXNwZXJhbmRvIHVtIHRpcG8gbWFzIHZvY8OqIHBhc3NhIHVtIHBhcsOibWV0cm8gZGUgb3V0cm8gdGlwby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBIG1lbnNhZ2VtIGRlIGVycm8gdGUgZMOhIHVtYSBib2EgZGljYSBzb2JyZSBvIG5vbWUgZGEgZnVuw6fDo28gZSBvIHZhbG9yIGluY29ycmV0by4gTGVpYSBhdGVudGFtZW50ZSBhIG1lbnNhZ2VtIGRlIGVycm8gZSB2b2x0ZSDDoCB2YXJpw6F2ZWwgcXVlIGNvbnTDqW0gbyB2YWxvciBwcm9ibGVtw6F0aWNvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3I6XG4gICAgICAgICAgICBcIkVzc2EgbWVuc2FnZW0gZGUgZXJybyBlc3TDoSB0ZSBkaXplbmRvIHF1ZSBvIG9iamV0byBkbyBsYWRvIGVzcXVlcmRvIGRvIHBvbnRvIG7Do28gdGVtIG8gYXRyaWJ1dG8gb3UgbcOpdG9kbyBkbyBzZXUgbGFkbyBkaXJlaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBIHZhcmlhbnRlIG1haXMgY29tdW0gZGVzc2EgbWVuc2FnZW0gw6kgcXVlIG8gb2JqZXRvIGluZGVmaW5pZG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBYLiBJc3NvIGRpeiBxdWUgbyBvYmpldG8gZG8gbGFkbyBlc3F1ZXJkbyBkbyBwb250byBuw6NvIMOpIG8gcXVlIHZvY8OqIHBlbnNhLiBSYXN0cmVpZSBlc3NhIHZhcmnDoXZlbCBlIGltcHJpbWEtYSBlbSB2w6FyaW9zIGx1Z2FyZXMgYXTDqSBkZXNjb2JyaXIgb25kZSBlbGEgc2UgdG9ybmEgaW5kZWZpbmlkYS4gQ2FzbyBjb250csOhcmlvLCBjaGVxdWUgc2UgaMOhIGVycm8gZGUgZGlnaXRhw6fDo28gbm8gYXRyaWJ1dG8gZG8gbGFkbyBkaXJlaXRvIGRvIHBvbnRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcbiAgICAgICAgICAgIFwiTmEgbWFpb3JpYSBkYXMgdmV6ZXMgZXN0ZSBlcnJvIGluZGljYSBxdWUgdm9jw6ogZXNxdWVjZXUgZGUgZmVjaGFyIHVtIHBhcsOqbnRlc2VzIG91IGFzcGFzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBjYWRhIGxpbmhhIGRvIHNldSBwcm9ncmFtYSBlIGNlcnRpZmlxdWUtc2UgZGUgcXVlIHRvZG9zIG9zIHBhcsOqbnRlc2VzIGVzdMOjbyBmZWNoYWRvcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcjpcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDEwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkltcHJpbWEgbWVuc2FnZW5zIGVtIGFsZ3VtYXMgbGluaGFzIHBhcmEgZGVzY29icmlyIHNlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLiBDYXNvIG7Do28gZXN0ZWphLCB2b2PDqiBwb2RlIGF1bWVudGFyIG8gdGVtcG8gbGltaXRlIGRlIGV4ZWN1w6fDo28gY29tIG8gY29tYW5kbyBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXMpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XG4gICAgICAgICAgICBcIlNldSBwcm9ncmFtYSBlc3TDoSBkZW1vcmFuZG8gbXVpdG8uIE9zIHByb2dyYW1hcyBkZXN0ZSBsaXZybyBkZXZlcmlhbSByb2RhciBlbSBtZW5vcyBkZSAzMCBzZWd1bmRvcy4gSXNzbyBwcm92YXZlbG1lbnRlIGluZGljYSBxdWUgc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSBQeXRob24gbsOjbyBlbnRlbmRldSBhIHNpbnRheGUgZGUgdW0gY29tYW5kby4gQWxndW5zIGV4ZW1wbG9zIHPDo28gYXRyaWJ1acOnw6NvIGRlIHVtIGxpdGVyYWwsIG91IHVtYSBjaGFtYWRhIGRlIGZ1bsOnw6NvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBhcyBhdHJpYnVpw6fDtWVzIGRlIHNldSBwcm9ncmFtYSBlIGNlcnRpZmlxdWUtc2UgZGUgcXVlIG8gbGFkbyBlc3F1ZXJkbyDDqSB1bWEgdmFyacOhdmVsLCBlIG7Do28gdW0gbGl0ZXJhbCBvdSBmdW7Dp8Ojby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gYWNlc3NhciB1bSBlbGVtZW50byBjdWphIGNoYXZlIG7Do28gZXhpc3RlIG5vIGRpY2lvbsOhcmlvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJWb2PDqiBwb2RlIHRlciB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvIG5vIG5vbWUgZGEgc3VhIGNoYXZlLiDDiSB1bWEgYm9hIHByw6F0aWNhIGNoZWNhciBzZSBhIGNoYXZlIGV4aXN0ZSB1c2FuZG8gdW0gY29tYW5kbyAnaWYgKGNoYXZlKSBpbiBtZXVfZGljaW9uYXJpbycuIFZvY8OqIHRhbWLDqW0gcG9kZSB1c2FyIG8gY29tYW5kbyAnbWV1X2RpY2lvbmFyaW8uZ2V0KGNoYXZlLCB2YWxvclBhZHLDo28pJyBwYXJhIG9idGVyIG8gdmFsb3IgcGFkcsOjbyBhbyBpbnbDqXMgZGUgdW0gZXJybyBjYXNvIGEgY2hhdmUgbsOjbyBleGlzdGEuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yOlxuICAgICAgICAgICAgXCJWb2PDqiBlc3TDoSB0ZW50YW5kbyBhY2Vzc2FyIHVtIMOtbmRpY2UgYWzDqW0gZG8gZmluYWwgZGUgdW1hIHN0cmluZyBvdSBsaXN0YS4gUG9yIGV4ZW1wbG8sIHNlIHN1YSBsaXN0YSBwb3NzdWkgMyBlbGVtZW50b3MgbmVsYSBlIHZvY8OqIHRlbnRhIGFjZXNzYXIgbyBpdGVtIG5hIHBvc2nDp8OjbyAzIG91IG1haXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiTGVtYnJlLXNlIHF1ZSBvIHByaW1laXJvIGVsZW1lbnRvIGRlIHVtYSBsaXN0YSBvdSBzdHJpbmcgZXN0w6Egbm8gw61uZGljZSAwLCBub3JtYWxtZW50ZSBlc3RhIG1lbnNhZ2VtIMOpIGV4aWJpZGEgcG9ycXVlIHZvY8OqIGVycm91IG8gw61uZGljZSBwb3IgMS4gRW0gdW1hIGxpc3RhIGRlIHRhbWFuaG8gMywgbyDDumx0aW1vIMOtbmRpY2UgdsOhbGlkbyDDqSAyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcjogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeDogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gaW1wb3J0YXIgdW0gbcOzZHVsbyBxdWUgbsOjbyBleGlzdGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVW0gcHJvYmxlbWEgcG9kZSBzZXIgYXBlbmFzIHVtIGVycm8gZGUgZGlnaXRhw6fDo28uIFRhbWLDqW0gcG9kZSBzZXIgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGltcG9ydGFyIHVtIG3Ds2R1bG8gcXVlIGV4aXN0ZSBlbSBQeXRob24gJ3JlYWwnLCBtYXMgbsOjbyBleGlzdGUgbmVzdGUgbGl2cm8uIFNlIGVzdGUgw6kgbyBjYXNvLCBwb3IgZmF2b3IgZW52aWUgdW0gcGVkaWRvIHBhcmEgdGVyIGVzc2UgbcOzZHVsbyBhZGljaW9uYWRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XG4gICAgICAgICAgICBcIklzc28gcGFyZWNlIHNlciB1bSBlcnJvIGludGVybm8sIGVzcGVjaWFsbWVudGUgc2UgYSBtZW5zYWdlbSBmYXogcmVmZXLDqm5jaWEgYW8gY29uc29sZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGVudGUgYXR1YWxpemFyIGEgcMOhZ2luYS4gU2UgbyBlcnJvIHBlcnNpc3RpciwgZW52aWUgdW0gcmVsYXTDs3JpbyBkZSBidWcganVudG8gY29tIHNldSBjw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3I6XG4gICAgICAgICAgICBcIklzc28gZGl6IHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBkaXZpZGlyIHBvciAwLiBOb3JtYWxtZW50ZSDDqSBwb3JxdWUgbyB2YWxvciBkYSB2YXJpw6F2ZWwgbm8gZGVub21pbmFkb3IgZGUgdW1hIGRpdmlzw6NvIHRlbSBvIHZhbG9yIDBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlZvY8OqIHBvZGUgcHJvdGVnZXIgY29udHJhIGRpdmlkaXIgcG9yIDAgY29tIHVtIGNvbWFuZG8gJ2lmJywgb3Ugdm9jw6ogcG9kZSBwcmVjaXNhciByZWF2YWxpYXIgc3VhcyBzdXBvc2nDp8O1ZXMgc29icmUgb3MgdmFsb3JlcyBkYXMgdmFyacOhdmVpcywgcG9pcyB1bSBjb21hbmRvIGFudGVyaW9yIHBvZGUgdGVyIGluZXNwZXJhZGFtZW50ZSBhdHJpYnXDrWRvIG8gdmFsb3IgMCBhIGVzc2EgdmFyacOhdmVsLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBxdWFzZSBzZW1wcmUgYXBhcmVjZSBuYSBmb3JtYSBkZSAnVGFtYW5obyBtw6F4aW1vIGRhIHBpbGhhIGRlIGNoYW1hZGFzIGV4Y2VkaWRvJy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJc3NvIHNlbXByZSBvY29ycmUgcXVhbmRvIHVtYSBmdW7Dp8OjbyBjaGFtYSBlbGEgbWVzbWEuIFByb3ZhdmVsbWVudGUgdm9jw6ogbsOjbyBlc3TDoSBmYXplbmRvIGlzc28gZGUgcHJvcMOzc2l0bywgZXhjZXRvIG5vIGNhcMOtdHVsbyBzb2JyZSByZWN1cnPDo28uIFNlIHZvY8OqIGVzdMOhIG5lc3NlIGNhcMOtdHVsbywgZW50w6NvIHByb3ZhdmVsbWVudGUgYWluZGEgbsOjbyBpZGVudGlmaWNvdSB1bSBib20gY2FzbyBiYXNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBpbnRlcm5vIHBvZGUgc2lnbmlmaWNhciBxdWUgdm9jw6ogZGVzZW5jYWRlb3UgdW0gYnVnIG5vIG5vc3NvIFB5dGhvblwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlcG9ydGUgZXN0ZSBlcnJvIGNvbW8gdW0gYnVnLCBqdW50YW1lbnRlIGNvbSBzZXUgY8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogbsOjbyBpbmRlbnRvdSBzZXUgY8OzZGlnbyBkZXZpZGFtZW50ZS4gSXNzbyDDqSBtYWlzIHByb3bDoXZlbCBkZSBvY29ycmVyIGNvbW8gcGFydGUgZGUgdW0gY29tYW5kbyBpZiwgZm9yLCB3aGlsZSBvdSBkZWYuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIHNldXMgY29tYW5kb3MgaWYsIGRlZiwgZm9yIGUgd2hpbGUgcGFyYSB0ZXIgY2VydGV6YSBkZSBxdWUgYXMgbGluaGFzIGVzdMOjbyBkZXZpZGFtZW50ZSBpbmRlbnRhZGFzIGFiYWl4byBkZWxhcy4gT3V0cmEgZm9udGUgZGVzdGUgZXJybyDDqSBjb3BpYXIgZSBjb2xhciBjw7NkaWdvIGVtIHF1ZSB2b2PDqiBhY2lkZW50YWxtZW50ZSBkZWl4b3UgcmVzdG9zIGRlIGPDs2RpZ28gcXVlIG7Do28gcGVydGVuY2VtIG1haXMgYWxpLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGUgZXJybyBvY29ycmUgcXVhbmRvIHZvY8OqIHRlbnRhIHVzYXIgdW1hIGZ1bsOnw6NvIGVtYnV0aWRhIGRlIFB5dGhvbiBxdWUgbsOjbyBmb2kgaW1wbGVtZW50YWRhIG5lc3RhIHZlcnPDo28gYnJvd3NlciBkZSBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBvciBlbnF1YW50byBhIMO6bmljYSBtYW5laXJhIGRlIGNvbnNlcnRhciBpc3NvIMOpIG7Do28gdXNhbmRvIGEgZnVuw6fDo28uIFBvZGVtIGhhdmVyIHNvbHXDp8O1ZXMgYWx0ZXJuYXRpdmFzLiBTZSB2b2PDqiByZWFsbWVudGUgcHJlY2lzYSBkZXN0YSBmdW7Dp8OjbyBlbWJ1dGlkYSwgZW52aWUtbm9zIHVtIHJlbGF0w7NyaW8gZGUgYnVnIGUgZGlnYWMgb21vIGVzdMOhIHRlbnRhbmRvIHVzYXIgYSBmdW7Dp8Ojby5cIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZDogXCJBcnF1aXZvIG7Do28gZW5jb250cmFkbzogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcbiAgICAgICAgICAgIFwiW0Vycm8gbsK6IDJdIEFycXVpdm8gb3UgZGlyZXTDs3JpbyBpbmV4aXN0ZW50ZTogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zdGFydGluZzogXCJDbGlxdWUgbm8gYm90w6NvIGRlIGV4ZWN1w6fDo28gcGFyYSBjb21lw6dhciAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIkV4ZWN1dGFuZG8gJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpbzpcbiAgICAgICAgICAgIFwiQ2FycmVnYW5kbyDDoXVkaW8uIFBvciBmYXZvciwgZXNwZXJlLiBTZSBvIHRvdXIgbsOjbyBjb21lw6dhciBsb2dvLCBjbGlxdWUgZW0gJ1N0b3AgVG91cicgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2FyIMOhdWRpbyBhdHVhbFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzYXIgw6F1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvOiBcIlJlcHJvZHV6aXIgw6F1ZGlvIHBhdXNhZG9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxuICAgICAgICAgICAgXCIkMSBmb2kgcGF1c2Fkby4gQ2xpcXVlIG5vIGJvdMOjbyBkZSBleGVjdcOnw6NvIHBhcmEgcmV0b21hciBvIHRvdXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2lucHV0X3ByZzogXCJFbnRyYWRhIHBhcmEgbyBwcm9ncmFtYVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XG4gICAgICAgICAgICBcIkhvdXZlcmFtIGVycm9zIGFvIGNvbXBpbGFyIHNldSBjw7NkaWdvLiBWZWphIGFiYWl4by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGM6IFwiTGltaXRlIGRlIHRlbXBvIGV4Y2VkaWRvIG5vIHNldSBwcm9ncmFtYVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfZXJyOiBcIlVtIGVycm8gZGUgc2Vydmlkb3Igb2NvcnJldTogJDEgJDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XG4gICAgICAgICAgICBcIkNvbXBpbGFuZG8gZSBleGVjdXRhbmRvIHNldSBjw7NkaWdvLi4uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvIGFvIGNvbXVuaWNhciBjb20gbyBzZXJ2aWRvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2FsdmFyICYgRXhlY3V0YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVuZGVyOiBcIlNhbHZhciAmIFJlbmRlcml6YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIGFzc2Vyw6fDo28gb2NvcnJlIHF1YW5kbyBweXRob24gZW5jb250cmEgdW0gY29tYW5kbyAnYXNzZXJ0Jy4gUHl0aG9uIGF2YWxpYSBhIGV4cHJlc3PDo28gZG8gbGFkbyBkaXJlaXRvOyBzZSDDqSB2ZXJkYWRlaXJhLCBvIHByb2dyYW1hIGNvbnRpbnVhIG5vcm1hbG1lbnRlLiBTZSDDqSBmYWxzYSwgcHl0aG9uIGdlcmEgdW0gZXJybyBlIHBhcmEgYSBleGVjdcOnw6NvLlwiICxcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG8gZGUgJ2Fzc2VydCcuIEVzc2EgZXhwcmVzc8OjbyDDqSBmYWxzYSBlIMOpIHByZWNpc28gdmVyaWZpY2FyIG8gbW90aXZvLiBWb2PDqiBwb2RlIHF1ZXJlciBpbXByaW1pciBjYWRhIHBhcnRlIGRhIGV4cHJlc3PDo28gZSBlbnRlbmRlciBwb3JxdWUgw6kgZmFsc2EuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiQ2FycmVnYW5kbyBiYW5jbyBkZSBkYWRvcy4uLlwiLFxuICAgIH0sXG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIFwic3ItQ3lybFwiOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCLQo9GH0LjRgtCw0Zgg0LjRgdGC0L7RgNC40ZjRg1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcItCQ0YPQtNC40L4g0YLRg9GA0LBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwi0JLQsNGIINC40LfQstC+0YDQvdC4INC60L7QtCDRmNC1INGD0YfQuNGC0LDQvS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCLQndC1INC/0L7RgdGC0L7RmNC4INGB0L3QuNC80ZnQtdC9INC60L7QtC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwi0J/QvtC60YDQtdC90Lgg0L/RgNC+0LPRgNCw0LxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCLQn9GA0LjQutCw0LbQuCDRgNC10LfRg9C70YLQsNGCXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCLQn9GA0LjQutCw0LbQuCDQutC+0LRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcItCX0LDRgtCy0L7RgNC4INC60L7QtFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcItCa0L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwi0JrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCLQl9Cw0YLQstC+0YDQuCDQutC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCLQodC40L3RgtCw0LrRgdC90LAg0LPRgNC10YjQutCwIChwYXJzZSBlcnJvcikg0LfQvdCw0YfQuCDQtNCwINCf0LDRmNGC0L7QvSDQvdC1INGA0LDQt9GD0LzQtSDRgdC40L3RgtCw0LrRgdGDINGDINC70LjQvdC40ZjQuCDQutC+0LPQsCDQvdCwINC60L7RmNGDINC/0L7RgNGD0LrQsCDQviDQs9GA0LXRiNGG0Lgg0YPQutCw0LfRg9GY0LUuINCi0LjQv9C40YfQvdC4INC/0YDQuNC80LXRgNC4INC+0LLQsNC60LLQtSDQs9GA0LXRiNC60LUg0YHRgyDQt9Cw0LHQvtGA0LDQstC70ZjQtdC90LAg0LTQstC+0YLQsNGH0LrQsCDQutC+0LQgJ2lmJyDQuNC70LggJ2Zvcicg0LjRgdC60LDQt9CwINC40LvQuCDQt9Cw0LHQvtGA0LDQstGZ0LXQvdCwINC30LDQv9C10YLQsCDQuNC30LzQtdGS0YMg0LDRgNCz0YPQvNC10L3QsNGC0LAg0LrQvtC0INC/0L7Qt9C40LLQsCDRhNGD0L3QutGG0LjRmNC1XCIsXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwi0JTQsCDQsdC40YHRgtC1INC40YHQv9GA0LDQstC40LvQuCDRgdC40L3RgtCw0LrRgdC90YMg0LPRgNC10YjQutGDINGC0YDQtdCx0LAg0L/QsNC20ZrQuNCy0L4g0LTQsCDQv9C+0LPQu9C10LTQsNGC0LUg0LvQuNC90LjRmNGDINC40LfQstC+0YDQvdC+0LMg0LrQvtC00LAg0L3QsCDQutC+0ZjRgyDRg9C60LDQt9GD0ZjQtSDQv9C+0YDRg9Cz0LAg0L4g0LPRgNC10YjRhtC4INC4INC80L7QttC00LAg0L/RgNC10YLRhdC+0LTQvdGDINC70LjQvdC40L3RgyDQuNC30LLQvtGA0L3QvtCzINC60L7QtNCwLiDQn9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGB0YMg0L/QvtGI0YLQvtCy0LDQvdCwINGB0LLQsCDRgdC40L3RgtCw0LrRgdC90LAg0L/RgNCw0LLQuNC70LAg0J/QsNGY0YLQvtC90LAuXCIsXG4gICAgfSxcbn0pO1xuIiwiLyoqXG4gKlxuICogQ3JlYXRlZCBieSBibWlsbGVyIG9uIDMvMTkvMTUuXG4gKi9cbi8qIERlZmluZSBnbG9iYWwgdmFyaWFibGVzIGZvciBFU0xpbnQgKi9cbi8qIGdsb2JhbCBTayAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5pbXBvcnQgQXVkaW9Ub3VyIGZyb20gXCIuL2F1ZGlvdG91ci5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4uZW4uanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5zci1DeXJsLmpzXCI7XG5pbXBvcnQgQ29kZU1pcnJvciBmcm9tIFwiY29kZW1pcnJvclwiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3B5dGhvbi9weXRob24uanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9jc3MvY3NzLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3htbC94bWwuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY2xpa2UvY2xpa2UuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9vY3RhdmUvb2N0YXZlLmpzXCI7XG5pbXBvcnQgXCIuLy4uL2Nzcy9hY3RpdmVjb2RlLmNzc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9saWIvY29kZW1pcnJvci5jc3NcIjtcbmltcG9ydCBcIi4vc2t1bHB0Lm1pbi5qc1wiO1xuaW1wb3J0IFwiLi9za3VscHQtc3RkbGliLmpzXCI7XG4vLyBVc2VkIGJ5IFNrdWxwdC5cbmltcG9ydCBlbWJlZCBmcm9tIFwidmVnYS1lbWJlZFwiO1xuLy8gQWRhcHQgZm9yIHVzZSBvdXRzaWRlIHdlYnBhY2sgLS0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtZW1iZWQuXG53aW5kb3cudmVnYUVtYmVkID0gZW1iZWQ7XG5cbnZhciBpc01vdXNlRG93biA9IGZhbHNlO1xuZG9jdW1lbnQub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaXNNb3VzZURvd24gPSB0cnVlO1xufTtcblxuZG9jdW1lbnQub25tb3VzZXVwID0gZnVuY3Rpb24gKCkge1xuICAgIGlzTW91c2VEb3duID0gZmFsc2U7XG59O1xud2luZG93LmVkTGlzdCA9IHt9O1xuXG52YXIgc29ja2V0LCBjb25uZWN0aW9uLCBkb2M7XG52YXIgY2hhdGNvZGVzU2VydmVyID0gXCJjaGF0LmNvZGVzXCI7XG5cbi8vIHNlcGFyYXRlIGludG8gY29uc3RydWN0b3IgYW5kIGluaXRcbmV4cG9ydCBjbGFzcyBBY3RpdmVDb2RlIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIHN1ZmZTdGFydDtcbiAgICAgICAgdmFyIG9yaWcgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IG9wdHMub3JpZztcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIHRoaXMucHl0aG9uMyA9IG9wdHMucHl0aG9uMztcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gb3B0cy52ZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XG4gICAgICAgIHRoaXMub3JpZ1RleHQgPSB0aGlzLm9yaWdFbGVtLnRleHRDb250ZW50O1xuICAgICAgICB0aGlzLmRpdmlkID0gb3B0cy5vcmlnLmlkO1xuICAgICAgICB0aGlzLmNvZGUgPSAkKG9yaWcpLnRleHQoKSB8fCBcIlxcblxcblxcblxcblxcblwiO1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gJChvcmlnKS5kYXRhKFwibGFuZ1wiKTtcbiAgICAgICAgdGhpcy50aW1lbGltaXQgPSAkKG9yaWcpLmRhdGEoXCJ0aW1lbGltaXRcIik7XG4gICAgICAgIHRoaXMuaW5jbHVkZXMgPSAkKG9yaWcpLmRhdGEoXCJpbmNsdWRlXCIpO1xuICAgICAgICB0aGlzLmhpZGVjb2RlID0gJChvcmlnKS5kYXRhKFwiaGlkZWNvZGVcIik7XG4gICAgICAgIHRoaXMuY2hhdGNvZGVzID0gJChvcmlnKS5kYXRhKFwiY2hhdGNvZGVzXCIpO1xuICAgICAgICB0aGlzLmhpZGVoaXN0b3J5ID0gJChvcmlnKS5kYXRhKFwiaGlkZWhpc3RvcnlcIik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSAkKG9wdHMub3JpZykuZmluZChgIyR7dGhpcy5kaXZpZH1fcXVlc3Rpb25gKVswXTtcbiAgICAgICAgdGhpcy50aWUgPSAkKG9yaWcpLmRhdGEoXCJ0aWVcIik7XG4gICAgICAgIHRoaXMuZGJ1cmwgPSAkKG9yaWcpLmRhdGEoXCJkYnVybFwiKTtcbiAgICAgICAgdGhpcy5weXRob24zX2ludGVycHJldGVyID0gJChvcmlnKS5kYXRhKFwicHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmVuYWJsZWRvd25sb2FkID0gJChvcmlnKS5kYXRhKFwiZW5hYmxlZG93bmxvYWRcIik7XG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnNhdmVCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLm91dGVyRGl2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcbiAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFlQm9va0NvbmZpZy5hbGxvd19wYWlycyB8fCAkKG9yaWcpLmRhdGEoXCJub3BhaXJcIikpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFydG5lciA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJ0bmVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIGNyZWF0ZSBwcmUgZm9yIG91dHB1dFxuICAgICAgICB0aGlzLmdyYXBoaWNzID0gbnVsbDsgLy8gY3JlYXRlIGRpdiBmb3IgdHVydGxlIGdyYXBoaWNzXG4gICAgICAgIHRoaXMuY29kZWNvYWNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2RlbGVucyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29udHJvbERpdiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGlzdG9yeVNjcnViYmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy50aW1lc3RhbXBzID0gW1wiT3JpZ2luYWxcIl07XG4gICAgICAgIHRoaXMuYXV0b3J1biA9ICQob3JpZykuZGF0YShcImF1dG9ydW5cIik7XG4gICAgICAgIGlmICh0aGlzLmNoYXRjb2RlcyAmJiBlQm9va0NvbmZpZy5lbmFibGVfY2hhdGNvZGVzKSB7XG4gICAgICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXCJ3c3M6Ly9cIiArIGNoYXRjb2Rlc1NlcnZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IHdpbmRvdy5zaGFyZWRiLkNvbm5lY3Rpb24oc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgZG9jID0gY29ubmVjdGlvbi5nZXQoXCJjaGF0Y29kZXNcIiwgXCJjaGFubmVsc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgfHwgdGhpcy5pc1RpbWVkKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVjb2RlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSB0aGlzLmluY2x1ZGVzLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByZWZpeEVuZCA9IHRoaXMuY29kZS5pbmRleE9mKFwiXl5eXlwiKTtcbiAgICAgICAgaWYgKHByZWZpeEVuZCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnByZWZpeCA9IHRoaXMuY29kZS5zdWJzdHJpbmcoMCwgcHJlZml4RW5kKTtcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcocHJlZml4RW5kICsgNSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VmZlN0YXJ0ID0gdGhpcy5jb2RlLmluZGV4T2YoXCI9PT09XCIpO1xuICAgICAgICBpZiAoc3VmZlN0YXJ0ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3VmZml4ID0gdGhpcy5jb2RlLnN1YnN0cmluZyhzdWZmU3RhcnQgKyA1KTtcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IHRoaXMuY29kZS5zdWJzdHJpbmcoMCwgc3VmZlN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpc3RvcnkgPSBbdGhpcy5jb2RlXTtcbiAgICAgICAgdGhpcy5jcmVhdGVFZGl0b3IoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDb250cm9scygpO1xuICAgICAgICBpZiAoJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKSkge1xuICAgICAgICAgICAgdGhpcy5jYXB0aW9uID0gJChvcmlnKS5kYXRhKFwiY2FwdGlvblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9IFwiQWN0aXZlQ29kZVwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkQ2FwdGlvbihcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksXG4gICAgICAgICAgICAxMDAwXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmF1dG9ydW4pIHtcbiAgICAgICAgICAgIC8vIFNpbXVsYXRlIHByZXNzaW5nIHRoZSBydW4gYnV0dG9uLCBzaW5jZSB0aGlzIHdpbGwgYWxzbyBwcmV2ZW50IHRoZSB1c2VyIGZyb20gY2xpY2tpbmcgaXQgdW50aWwgdGhlIGluaXRpYWwgcnVuIGlzIGNvbXBsZXRlLCBhbmQgYWxzbyBoZWxwIHRoZSB1c2VyIHVuZGVyc3RhbmQgd2h5IHRoZXkncmUgd2FpdGluZy5cbiAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KHRoaXMucnVuQnV0dG9uSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGljYXRlX2NvbXBvbmVudF9yZWFkeSgpO1xuICAgIH1cblxuICAgIGNyZWF0ZUVkaXRvcihpbmRleCkge1xuICAgICAgICB0aGlzLm91dGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGxpbmtkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBsaW5rZGl2LmlkID0gdGhpcy5kaXZpZC5yZXBsYWNlKC9fL2csIFwiLVwiKS50b0xvd2VyQ2FzZSgpOyAvLyA6cmVmOiBjaGFuZ2VzIF8gdG8gLSBzbyBhZGQgdGhpcyBhcyBhIHRhcmdldFxuICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmFkZENsYXNzKFwiYWNfc2VjdGlvbiBhbGVydCBhbGVydC13YXJuaW5nXCIpO1xuICAgICAgICB2YXIgY29kZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY29kZURpdikuYWRkQ2xhc3MoXCJhY19jb2RlX2RpdiBjb2wtbWQtMTJcIik7XG4gICAgICAgIHRoaXMuY29kZURpdiA9IGNvZGVEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgICQodGhpcy5vcmlnRWxlbSkucmVwbGFjZVdpdGgodGhpcy5vdXRlckRpdik7XG4gICAgICAgIGlmIChsaW5rZGl2LmlkICE9PSB0aGlzLmRpdmlkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB3YW50IHRoZSAnZXh0cmEnIHRhcmdldCBpZiB0aGV5IG1hdGNoLlxuICAgICAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsaW5rZGl2KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvZGVEaXYpO1xuICAgICAgICB2YXIgZWRtb2RlID0gdGhpcy5vdXRlckRpdi5sYW5nO1xuICAgICAgICBpZiAoZWRtb2RlID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1zcWxcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiamF2YVwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1qYXZhXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImNwcFwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jKytzcmNcIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwiY1wiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1jc3JjXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcInB5dGhvbjNcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJweXRob25cIjtcbiAgICAgICAgfSBlbHNlIGlmIChlZG1vZGUgPT09IFwib2N0YXZlXCIgfHwgZWRtb2RlID09PSBcIk1BVExBQlwiKSB7XG4gICAgICAgICAgICBlZG1vZGUgPSBcInRleHQveC1vY3RhdmVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQpICE9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5kaXZpZCk7XG5cbiAgICAgICAgdmFyIG9wdHMgPSB7XG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXG4gICAgICAgICAgICBtb2RlOiBlZG1vZGUsXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxuICAgICAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9NYXRjaFBhcmVuczogdHJ1ZSxcbiAgICAgICAgICAgIGV4dHJhS2V5czoge1xuICAgICAgICAgICAgICAgIFRhYjogXCJpbmRlbnRNb3JlXCIsXG4gICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogXCJpbmRlbnRMZXNzXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yKGNvZGVEaXYsb3B0cyApO1xuICAgICAgICBcbiAgICAgICAgLy8gTWFrZSB0aGUgZWRpdG9yIHJlc2l6YWJsZVxuICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5yZXNpemFibGUoe1xuICAgICAgICAgICAgcmVzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldFNpemUoJCh0aGlzKS53aWR0aCgpLCAkKHRoaXMpLmhlaWdodCgpKTtcbiAgICAgICAgICAgICAgICBlZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdpdmUgdGhlIHVzZXIgYSB2aXN1YWwgY3VlIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYnV0IG5vdCBzYXZlZFxuICAgICAgICBlZGl0b3Iub24oXG4gICAgICAgICAgICBcImNoYW5nZVwiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50cyBjYW4gY29tZSBiZWZvcmUgYW55IHJlYWwgY2hhbmdlcyBmb3IgdmFyaW91cyByZWFzb25zLCBzb21lIHVua25vd25cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhdm9pZHMgdW5uZWNjc2FyeSBsb2cgZXZlbnRzIGFuZCB1cGRhdGVzIHRvIHRoZSBhY3Rpdml0eSBjb3VudGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9yaWdUZXh0ID09PSBlZGl0b3IuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLmNzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLXRvcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQoZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCkpLmNzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYm9yZGVyLWJvdHRvbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIycHggc29saWQgI2I0MzIzMlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBbnN3ZXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImFjdGl2ZWNvZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdDogXCJlZGl0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlZGl0b3IuYWNFZGl0RXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7IC8vIHVzZSBiaW5kIHRvIHByZXNlcnZlICp0aGlzKiBpbnNpZGUgdGhlIG9uIGhhbmRsZXIuXG4gICAgICAgIC8vU29sdmluZyBLZXlib2FyZCBUcmFwIG9mIEFjdGl2ZUNvZGU6IElmIHVzZXIgdXNlIHRhYiBmb3IgbmF2aWdhdGlvbiBvdXRzaWRlIG9mIEFjdGl2ZUNvZGUsIHRoZW4gY2hhbmdlIHRhYiBiZWhhdmlvciBpbiBBY3RpdmVDb2RlIHRvIGVuYWJsZSB0YWIgdXNlciB0byB0YWIgb3V0IG9mIHRoZSB0ZXh0YXJlYVxuICAgICAgICAkKHdpbmRvdykua2V5ZG93bihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSBlLmtleUNvZGUgPyBlLmtleUNvZGUgOiBlLndoaWNoO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT0gOSAmJiAkKFwidGV4dGFyZWE6Zm9jdXNcIikubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldE9wdGlvbihcImV4dHJhS2V5c1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIFRhYjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoXCIudGFiLWNvbnRlbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dFNpYmxpbmcuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJTaGlmdC1UYWJcIjogZnVuY3Rpb24gKGNtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoXCIudGFiLWNvbnRlbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJldmlvdXNTaWJsaW5nLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgICAgaWYgKHRoaXMuaGlkZWNvZGUpIHtcbiAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJ1bkJ1dHRvbkhhbmRsZXIoKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIHJ1biBidXR0b24gdW50aWwgdGhlIHJ1biBpcyBmaW5pc2hlZC4gICAgXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuUHJvZygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGhlcmUgd2FzIGFuIGVycm9yICR7ZX0gcnVubmluZyB0aGUgY29kZWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9nQ3VycmVudEFuc3dlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyRmVlZGJhY2soKTtcbiAgICAgICAgLy8gVGhlIHJ1biBpcyBmaW5pc2hlZDsgcmUtZW5hYmxlIHRoZSBidXR0b24uXG4gICAgICAgIHRoaXMucnVuQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY3JlYXRlQ29udHJvbHMoKSB7XG4gICAgICAgIHZhciBjdHJsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdmFyIGJ1dHQ7XG4gICAgICAgICQoY3RybERpdikuYWRkQ2xhc3MoXCJhY19hY3Rpb25zXCIpO1xuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAvLyBSdW5cbiAgICAgICAgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9ydW5fY29kZVwiKSk7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLXN1Y2Nlc3MgcnVuLWJ1dHRvblwiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBidXR0O1xuICAgICAgICBjb25zb2xlLmxvZyhcImFkZGluZyBjbGljayBmdW5jdGlvbiBmb3IgcnVuXCIpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZG93bmxvYWQgfHwgZUJvb2tDb25maWcuZG93bmxvYWRzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5hZGREb3dubG9hZEJ1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGlkZWNvZGUgJiYgIXRoaXMuaGlkZWhpc3RvcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiZ3JhZGVidXR0b25cIikgJiYgIXRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZlZWRiYWNrQnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3cvSGlkZSBDb2RlXG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUhpZGVTaG93KGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvZGVMZW5zXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjb2RlbGVuc1wiKSAmJiAhdGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQ29kZUxlbnMoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXVkaW8gVG91clxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIikpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZUJvb2tDb25maWcuaXNJbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUluc3RydWN0b3JTaGFyaW5nKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVBhcnRuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBQYXJ0bmVyKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoYXRjb2RlcyAmJiBlQm9va0NvbmZpZy5lbmFibGVfY2hhdGNvZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNoYXRDb2RlcyhjdHJsRGl2KTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRlckRpdikucHJlcGVuZChjdHJsRGl2KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMucXVlc3Rpb24pLmh0bWwoKS5tYXRjaCgvXlxccyskLykpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMucXVlc3Rpb24pLnJlbW92ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnByZXBlbmQodGhpcy5xdWVzdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sRGl2ID0gY3RybERpdjtcbiAgICB9XG5cbiAgICBhZGRGZWVkYmFja0J1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuZ3JhZGVCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuY3JlYXRlR3JhZGVTdW1tYXJ5LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGFkZEhpc3RvcnlCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3RvcnlcIikpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLmhpc3RCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyLmJpbmQodGhpcykpO1xuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRG93bmxvYWRCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIkRvd25sb2FkXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIHNhdmUtYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLmRvd25sb2FkQnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmRvd25sb2FkRmlsZS5iaW5kKHRoaXMsIHRoaXMubGFuZ3VhZ2UpKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICB9XG5cbiAgICBlbmFibGVIaWRlU2hvdyhjdHJsRGl2KSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVCdXR0ID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuY29kZURpdikudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlci5wYXJlbnRFbGVtZW50KS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KCkgPT1cbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuc2hvd0hpZGVCdXR0KS50ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlXCIpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGVuYWJsZUNvZGVMZW5zKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnNcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5jbEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2sodGhpcy5zaG93Q29kZWxlbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuYXRCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG5ldyBBdWRpb1RvdXIoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZW5hYmxlSW5zdHJ1Y3RvclNoYXJpbmcoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWluZm9cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIlNoYXJlIENvZGVcIik7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLnNoYXJlQnV0dCA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGFyZSBhYm91dCB0byBzaGFyZSB0aGlzIGNvZGUgd2l0aCBBTEwgb2YgeW91ciBzdHVkZW50cy4gIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT9cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpdmlkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICAgICAgZUJvb2tDb25maWcuYWpheFVSTCArIFwiYnJvYWRjYXN0X2NvZGUuanNvblwiLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBsZXQgcG9zdF9wcm9taXNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHBvc3RfcHJvbWlzZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5tZXNzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChgU2hhcmVkIENvZGUgd2l0aCAke3N0YXR1cy5zaGFyZV9jb3VudH0gc3R1ZGVudHNgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhbGVydChcIlNoYXJpbmcgRmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNldHVwUGFydG5lcihjdHJsRGl2KSB7XG4gICAgICAgIHZhciBjaGVja1BhcnRuZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIGNoZWNrUGFydG5lci50eXBlID0gXCJjaGVja2JveFwiO1xuICAgICAgICBjaGVja1BhcnRuZXIuaWQgPSBgJHt0aGlzLmRpdmlkfV9wYXJ0YDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChjaGVja1BhcnRuZXIpO1xuICAgICAgICB2YXIgcGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxhYmVsXCIpO1xuICAgICAgICBwbGFiZWwuZm9yID0gYCR7dGhpcy5kaXZpZH1fcGFydGA7XG4gICAgICAgICQocGxhYmVsKS50ZXh0KFwiUGFpcj9cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGxhYmVsKTtcbiAgICAgICAgJChjaGVja1BhcnRuZXIpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnRuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICQocGFydG5lclRleHRCb3gpLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgcGFydG5lclRleHRCb3gudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAkKHBsYWJlbCkudGV4dChcIlBhaXI/XCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWRBZ3JlZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwicGFydG5lckFncmVlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRpZEFncmVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRBZ3JlZSA9IGNvbmZpcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJQYWlyIFByb2dyYW1taW5nIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgY29uc2VudCBvZiB5b3VyIGluc3RydWN0b3IuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIllvdXIgcGFydG5lciBtdXN0IGJlIGEgcmVnaXN0ZXJlZCBtZW1iZXIgb2YgdGhlIGNsYXNzIGFuZCBoYXZlIGFncmVlZCB0byBwYWlyIHdpdGggeW91LlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJCeSBjbGlja2luZyBPSyB5b3UgY2VydGlmeSB0aGF0IGJvdGggb2YgdGhlc2UgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZEFncmVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0bmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgJChwbGFiZWwpLnRleHQoXCJ3aXRoOiBcIik7XG4gICAgICAgICAgICAgICAgICAgICQocGFydG5lclRleHRCb3gpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHBhcnRuZXJUZXh0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBwYXJ0bmVyVGV4dEJveC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQocGFydG5lclRleHRCb3gpO1xuICAgICAgICAkKHBhcnRuZXJUZXh0Qm94KS5oaWRlKCk7XG4gICAgICAgICQocGFydG5lclRleHRCb3gpLmNoYW5nZShcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBwYXJ0bmVyVGV4dEJveC52YWx1ZTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgb2Jzb2xldGUuICBOb3Qgc3VyZSBpZiBhbnlvbmUgYXQgTWljaGlnYW4gd2lsbCBjb21lIGJhY2tcbiAgICAvLyB0byB3b3JraW5nIG9uIHRoaXMgYWdhaW4uXG4gICAgZW5hYmxlQ2hhdENvZGVzKGN0cmxEaXYpIHtcbiAgICAgICAgdmFyIGNoYXRCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB2YXIgY2hhbm5lbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgdmFyIHRvcGljID0gd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoY2hhdEJhcik7XG4gICAgICAgICQoY2hhdEJhcikudGV4dChcIkNoYXQ6IFwiKTtcbiAgICAgICAgJChjaGF0QmFyKS5hcHBlbmQoY2hhbm5lbHMpO1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiQ3JlYXRlIENoYW5uZWxcIik7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0YXJnZXRcIiwgXCJfYmxhbmtcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcbiAgICAgICAgICAgIFwiaHJlZlwiLFxuICAgICAgICAgICAgXCJodHRwOi8vXCIgK1xuICAgICAgICAgICAgICAgIGNoYXRjb2Rlc1NlcnZlciArXG4gICAgICAgICAgICAgICAgXCIvbmV3P1wiICtcbiAgICAgICAgICAgICAgICAkLnBhcmFtKHtcbiAgICAgICAgICAgICAgICAgICAgdG9waWM6IHdpbmRvdy5sb2NhdGlvbi5ob3N0ICsgXCItXCIgKyB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICBsYW5nOiBcIlB5dGhvblwiLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hhdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGNoYXRCYXIuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHZhciB1cGRhdGVDaGF0Q29kZXNDaGFubmVscyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gZG9jLmRhdGE7XG4gICAgICAgICAgICB2YXIgaSA9IDE7XG4gICAgICAgICAgICAkKGNoYW5uZWxzKS5odG1sKFwiXCIpO1xuICAgICAgICAgICAgZGF0YVtcImNoYW5uZWxzXCJdLmZvckVhY2goZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWwuYXJjaGl2ZWQgJiYgdG9waWMgPT09IGNoYW5uZWwudG9waWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmsgPSAkKFwiPGEgLz5cIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBocmVmID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaHR0cDovL1wiICsgY2hhdGNvZGVzU2VydmVyICsgXCIvXCIgKyBjaGFubmVsLmNoYW5uZWxOYW1lO1xuICAgICAgICAgICAgICAgICAgICBsaW5rLmF0dHIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsudGV4dChcIiBcIiArIGNoYW5uZWwuY2hhbm5lbE5hbWUgKyBcIihcIiArIGkgKyBcIikgXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKGNoYW5uZWxzKS5hcHBlbmQobGluayk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgJChjaGFubmVscykudGV4dChcIihubyBhY3RpdmUgY29udmVyc3RhdGlvbnMgb24gdGhpcyBwcm9ibGVtKVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZG9jLnN1YnNjcmliZSh1cGRhdGVDaGF0Q29kZXNDaGFubmVscyk7XG4gICAgICAgIGRvYy5vbihcIm9wXCIsIHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zYXZlX3J1blwiKSk7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlY29kZSAtLSBJZiB0aGUgY29kZSBoYXMgbm90IGNoYW5nZWQgd3J0IHRoZSBzY3J1YmJlciBwb3NpdGlvbiB2YWx1ZSB0aGVuIGRvbid0IHNhdmUgdGhlIGNvZGUgb3IgcmVwb3NpdGlvbiB0aGUgc2NydWJiZXJcbiAgICAvLyAgLS0gc3RpbGwgY2FsbCBydW5sb2csIGJ1dCBhZGQgYSBwYXJhbWV0ZXIgdG8gbm90IHNhdmUgdGhlIGNvZGVcbiAgICAvLyBhZGQgYW4gaW5pdGlhbCBsb2FkIGhpc3RvcnkgYnV0dG9uXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gZWRpdCB0aGVuIHRoZXJlIGlzIG5vIGFwcGVuZCAgIHRvX3NhdmUgKFRydWUvRmFsc2UpXG4gICAgYXN5bmMgYWRkSGlzdG9yeVNjcnViYmVyKHBvc19sYXN0KSB7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdmFyIHJlcURhdGEgPSB7XG4gICAgICAgICAgICBhY2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5zaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxRGF0YVtcInNpZFwiXSA9IHRoaXMuc2lkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiYmVmb3JlIGdldCBoaXN0XCIpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlQm9va0NvbmZpZy5wcmFjdGljZV9tb2RlIHx8XG4gICAgICAgICAgICAodGhpcy5pc1RpbWVkICYmICF0aGlzLmFzc2Vzc21lbnRUYWtlbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRpbWVkIGFuZCBhbHJlYWR5IHRha2VuIHdlIHNob3VsZCByZXN0b3JlIGhpc3RvcnkgaW5mb1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJTY3J1YmJlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChlQm9va0NvbmZpZy5hamF4VVJMICsgXCJnZXRoaXN0Lmpzb25cIiwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5qc29uSGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXFEYXRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3RvcnkuY29uY2F0KGRhdGEuaGlzdG9yeSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHQgaW4gZGF0YS50aW1lc3RhbXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShkYXRhLnRpbWVzdGFtcHNbdF0pLnRvTG9jYWxlU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmFibGUgdG8gZmV0Y2ggaGlzdG9yeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2NydWJiZXIocG9zX2xhc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG5cbiAgICByZW5kZXJTY3J1YmJlcihwb3NfbGFzdCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIm1ha2luZyBhIG5ldyBzY3J1YmJlclwiKTtcbiAgICAgICAgdmFyIHNjcnViYmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwiZGlzcGxheVwiLCBcImlubGluZS1ibG9ja1wiKTtcbiAgICAgICAgJChzY3J1YmJlckRpdikuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJtYXJnaW4tcmlnaHRcIiwgXCIxMHB4XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3Moe1xuICAgICAgICAgICAgXCJtaW4td2lkdGhcIjogXCIyMDBweFwiLFxuICAgICAgICAgICAgXCJtYXgtd2lkdGhcIjogXCIzMDBweFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHNjcnViYmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy50aW1lc3RhbXBQID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgICAgIHRoaXMuc2xpZGVpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVskKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV0pO1xuICAgICAgICAgICAgdmFyIGN1clZhbCA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XG4gICAgICAgICAgICBsZXQgcG9zID0gJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIik7XG4gICAgICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgICAgICAgJCh0aGlzLnRpbWVzdGFtcFApLnRleHQoYCR7Y3VyVmFsfSAtICR7cG9zICsgMX0gb2YgJHtvdXRPZn1gKTtcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJhY3RpdmVjb2RlXCIsXG4gICAgICAgICAgICAgICAgYWN0OiBcInNsaWRlOlwiICsgY3VyVmFsLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAkKHNjcnViYmVyKS5zbGlkZXIoe1xuICAgICAgICAgICAgbWF4OiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgfSk7XG4gICAgICAgICQoc2NydWJiZXIpLmNzcyhcIm1hcmdpblwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xuICAgICAgICAkKHNjcnViYmVyKS5vbihcInNsaWRlY2hhbmdlXCIsIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc2NydWJiZXJEaXYuYXBwZW5kQ2hpbGQoc2NydWJiZXIpO1xuICAgICAgICBzY3J1YmJlckRpdi5hcHBlbmRDaGlsZCh0aGlzLnRpbWVzdGFtcFApO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGRlYWRsaW5lIHNldCB0aGVuIHBvc2l0aW9uIHRoZSBzY3J1YmJlciBhdCB0aGUgbGFzdCBzdWJtaXNzaW9uXG4gICAgICAgIC8vIHByaW9yIHRvIHRoZSBkZWFkbGluZVxuICAgICAgICBpZiAodGhpcy5kZWFkbGluZSkge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCAmJiAhZG9uZSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXcgRGF0ZSh0aGlzLnRpbWVzdGFtcHNbaV0pID4gdGhpcy5kZWFkbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IGkgLSAxO1xuICAgICAgICAgICAgc2NydWJiZXIudmFsdWUgPSBNYXRoLm1heChpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuaGlzdG9yeVtzY3J1YmJlci52YWx1ZV0pO1xuICAgICAgICAgICAgJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIiwgc2NydWJiZXIudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHBvc19sYXN0KSB7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5W3NjcnViYmVyLnZhbHVlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvcyA9ICQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpO1xuICAgICAgICBsZXQgb3V0T2YgPSB0aGlzLmhpc3RvcnkubGVuZ3RoO1xuICAgICAgICBsZXQgdHMgPSB0aGlzLnRpbWVzdGFtcHNbJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIildO1xuICAgICAgICAkKHRoaXMudGltZXN0YW1wUCkudGV4dChgJHt0c30gLSAke3BvcyArIDF9IG9mICR7b3V0T2Z9YCk7XG4gICAgICAgICQodGhpcy5oaXN0QnV0dG9uKS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5oaXN0QnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5oaXN0b3J5U2NydWJiZXIgPSBzY3J1YmJlcjtcbiAgICAgICAgJChzY3J1YmJlckRpdikuaW5zZXJ0QWZ0ZXIodGhpcy5ydW5CdXR0b24pO1xuICAgIH0gLy8gZW5kIGRlZmluaXRpb24gb2YgaGVscGVyXG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHBhcmVudCBkaXYgd2l0aCB0d28gZWxlbWVudHM6ICBwcmUgZm9yIHN0YW5kYXJkIG91dHB1dCBhbmQgYSBkaXZcbiAgICAgICAgLy8gdG8gaG9sZCB0dXJ0bGUgZ3JhcGhpY3Mgb3V0cHV0LiAgV2UgdXNlIGEgZGl2IGluIGNhc2UgdGhlIHR1cnRsZSBjaGFuZ2VzIGZyb21cbiAgICAgICAgLy8gdXNpbmcgYSBjYW52YXMgdG8gdXNpbmcgc29tZSBvdGhlciBlbGVtZW50IGxpa2Ugc3ZnIGluIHRoZSBmdXR1cmUuXG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXQgY29sLW1kLTEyXCIpO1xuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICB0aGlzLm91dHB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRvdXRcIjtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICAgICAgdGhpcy5ncmFwaGljcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuZ3JhcGhpY3MuaWQgPSB0aGlzLmRpdmlkICsgXCJfZ3JhcGhpY3NcIjtcbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5hZGRDbGFzcyhcImFjLWNhbnZhc1wiKTtcbiAgICAgICAgLy8gVGhpcyBiaXQgb2YgbWFnaWMgYWRkcyBhbiBldmVudCB3aGljaCB3YWl0cyBmb3IgYSBjYW52YXMgY2hpbGQgdG8gYmUgY3JlYXRlZCBvbiBvdXJcbiAgICAgICAgLy8gbmV3bHkgY3JlYXRlZCBkaXYuICBXaGVuIGEgY2FudmFzIGNoaWxkIGlzIGFkZGVkIHdlIGFkZCBhIG5ldyBjbGFzcyBzbyB0aGF0IHRoZSB2aXNpYmxlXG4gICAgICAgIC8vIGNhbnZhcyBjYW4gYmUgc3R5bGVkIGluIENTUy4gIFdoaWNoIGEgdGhlIG1vbWVudCBtZWFucyBqdXN0IGFkZGluZyBhIGJvcmRlci5cbiAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5vbihcbiAgICAgICAgICAgIFwiRE9NTm9kZUluc2VydGVkXCIsXG4gICAgICAgICAgICBcImNhbnZhc1wiLFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5ncmFwaGljcykuYWRkQ2xhc3MoXCJ2aXNpYmxlLWFjLWNhbnZhc1wiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5vdXRwdXQpO1xuICAgICAgICBvdXREaXYuYXBwZW5kQ2hpbGQodGhpcy5ncmFwaGljcyk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGxlbnNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBsZW5zRGl2LmlkID0gYCR7dGhpcy5kaXZpZH1fY29kZWxlbnNgO1xuICAgICAgICAkKGxlbnNEaXYpLmFkZENsYXNzKFwiY29sLW1kLTEyXCIpO1xuICAgICAgICAkKGxlbnNEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmNvZGVsZW5zID0gbGVuc0RpdjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsZW5zRGl2KTtcbiAgICAgICAgdmFyIGNvYWNoRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjb2FjaERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgICQoY29hY2hEaXYpLmNzcyhcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IGNvYWNoRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNvYWNoRGl2KTtcbiAgICAgICAgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cblxuICAgIGRpc2FibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnNhdmVCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5zYXZlQnV0dG9uKS5hdHRyKFwidGl0bGVcIiwgXCJMb2dpbiB0byBzYXZlIHlvdXIgY29kZVwiKTtcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sb2FkQnV0dG9uKS5hdHRyKFwidGl0bGVcIiwgXCJMb2dpbiB0byBsb2FkIHlvdXIgY29kZVwiKTtcbiAgICB9XG5cbiAgICBkb3dubG9hZEZpbGUobGFuZykge1xuICAgICAgICB2YXIgZm5iID0gdGhpcy5kaXZpZDtcbiAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgZmlsZU5hbWUgPVxuICAgICAgICAgICAgZm5iICtcbiAgICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICAgIGRcbiAgICAgICAgICAgICAgICAudG9KU09OKClcbiAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIDEwKSAvLyByZXZlcnNlIGRhdGUgZm9ybWF0XG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiLVwiKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiXCIpICtcbiAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgIGxhbmd1YWdlRXh0ZW5zaW9uc1tsYW5nXTtcbiAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICBpZiAoXCJCbG9iXCIgaW4gd2luZG93KSB7XG4gICAgICAgICAgICB2YXIgdGV4dFRvV3JpdGUgPSBjb2RlLnJlcGxhY2UoL1xcbi9nLCBcIlxcclxcblwiKTtcbiAgICAgICAgICAgIHZhciB0ZXh0RmlsZUFzQmxvYiA9IG5ldyBCbG9iKFt0ZXh0VG9Xcml0ZV0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHQvcGxhaW5cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKFwibXNTYXZlT3JPcGVuQmxvYlwiIGluIG5hdmlnYXRvcikge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHRleHRGaWxlQXNCbG9iLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuaW5uZXJIVE1MID0gXCJEb3dubG9hZCBGaWxlXCI7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmhyZWYgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0ZXh0RmlsZUFzQmxvYik7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvd25sb2FkTGluayk7XG4gICAgICAgICAgICAgICAgZG93bmxvYWRMaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbGVydChcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBIVE1MNSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZUdyYWRlU3VtbWFyeSgpIHtcbiAgICAgICAgLy8gZ2V0IGdyYWRlIGFuZCBjb21tZW50cyBmb3IgdGhpcyBhc3NpZ25tZW50XG4gICAgICAgIC8vIGdldCBzdW1tYXJ5IG9mIGFsbCBncmFkZXMgZm9yIHRoaXMgc3R1ZGVudFxuICAgICAgICAvLyBkaXNwbGF5IGdyYWRlcyBpbiBtb2RhbCB3aW5kb3dcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0YXNzaWdubWVudGdyYWRlXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgbGV0IHJlcG9ydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdmFyIGJvZHk7XG4gICAgICAgIC8vIGNoZWNrIGZvciByZXBvcnRbJ21lc3NhZ2UnXVxuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgICBpZiAocmVwb3J0W1widmVyc2lvblwiXSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gbmV3IHZlcnNpb247IHdvdWxkIGJlIGJldHRlciB0byBlbWJlZCB0aGlzIGluIEhUTUwgZm9yIHRoZSBhY3RpdmVjb2RlXG4gICAgICAgICAgICAgICAgYm9keSA9XG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlRoaXMgcXVlc3Rpb246IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl07XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFtcInJlbGVhc2VkXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCIgb3V0IG9mIFwiICsgcmVwb3J0W1wibWF4XCJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ICs9IFwiPC9wPiA8cD5cIjtcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0W1wicmVsZWFzZWRcIl0gPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIlByZWxpbWluYXJ5IENvbW1lbnRzOiBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSArPSByZXBvcnRbXCJjb21tZW50XCJdICsgXCI8L3A+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJvZHkgPVxuICAgICAgICAgICAgICAgICAgICBcIjxoND5HcmFkZSBSZXBvcnQ8L2g0PlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGlzIGFzc2lnbm1lbnQ6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+XCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJjb21tZW50XCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPk51bWJlciBvZiBncmFkZWQgYXNzaWdubWVudHM6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiY291bnRcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+QXZlcmFnZSBzY29yZTogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJhdmdcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkgPSBcIjxoND5UaGUgc2VydmVyIGRpZCBub3QgcmV0dXJuIGFueSBncmFkZSBpbmZvcm1hdGlvbjwvaDQ+XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGh0bWwgPSBgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgY29tcGFyZS1tb2RhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QXNzaWdubWVudCBGZWVkYmFjazwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7Ym9keX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB2YXIgZWwgPSAkKGh0bWwpO1xuICAgICAgICBlbC5tb2RhbCgpO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93Q29kZWxlbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbCA9IHRoaXMuY29kZWxlbnMuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGNsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnJlbW92ZUNoaWxkKGNsKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKGZhbHNlKTtcbiAgICAgICAgdmFyIG15VmFycyA9IHt9O1xuICAgICAgICBteVZhcnMuY29kZSA9IGNvZGU7XG4gICAgICAgIG15VmFycy5vcmlnaW4gPSBcIm9wdC1mcm9udGVuZC5qc1wiO1xuICAgICAgICBteVZhcnMuY3VtdWxhdGl2ZSA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuaGVhcFByaW1pdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLmRyYXdQYXJlbnRQb2ludGVycyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMudGV4dFJlZmVyZW5jZXMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnNob3dPbmx5T3V0cHV0cyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMucmF3SW5wdXRMc3RKU09OID0gSlNPTi5zdHJpbmdpZnkoW10pO1xuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcInB5dGhvblwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5weXRob24zKSB7XG4gICAgICAgICAgICAgICAgbXlWYXJzLnB5ID0gMztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbXlWYXJzLnB5ID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhbmdhdWdlID09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICBteVZhcnMucHkgPSBcImpzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBteVZhcnMucHkgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICB9XG4gICAgICAgIG15VmFycy5jdXJJbnN0ciA9IDA7XG4gICAgICAgIG15VmFycy5jb2RlRGl2V2lkdGggPSAzNTA7XG4gICAgICAgIG15VmFycy5jb2RlRGl2SGVpZ2h0ID0gNDAwO1xuICAgICAgICB2YXIgc3JjVVJMID0gXCJodHRwczovL3B5dGhvbnR1dG9yLmNvbS9pZnJhbWUtZW1iZWQuaHRtbFwiO1xuICAgICAgICB2YXIgc3JjVmFycyA9ICQucGFyYW0obXlWYXJzKTtcbiAgICAgICAgdmFyIGVtYmVkVXJsU3RyID0gYCR7c3JjVVJMfSMke3NyY1ZhcnN9YDtcbiAgICAgICAgdmFyIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5kaXZpZCArIFwiX2NvZGVsZW5zXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwMFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiNTAwXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLmJhY2tncm91bmQgPSBcIiNmZmZcIjtcbiAgICAgICAgLy9teUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIixzcmNVUkwpXG4gICAgICAgIG15SWZyYW1lLnNyYyA9IGVtYmVkVXJsU3RyO1xuICAgICAgICB0aGlzLmNvZGVsZW5zLmFwcGVuZENoaWxkKG15SWZyYW1lKTtcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiY29kZWxlbnNcIixcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyA8aWZyYW1lIGlkPVwiJShkaXZpZClzX2NvZGVsZW5zXCIgd2lkdGg9XCI4MDBcIiBoZWlnaHQ9XCI1MDBcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2tcInNyYz1cIiNcIj5cbiAgICAvLyA8L2lmcmFtZT5cbiAgICBzaG93Q29kZUNvYWNoKCkge1xuICAgICAgICB2YXIgbXlJZnJhbWU7XG4gICAgICAgIHZhciBzcmNVUkw7XG4gICAgICAgIHZhciBjbDtcbiAgICAgICAgdmFyIGRpdl9pZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIGlmICh0aGlzLmNvZGVjb2FjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2guc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICBjbCA9IHRoaXMuY29kZWNvYWNoLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2gucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICB9XG4gICAgICAgIHNyY1VSTCA9IGVCb29rQ29uZmlnLmFwcCArIFwiL2FkbWluL2RpZmZ2aWV3ZXI/ZGl2aWQ9XCIgKyBkaXZfaWQ7XG4gICAgICAgIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgZGl2X2lkICsgXCJfY29hY2hcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiODAwcHhcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMHB4XCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLmJhY2tncm91bmQgPSBcIiNmZmZcIjtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgbXlJZnJhbWUuc3JjID0gc3JjVVJMO1xuICAgICAgICB0aGlzLmNvZGVjb2FjaC5hcHBlbmRDaGlsZChteUlmcmFtZSk7XG4gICAgICAgICQodGhpcy5jb2RlY29hY2gpLnNob3coKTtcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiY29hY2hcIixcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvZ2dsZUVkaXRvclZpc2liaWxpdHkoKSB7fVxuXG4gICAgYWRkRXJyb3JNZXNzYWdlKGVycikge1xuICAgICAgICAvLyBBZGQgdGhlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5lcnJMYXN0UnVuID0gdHJ1ZTtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lciA9IHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5jbGFzc05hbWUgPSBcImVycm9yIGFsZXJ0IGFsZXJ0LWRhbmdlclwiO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZXJySGVhZFswXSk7XG4gICAgICAgIHZhciBlcnJUZXh0ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKVxuICAgICAgICApO1xuICAgICAgICAvLyBCdXQsIGFkanVzdCB0aGUgbGluZSBudW1iZXJzLiAgSWYgdGhlIGxpbmUgbnVtYmVyIGlzIDw9IHByZXRleHRMaW5lcyB0aGVuIGl0IGlzIGluIGluY2x1ZGVkIGNvZGVcbiAgICAgICAgLy8gaWYgaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgaW5jbHVkZWQgbGluZXMgYnV0IGxlc3MgdGhhbiB0aGUgcHJldGV4dCArIGN1cnJlbnQgZWRpdG9yIHRoZW4gaXQgaXMgaW4gdGhlIHN0dWRlbnQgY29kZS5cbiAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW5lIG51bWJlciB3ZSBkaXNwbGF5IGJ5IGVsaW1pbmF0aW5nIHRoZSBwcmUtaW5jbHVkZWQgY29kZS5cbiAgICAgICAgaWYgKGVyci50cmFjZWJhY2subGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIHZhciBlcnJvckxpbmUgPSBlcnIudHJhY2ViYWNrWzBdLmxpbmVubztcbiAgICAgICAgICAgIGlmIChlcnJvckxpbmUgPD0gdGhpcy5wcmV0ZXh0TGluZXMpIHtcbiAgICAgICAgICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9XG4gICAgICAgICAgICAgICAgICAgIFwiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGhpZGRlbiwgaW5jbHVkZWQgY29kZS4gU29ycnkgd2UgY2FuJ3QgZ2l2ZSB5b3UgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3JMaW5lID4gdGhpcy5wcm9nTGluZXMgKyB0aGlzLnByZXRleHRMaW5lcykge1xuICAgICAgICAgICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gYEFuIGVycm9yIG9jY3VycmVkIGFmdGVyIHRoZSBlbmQgb2YgeW91ciBjb2RlLlxuT25lIHBvc3NpYmxlIHJlYXNvbiBpcyB0aGF0IHlvdSBoYXZlIGFuIHVuY2xvc2VkIHBhcmVudGhlc2lzIG9yIHN0cmluZy5cbkFub3RoZXIgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgaGlkZGVuIHRlc3QgY29kZS5cbllldCBhbm90aGVyIGlzIHRoYXQgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IuICBUaGUgaW50ZXJuYWwgZXJyb3IgbWVzc2FnZSBpczogJHtlcnIubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dExpbmVzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnIudHJhY2ViYWNrWzBdLmxpbmVubyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIudHJhY2ViYWNrWzBdLmxpbmVubyAtIHRoaXMucHJldGV4dExpbmVzICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVyclN0cmluZyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICB2YXIgdG8gPSBlcnJTdHJpbmcuaW5kZXhPZihcIjpcIik7XG4gICAgICAgIHZhciBlcnJOYW1lID0gZXJyU3RyaW5nLnN1YnN0cmluZygwLCB0byk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyU3RyaW5nO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikuYXBwZW5kKFwiPGgzPkRlc2NyaXB0aW9uPC9oMz5cIik7XG4gICAgICAgIHZhciBlcnJEZXNjID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpKTtcbiAgICAgICAgZXJyRGVzYy5pbm5lckhUTUwgPSBlcnJvclRleHRbZXJyTmFtZV07XG4gICAgICAgICQodGhpcy5lQ29udGFpbmVyKS5hcHBlbmQoXCI8aDM+VG8gRml4PC9oMz5cIik7XG4gICAgICAgIHZhciBlcnJGaXggPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICBlcnJGaXguaW5uZXJIVE1MID0gZXJyb3JUZXh0W2Vyck5hbWUgKyBcIkZpeFwiXTtcbiAgICAgICAgdmFyIG1vcmVJbmZvID0gXCIuLi9FcnJvckhlbHAvXCIgKyBlcnJOYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5odG1sXCI7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJSdW50aW1lIEVycm9yOiBcIiArIGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gICAgc2V0VGltZUxpbWl0KHRpbWVyKSB7XG4gICAgICAgIHZhciB0aW1lbGltaXQgPSB0aGlzLnRpbWVsaW1pdDtcbiAgICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRpbWVsaW1pdCA9IHRpbWVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBleGVjTGltaXQgaW4gbWlsbGlzZWNvbmRzICAtLSBmb3Igc3R1ZGVudCBwcm9qZWN0cyBzZXQgdGhpcyB0b1xuICAgICAgICAvLyAyNSBzZWNvbmRzIC0tIGp1c3QgbGVzcyB0aGFuIENocm9tZSdzIG93biB0aW1lci5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbnRpbWVyXCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib25jbGlja1wiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9ua2V5XCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwic2V0RGVsYXlcIikgPiAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWxpbWl0ID09PSBcIm9mZlwiKSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZWxpbWl0KSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gdGltZWxpbWl0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSAyNTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsdGluUmVhZCh4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVt4XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kXCIsIHgpO1xuICAgICAgICByZXR1cm4gU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1beF07XG4gICAgfVxuICAgIGZpbGVSZWFkZXIoZGl2aWQpIHtcbiAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtID09IG51bGwgJiYgU2suYnVpbHRpbkZpbGVzLmZpbGVzLmhhc093blByb3BlcnR5KGRpdmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW2RpdmlkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRyeSByZW1vdGUgZmlsZSB1bmxlc3MgaXQgZW5kcyB3aXRoIC5qcyBvciAucHkgLS0gb3RoZXJ3aXNlIHdlJ2xsIGFzayB0aGUgc2VydmVyIGZvciBhbGxcbiAgICAgICAgICAgIC8vIGtpbmRzIG9mIG1vZHVsZXMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGltcG9ydFxuICAgICAgICAgICAgaWYgKCEoZGl2aWQuZW5kc1dpdGgoXCIuanNcIikgfHwgZGl2aWQuZW5kc1dpdGgoXCIucHlcIikpKSB7XG4gICAgICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGRhdGEpLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCAmJiByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXJcIiwgZGl2aWQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIG91dHB1dGZ1bih0ZXh0KSB7XG4gICAgICAgIC8vIGJubSBweXRob24gM1xuICAgICAgICB2YXIgcHlTdHIgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIltcIiArIHguam9pbihcIiwgXCIpICsgXCJdXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgeCA9IHRleHQ7XG4gICAgICAgIGlmICghdGhpcy5weXRob24zKSB7XG4gICAgICAgICAgICBpZiAoeC5jaGFyQXQoMCkgPT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB4ID0geC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgeCA9IFwiW1wiICsgeCArIFwiXVwiO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4bCA9IGV2YWwoeCk7XG4gICAgICAgICAgICAgICAgICAgIHhsID0geGwubWFwKHB5U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgeCA9IHhsLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcbiAgICAgICAgdGV4dCA9IHg7XG4gICAgICAgIHRleHQgPSB0ZXh0XG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5hcHBlbmQodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmaWxld3JpdGVyKGZvYmosIGJ5dGVzKSB7XG4gICAgICAgIGxldCBmaWxlY29tcG9uZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9iai5uYW1lKTtcbiAgICAgICAgaWYgKCFmaWxlY29tcG9uZW50KSB7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICQoY29udGFpbmVyKS5hZGRDbGFzcyhcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgICAgIGxldCB0YWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgJCh0YWIpLmFkZENsYXNzKFwiZGF0YWZpbGVfY2FwdGlvblwiKTtcbiAgICAgICAgICAgIHRhYi5pbm5lckhUTUwgPSBgRGF0YSBmaWxlOiA8Y29kZT4ke2ZvYmoubmFtZX08L2NvZGU+YDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LnJvd3MgPSAxMDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQuY29scyA9IDUwO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5pZCA9IGZvYmoubmFtZTtcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuY3NzKFwibWFyZ2luLWJvdHRvbVwiLCBcIjVweFwiKTtcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxlY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb2JqLnBvcyQgPT0gMCkge1xuICAgICAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkudmFsKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50ID0gJChmaWxlY29tcG9uZW50KS52YWwoKTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgKyBieXRlcy52O1xuICAgICAgICAkKGZpbGVjb21wb25lbnQpLnZhbChjdXJyZW50KTtcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XG4gICAgICAgIGZvYmoucG9zJCA9IGN1cnJlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gY3VycmVudC5sZW5ndGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0SW5jbHVkZWRDb2RlKGRpdmlkKSB7XG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0W2RpdmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5lZExpc3RbZGl2aWRdLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICBgL3J1bmVzdG9uZS9hamF4L2dldF9kYXRhZmlsZT9jb3Vyc2VfaWQ9JHtlQm9va0NvbmZpZy5jb3Vyc2V9JmFjaWQ9JHtkaXZpZH1gLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgd3Jlc3VsdCA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IG9iaiA9IGF3YWl0IHdyZXN1bHQuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG9iai5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGRQcm9nKHVzZVN1ZmZpeCkge1xuICAgICAgICAvLyBhc3NlbWJsZSBjb2RlIGZyb20gcHJlZml4LCBzdWZmaXgsIGFuZCBlZGl0b3IgZm9yIHJ1bm5pbmcuXG4gICAgICAgIHZhciBwcmV0ZXh0O1xuICAgICAgICB2YXIgcHJvZyA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCkgKyBcIlxcblwiO1xuICAgICAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHByb2cgPSB0aGlzLnByZWZpeCArIHByb2c7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV0ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAwO1xuICAgICAgICB0aGlzLnByb2dMaW5lcyA9IHByb2cubWF0Y2goL1xcbi9nKS5sZW5ndGggKyAxO1xuICAgICAgICBpZiAodGhpcy5pbmNsdWRlcykge1xuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBpbmNsdWRlcywgaW4tb3JkZXIgcHJlcGVuZGluZyB0byBwcm9nXG4gICAgICAgICAgICBwcmV0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5pbmNsdWRlcy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGxldCBpQ29kZSA9IGF3YWl0IHRoaXMuZ2V0SW5jbHVkZWRDb2RlKHRoaXMuaW5jbHVkZXNbeF0pO1xuICAgICAgICAgICAgICAgIHByZXRleHQgPSBwcmV0ZXh0ICsgaUNvZGUgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmV0ZXh0ID0gcHJldGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXRleHRMaW5lcyA9ICh0aGlzLnByZXRleHQubWF0Y2goL1xcbi9nKSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9nID0gcHJldGV4dCArIHByb2c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZVN1ZmZpeCAmJiB0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgcHJvZyA9IHByb2cgKyB0aGlzLnN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2cpO1xuICAgIH1cblxuICAgIGFzeW5jIG1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSkge1xuICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT09IG51bGwgJiYgIXRoaXMuYXV0b3J1bikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciAmJlxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5WyQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXSAhPVxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmdldFZhbHVlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCkpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVpdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIkZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJGYWxzZVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYXZlQ29kZTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2coKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGVycm9yIHJ1bm5pbmcgY29kZSAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgZXJyaW5mbzogdGhpcy5lcnJpbmZvLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsIGRhdGFbJ2NvZGUnXSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmxvZ1J1bkV2ZW50KGRhdGEpOyAvLyBMb2cgdGhlIHJ1biBldmVudFxuICAgICAgICAvLyBJZiB1bml0IHRlc3RzIHdlcmUgcnVuIHRoZXJlIHdpbGwgYmUgYSB1bml0X3Jlc3VsdHNcbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIC8vIFRoZSBweXRob24gdW5pdCB0ZXN0IGNvZGUgYnVpbGRzIHRoZSB0YWJsZSBhcyBpdCBpcyBydW5uaW5nIHRoZSB0ZXN0c1xuICAgICAgICAvLyBJbiBcIm5vcm1hbFwiIHVzYWdlIHRoaXMgaXMgZGlzcGxheWVkIGltbWVkaWF0ZWx5LlxuICAgICAgICAvLyBIb3dldmVyIGluIGV4YW0gbW9kZSB3ZSBtYWtlIGEgZGl2IHdoaWNoIGlzIG9mZnNjcmVlblxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHNfZGl2aWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0c19kaXZpZC5pbmRleE9mKFwiX29mZnNjcmVlbl9cIikgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSBgJHt0aGlzLmRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYDtcbiAgICAgICAgICAgICAgICBsZXQgdW5pdEZlZWRiYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodW5pdEZlZWRiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wID0gJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCh0bXApLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfdW5pdF9yZXN1bHRzXCI7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YCkubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodXJSZXN1bHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBydW5Qcm9nIGhhcyBzZXZlcmFsIGFzeW5jIGVsZW1lbnRzIHRvIGl0LlxuICAgICAqIDEuIFNrdWxwdCBydW5zIHRoZSBweXRob24gcHJvZ3JhbSBhc3luY2hyb25vdXNseVxuICAgICAqIDIuIFRoZSBoaXN0b3J5IGlzIHJlc3RvcmVkIGFzeW5jaHJvbm91c2x5XG4gICAgICogMy4gTG9nZ2luZyBpcyBhc3luY2hyb25vdXNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNrdWxwdCBQcm9taXNlIGFuZCBzbyB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBza3VscHQgaXMgZmluaXNoZWQuXG4gICAgICogd2hlbiBmaW5pc2hlZCB0aGlzLnVuaXRfcmVzdWx0cyB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdHMgb2YgYW55IHVuaXQgdGVzdHMgdGhhdCBoYXZlIGJlZW4gcnVuLlxuICAgICAqIFRoZSB0YWJsZSBvZiByZXN1bHRzIGlzIGNvbnN0cnVjdGVkIGFuZCBhZGRlZCB0byB0aGUgRE9NIGJ5IHRoZSBweXRob24gdW5pdHRlc3QuZ3VpIG1vZHVsZSBpbiBza3VscHQuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJzdGFydGluZyBydW5Qcm9nXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGxvZ1Jlc3VsdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygbm9VSSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIG5vVUkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIHdoaWxlICgkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fZXJyaW5mb2ApLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucykge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBTay5jb25maWd1cmUoe1xuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLm91dHB1dGZ1bi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVhZDogdGhpcy5maWxlUmVhZGVyLFxuICAgICAgICAgICAgZmlsZXdyaXRlOiB0aGlzLmZpbGV3cml0ZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIF9fZnV0dXJlX186IFNrLnB5dGhvbjMsXG4gICAgICAgICAgICBub25yZWFkb3BlbjogdHJ1ZSxcbiAgICAgICAgICAgIC8vICAgICAgICBweXRob24zOiB0aGlzLnB5dGhvbjMsXG4gICAgICAgICAgICBpbWFnZVByb3h5OiBcImh0dHA6Ly9pbWFnZS5ydW5lc3RvbmUuYWNhZGVteTo4MDgwLzMyMHhcIixcbiAgICAgICAgICAgIGlucHV0ZnVuVGFrZXNQcm9tcHQ6IHRydWUsXG4gICAgICAgICAgICBqc29ucFNpdGVzOiBbXCJodHRwczovL2l0dW5lcy5hcHBsZS5jb21cIl0sXG4gICAgICAgIH0pO1xuICAgICAgICBTay5kaXZpZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIFNrLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsdGhpcy5jb2RlKTtcblxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgJiYgdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikpIHtcbiAgICAgICAgICAgIFNrLmdyYWRlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTay5ncmFkZUNvbnRhaW5lciA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUaW1lTGltaXQoKTtcbiAgICAgICAgKFNrLlR1cnRsZUdyYXBoaWNzIHx8IChTay5UdXJ0bGVHcmFwaGljcyA9IHt9KSkudGFyZ2V0ID0gdGhpcy5ncmFwaGljcztcbiAgICAgICAgU2suY2FudmFzID0gdGhpcy5ncmFwaGljcy5pZDsgLy90b2RvOiBnZXQgcmlkIG9mIHRoaXMgaGVyZSBhbmQgaW4gaW1hZ2VcbiAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIodGhpcy5zYXZlQ29kZSk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9mZihcInNsaWRlY2hhbmdlXCIpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICQodGhpcy5vdXREaXYpLnNob3coe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA3MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2suaW1wb3J0TWFpbldpdGhCb2R5KFwiPHN0ZGluPlwiLCBmYWxzZSwgcHJvZywgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJlbmFibGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJlbmFibGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVycmluZm8gPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3JNZXNzYWdlKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5hbGxWaXN1YWxpemVycyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgJC5lYWNoKHdpbmRvdy5hbGxWaXN1YWxpemVycywgZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5yZWRyYXdDb25uZWN0b3JzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLmNvZGVEaXYpLmFkZENsYXNzKFwiYWMtZGlzYWJsZWRcIik7XG4gICAgfVxufVxuXG52YXIgbGFuZ3VhZ2VFeHRlbnNpb25zID0ge1xuICAgIHB5dGhvbjogXCJweVwiLFxuICAgIGh0bWw6IFwiaHRtbFwiLFxuICAgIGphdmFzY3JpcHQ6IFwianNcIixcbiAgICBqYXZhOiBcImphdmFcIixcbiAgICBweXRob24yOiBcInB5XCIsXG4gICAgcHl0aG9uMzogXCJweVwiLFxuICAgIGNwcDogXCJjcHBcIixcbiAgICBjOiBcImNcIixcbiAgICBzcWw6IFwic3FsXCIsXG4gICAgb2N0YXZlOiBcIm1cIixcbn07XG5cbnZhciBlcnJvclRleHQgPSB7fTtcblxuZXJyb3JUZXh0LlBhcnNlRXJyb3IgPSAkLmkxOG4oXCJtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvclwiKTtcbmVycm9yVGV4dC5QYXJzZUVycm9yRml4ID0gJC5pMThuKFwibXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlR5cGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JcIik7XG5lcnJvclRleHQuVHlwZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuTmFtZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvclwiKTtcbmVycm9yVGV4dC5OYW1lRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5WYWx1ZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JcIik7XG5lcnJvclRleHQuVmFsdWVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvclwiKTtcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVG9rZW5FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlRva2VuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVGltZUxpbWl0RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yXCIpO1xuZXJyb3JUZXh0LlRpbWVMaW1pdEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuU3ludGF4RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JcIik7XG5lcnJvclRleHQuU3ludGF4RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkluZGV4RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbmRleEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlVSSUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlVSSUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbXBvcnRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbXBvcnRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuUmVmZXJlbmNlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JcIik7XG5lcnJvclRleHQuUmVmZXJlbmNlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5aZXJvRGl2aXNpb25FcnJvckZpeCA9ICQuaTE4bihcbiAgICBcIm1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4XCJcbik7XG5lcnJvclRleHQuUmFuZ2VFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlJhbmdlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW50ZXJuYWxFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkludGVybmFsRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW5kZW50YXRpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuTm90SW1wbGVtZW50ZWRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvclwiKTtcbmVycm9yVGV4dC5Ob3RJbXBsZW1lbnRlZEVycm9yRml4ID0gJC5pMThuKFxuICAgIFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeFwiXG4pO1xuZXJyb3JUZXh0LktleUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yXCIpO1xuZXJyb3JUZXh0LktleUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Bc3NlcnRpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5Bc3NlcnRpb25FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXhcIik7XG5cblN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uICh0YXJnZXQsIHJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaXQodGFyZ2V0KS5qb2luKHJlcGxhY2VtZW50KTtcbn07XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcnl0aG9uQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMucHl0aG9uM19pbnRlcnByZXRlciA9ICQob3JpZykuZGF0YShcInB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuc3dpdGNoQ2xhc3MoXCJjb2wtbWQtMTJcIiwgXCJjb2wtbWQtNlwiLCB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBwcm9nID0gYFxuICAgICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2JyeXRob25AMy45LjUvYnJ5dGhvbi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYnJ5dGhvbkAzLjkuNS9icnl0aG9uX3N0ZGxpYi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9zdHlsZXMvZGVmYXVsdC5taW4uY3NzXCI+XG4gICAgICAgICAgICA8c2NyaXB0IHNyYz1cIi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS4wLjEvaGlnaGxpZ2h0Lm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPHN0eWxlPlxuICAgICAgICAgICAgICAgIGh0bWwsIGJvZHl7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogbWF4LWNvbnRlbnQ7IHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAuY29udGFpbmVyLXByZXtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDM7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDsgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7IGJvdHRvbTogMHB4OyB3aWR0aDogOTQlOyBtYXgtd2lkdGg6IDk2JTsgbWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93OiBhdXRvOyBjbGVhcjogYm90aDsgcmVzaXplOiBib3RoOyB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJlIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0aWNreTsgcGFkZGluZzogMTJweDsgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGV7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5IG9ubG9hZD0nYnJ5dGhvbigpJz5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0ndGV4dC9weXRob24nPlxuaW1wb3J0IHN5c1xuZnJvbSBicm93c2VyIGltcG9ydCBkb2N1bWVudCwgaHRtbFxuaW1wb3J0IHRyYWNlYmFja1xucHJlRWxlbSA9IGh0bWwuUFJFKClcbmxvZ2dlciA9IGh0bWwuQ09ERSgpXG5jb250YWluZXIgPSBodG1sLkRJVigpXG5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNvbnRhaW5lci1wcmVcIilcbnByZUVsZW0gPD0gbG9nZ2VyXG5jb250YWluZXIgPD0gcHJlRWxlbVxuY2xhc3MgTmV3T3V0OlxuICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKTpcbiAgICAgICAgbG9nZ2VyLmlubmVySFRNTCArPSBzdHIoZGF0YSlcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIlxuc3lzLnN0ZGVyciA9IHN5cy5zdGRvdXQgPSBOZXdPdXQoKVxuZGVmIG15X2V4ZWMoY29kZSk6XG4gICAgdHJ5OlxuICAgICAgICBleGVjKGNvZGUsIGxvY2FscygpKVxuICAgICAgICBvdXRfaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRcIilcbiAgICAgICAgb3V0X2hlYWRlci5pbm5lckhUTUwgPSBcIk91dHB1dFwiXG4gICAgICAgIG91dF9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcbiAgICAgICAgbG9nZ2VyLmNsYXNzTGlzdC5hZGQoXCJwbGFpbnRleHRcIilcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKG91dF9oZWFkZXIpXG4gICAgICAgIGRvY3VtZW50IDw9IGNvbnRhaW5lclxuICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlcnI6XG4gICAgICAgIGVycm9yX2NsYXNzID0gZXJyLl9fY2xhc3NfXy5fX25hbWVfX1xuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxuICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge2Vyci5saW5lbm99XCJcbiAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlcnI6XG4gICAgICAgIGVycm9yX2NsYXNzID0gZXJyLl9fY2xhc3NfXy5fX25hbWVfX1xuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxuICAgICAgICBjbCwgZXhjLCB0YiA9IHN5cy5leGNfaW5mbygpXG4gICAgICAgICMgV2hlbiBlcnJvcnMgZG9uJ3Qgc3BlY2lmeSBhIGxpbmVcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgbGluZV9udW1iZXIgPSBmXCJhdCBsaW5lIHt0cmFjZWJhY2suZXh0cmFjdF90Yih0YilbLTFdWzFdfVwiXG4gICAgICAgIGV4Y2VwdDpcbiAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gXCJcIlxuICAgIGVsc2U6XG4gICAgICAgIHJldHVyblxuICAgIFxuICAgICMgVGhpcyBpcyBvbmx5IGRvbmUgaWYgYW4gRXhjZXB0aW9uIHdhcyBjYXRjaGVkXG4gICAgcmVzdWx0ID0gZlwiJ3tlcnJvcl9jbGFzc30nOiB7ZGV0YWlsfSB7bGluZV9udW1iZXJ9XCJcbiAgICBwcmludChyZXN1bHQpXG4gICAgIyBTdHlsaW5nIHRoZSBwcmUgZWxlbWVudCBmb3IgZXJyb3JcbiAgICBlcnJvcl9oZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDNcIilcbiAgICBlcnJvcl9oZWFkZXIuaW5uZXJIVE1MID0gXCJFcnJvclwiXG4gICAgZXJyb3JfaGVhZGVyLnN0eWxlLmZvbnQgPSBcIjI0cHggJ0FyaWFsJ1wiXG4gICAgcHJlRWxlbS5wcmVwZW5kKGVycm9yX2hlYWRlcilcbiAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZjJkZWRlXCJcbiAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2ViY2NkMVwiXG4gICAgbG9nZ2VyLmNsYXNzTGlzdC5hZGQoXCJwbGFpbnRleHRcIilcbiAgICBkb2N1bWVudCA8PSBjb250YWluZXJcbm15X3Byb2cgPSAke0pTT04uc3RyaW5naWZ5KHByb2cpfVxubXlfZXhlYyhteV9wcm9nKVxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJobGpzLmhpZ2hsaWdodEFsbCgpO1wiKVxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhaW5lci1wcmUnKTsgbGV0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7IGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFN0cmluZyhoZWlnaHQpKydweCc7XCIpXG4gICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPC9ib2R5PlxuICAgICAgICA8L2h0bWw+XG4gICAgICAgIGA7XG4gICAgICAgIHRoaXMub3V0cHV0LnNyY2RvYyA9IHByb2c7XG4gICAgfVxuXG4gICAgY3JlYXRlT3V0cHV0KCkge1xuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSB0cnVlO1xuICAgICAgICB2YXIgb3V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0XCIpO1xuICAgICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtNVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwid2hpdGVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImhlaWdodFwiLCBcIjQwMHB4XCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29kZSA9ICQoXCI8dGV4dGFyZWEgLz5cIikuaHRtbCh0aGlzLm9yaWdFbGVtLmlubmVySFRNTCkudGV4dCgpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9XG4gICAgICAgICAgICBcIjxzY3JpcHQgdHlwZT10ZXh0L2phdmFzY3JpcHQ+d2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihtc2csdXJsLGxpbmUpIHthbGVydChtc2crJyBvbiBsaW5lOiAnK2xpbmUpO307PC9zY3JpcHQ+XCIgK1xuICAgICAgICAgICAgcHJvZztcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsIFwiNDAwcHhcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB2YXIgc3RyID0gXCJbXCI7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PSBcIm9iamVjdFwiICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhW2ldID09IFwib2JqZWN0XCIgJiYgYVtpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IChpID09IDAgPyBcIlwiIDogXCIgXCIpICsgXCJbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV1bal0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqID09IGFbaV0ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiXVwiICsgKGkgPT0gYS5sZW5ndGggLSAxID8gXCJdXCIgOiBcIixcIikgKyBcIlxcblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc3RyICs9IGFbaV0gKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLCBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB3cml0ZWxuID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgaWYgKCFzdHIpIHN0ciA9IFwiXCI7XG4gICAgICAgICAgICBfdGhpcy5vdXRwdXQuaW5uZXJIVE1MICs9IF90aGlzLm91dHB1dGZ1bihzdHIpICsgXCI8YnIgLz5cIjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZhbChwcm9nKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSBcImhhbmRzb250YWJsZVwiO1xuaW1wb3J0ICdoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MnO1xuaW1wb3J0IGluaXRTcWxKcyBmcm9tIFwic3FsLmpzL2Rpc3Qvc3FsLXdhc20uanNcIjtcblxudmFyIGFsbERidXJscyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgLy8gIGZucHJlZml4IHNldHMgdGhlIHBhdGggdG8gbG9hZCB0aGUgc3FsLXdhc20ud2FzbSBmaWxlXG4gICAgICAgIHZhciBib29rcHJlZml4O1xuICAgICAgICB2YXIgZm5wcmVmaXg7XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IGAke2VCb29rQ29uZmlnLmFwcH0vYm9va3MvcHVibGlzaGVkLyR7ZUJvb2tDb25maWcuYmFzZWNvdXJzZX1gO1xuICAgICAgICAgICAgZm5wcmVmaXggPSBib29rcHJlZml4ICsgXCIvX3N0YXRpY1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBmbnByZWZpeCA9IFwiL19zdGF0aWNcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGxvY2F0ZUZpbGU6IChmaWxlbmFtZSkgPT4gYCR7Zm5wcmVmaXh9LyR7ZmlsZW5hbWV9YCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zaG93TGFzdCA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcInNob3dsYXN0c3FsXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGluaXRTcWxKcyh0aGlzLmNvbmZpZykudGhlbihmdW5jdGlvbiAoU1FMKSB7XG4gICAgICAgICAgICAvLyBzZXQgdXAgY2FsbCB0byBsb2FkIGRhdGFiYXNlIGFzeW5jaHJvbm91c2x5IGlmIGdpdmVuXG4gICAgICAgICAgICBpZiAoc2VsZi5kYnVybCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRidXJsLnN0YXJ0c1dpdGgoXCIvX3N0YXRpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRidXJsID0gYCR7Ym9va3ByZWZpeH0ke3NlbGYuZGJ1cmx9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvblRleHQgPSAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2RiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIShzZWxmLmRidXJsIGluIGFsbERidXJscykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImxvYWRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHhXYWl0Rm9yOiBqUXVlcnkuRGVmZXJyZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0uZGJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiKTtcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2xlcm9jaGEvY2hpbm9vay1kYXRhYmFzZS9yYXcvbWFzdGVyL0NoaW5vb2tEYXRhYmFzZS9EYXRhU291cmNlcy9DaGlub29rX1NxbGl0ZS5zcWxpdGVcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBzZWxmLmRidXJsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKHVJbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYiA9IHVJbnQ4QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5zdGF0dXMgPSBcInJlYWR5XCI7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS54V2FpdEZvci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGlzIG5vdyBbe2NvbHVtbnM6Wydjb2wxJywnY29sMicsLi4uXSwgdmFsdWVzOltbZmlyc3Qgcm93XSwgW3NlY29uZCByb3ddLCAuLi5dfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IG9sZCByZXN1bHRzXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgbGV0IGRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3NxbF9vdXRcIjtcbiAgICAgICAgbGV0IHJlc3BEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGlmIChyZXNwRGl2KSB7XG4gICAgICAgICAgICByZXNwRGl2LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVzcERpdik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgLy8gUnVuIHRoaXMgcXVlcnlcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpOyAvLyBmYWxzZSAtLT4gRG8gbm90IGluY2x1ZGUgc3VmZml4XG4gICAgICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcbiAgICAgICAgICAgICAgICBgRXJyb3I6IERhdGFiYXNlIG5vdCBpbml0aWFsaXplZCEgREJVUkw6ICR7dGhpcy5kYnVybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ID0gdGhpcy5kYi5pdGVyYXRlU3RhdGVtZW50cyhxdWVyeSk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uTmFtZXMoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRhdGEhIHByb2JhYmx5IGEgU0VMRUNUXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc3RhdGVtZW50LmdldCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd2NvdW50OiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5zcWwgPSBzdGF0ZW1lbnQuZ2V0Tm9ybWFsaXplZFNRTCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gbnNxbC5zdWJzdHIoMCwgNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnN0ZXAoKTsgLy8gZXhlY3V0ZSB0aGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVjdCBJTlNFUlQvVVBEQVRFL0RFTEVURSB0byBnaXZlIGZyaWVuZGx5IGZlZWRiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHJvd3MgbW9kaWZpZWQgLSB1bmZvcnR1bmF0ZWx5LCB0aGlzIHdvbid0IGNhdGNoIHN1Y2ggcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHVzZSBDVEVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVsaWFibGUgd2F5IG9mIGtub3dpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhIFNRTGl0ZSBxdWVyeSBhY3R1YWxseSBtb2RpZmllZCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiaW5zZXJ0XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJ1cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IHRoaXMuZGIuZ2V0Um93c01vZGlmaWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJmYWlsdXJlXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHNxbDogaXQuZ2V0UmVtYWluaW5nU1FMKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk5vIHF1ZXJpZXMgc3VibWl0dGVkLlwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byB1cGRhdGUgc2NydWJiZXIgJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHJlc3BEaXYuaWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5vdXREaXYuYXBwZW5kQ2hpbGQocmVzcERpdik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coKTtcbiAgICAgICAgLy8gU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhIGJ1bmNoIG9mIGludGVybWVkaWF0ZSByZXN1bHRzXG4gICAgICAgIC8vIGxpa2Ugd2hlbiB3ZSBhcmUgaW5jbHVkaW5nIGEgYnVuY2ggb2YgcHJldmlvdXMgc3RhdGVtZW50cyBmcm9tXG4gICAgICAgIC8vIG90aGVyIGFjdGl2ZWNvZGVzIEluIHRoYXQgY2FzZSB0aGUgc2hvd2xhc3RzcWwgZmxhZyBjYW4gYmUgc2V0XG4gICAgICAgIC8vIHNvIHdlIG9ubHkgc2hvdyB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgbGV0IHJlc3VsdEFycmF5ID0gdGhpcy5yZXN1bHRzO1xuICAgICAgICBpZiAodGhpcy5zaG93TGFzdCkge1xuICAgICAgICAgICAgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHMuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHIgb2YgcmVzdWx0QXJyYXkpIHtcbiAgICAgICAgICAgIGxldCBzZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHNlY3Rpb24uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0XCIpO1xuICAgICAgICAgICAgcmVzcERpdi5hcHBlbmRDaGlsZChzZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoci5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQodGFibGVEaXYpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gMzUwO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0QXJyYXkubGVuZ3RoID4gMSkgbWF4SGVpZ2h0ID0gMjAwOyAvLyBtYXggaGVpZ2h0IHNtYWxsZXIgaWYgbG90cyBvZiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYmxlKHIsIHRhYmxlRGl2LCBtYXhIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBcInJldHVybmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLnJvd2NvdW50ID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIiAob25seSBmaXJzdCAxMDAgcm93cyBkaXNwbGF5ZWQpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgXCIuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnJvd2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wID0gci5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG9wID0gb3AgKyAob3AuY2hhckF0KG9wLmxlbmd0aCAtIDEpID09PSBcImVcIiA/IFwiZC5cIiA6IFwiZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm1zZyA9IHIucm93Y291bnQgIT09IDEgPyBcIiByb3dzIFwiIDogXCIgcm93IFwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJcIiArIHIucm93Y291bnQgKyBybXNnICsgb3A7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJPcGVyYXRpb24gc3VjY2VlZGVkLlwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9zdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSByLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfZmFpbHVyZVwiKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGhhbmRsZSBhdXRvZ3JhZGluZ1xuICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdCA9IHRoaXMuYXV0b2dyYWRlKFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcImRvbmVcIik7XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudCh7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc3RhdHVzLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQodGhpcy50ZXN0UmVzdWx0KTtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXV0b2dyYWRlKHJlc3VsdF90YWJsZSkge1xuICAgICAgICB2YXIgdGVzdHMgPSB0aGlzLnN1ZmZpeC5zcGxpdCgvXFxuLyk7XG4gICAgICAgIHRoaXMucGFzc2VkID0gMDtcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xuICAgICAgICAvLyBUZXN0cyBzaG91bGQgYmUgb2YgdGhlIGZvcm1cbiAgICAgICAgLy8gYXNzZXJ0IHJvdyxjb2wgb3BlciB2YWx1ZSBmb3IgZXhhbXBsZVxuICAgICAgICAvLyBhc3NlcnQgNCw0ID09IDNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHRlc3RzID0gdGVzdHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICAgICAgICBsZXQgd2xpc3QgPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICB3bGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IGxvYyA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgb3BlciA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSB3bGlzdC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBbcm93LCBjb2xdID0gbG9jLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnRlc3RPbmVBc3NlcnQoXG4gICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICBvcGVyLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgICAgICAgIHJlc3VsdF90YWJsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xuICAgICAgICBwY3QgPSBwY3QudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgICAgICAgcmVzdWx0ICs9IGBZb3UgcGFzc2VkICR7dGhpcy5wYXNzZWR9IG91dCBvZiAke1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxuICAgICAgICB9IHRlc3RzIGZvciAke3BjdH0lYDtcbiAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3BjdH06cGFzc2VkOiR7dGhpcy5wYXNzZWR9OmZhaWxlZDoke3RoaXMuZmFpbGVkfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRlc3RPbmVBc3NlcnQocm93LCBjb2wsIG9wZXIsIGV4cGVjdGVkLCByZXN1bHRfdGFibGUpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHJvdyBhbmQgY29sIGFyZSBpbiBib3VuZHNcbiAgICAgICAgbGV0IGFjdHVhbDtcbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY3R1YWwgPSByZXN1bHRfdGFibGUudmFsdWVzW3Jvd11bY29sXTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCBOb3QgZW5vdWdoIGRhdGEgdG8gY2hlY2sgcm93ICR7cm93fSBvciBjb2x1bW4gJHtjb2x9YDtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCI9PVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiIT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIj5cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPFwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzID0gb3BlcmF0b3JzW29wZXJdKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgUGFzczogJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gcm93ICR7cm93fSBjb2x1bW4gJHtyZXN1bHRfdGFibGUuY29sdW1uc1tjb2xdfWA7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKHRhYmxlRGF0YSwgY29udGFpbmVyLCBtYXhIZWlnaHQpIHtcbiAgICBsZXQgZGF0YSA9IHRhYmxlRGF0YS52YWx1ZXM7XG4gICAgbGV0IHRyaW1Sb3dzID0gdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBrbHVkZ2U6IG5vIGNvbHVtbiBoZWFkZXJzIHdpbGwgc2hvdyB1cCB1bmxlc3Mgd2UgZG8gdGhpc1xuICAgICAgICBkYXRhID0gW3RhYmxlRGF0YS5jb2x1bW5zLm1hcCgoZSkgPT4gbnVsbCldO1xuICAgICAgICB0cmltUm93cyA9IFswXTtcbiAgICB9XG5cbiAgICB2YXIgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgdHJpbVJvd3M6IHRyaW1Sb3dzLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICBhdXRvUm93U2l6ZTogdHJ1ZSxcbiAgICAgICAgYXV0b0NvbHVtblNpemU6IHsgdXNlSGVhZGVyczogdHJ1ZSB9LFxuICAgICAgICByb3dIZWFkZXJzOiBmYWxzZSxcbiAgICAgICAgY29sSGVhZGVyczogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgIGVkaXRvcjogZmFsc2UsXG4gICAgICAgIG1heFJvd3M6IDEwMCxcbiAgICAgICAgZmlsdGVyczogZmFsc2UsXG4gICAgICAgIGRyb3Bkb3duTWVudTogZmFsc2UsXG4gICAgICAgIGxpY2Vuc2VLZXk6IFwibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb25cIixcbiAgICB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgaGVpZ2h0IGFuZCByZXNpemVcbiAgICBsZXQgYWN0dWFsSGVpZ2h0ID0gNDA7IC8vIGhlYWRlciBoZWlnaHQgKyBzbWFsbCBtYXJnaW5cbiAgICBpZiAodGFibGVEYXRhLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gYWN0dWFsSGVpZ2h0ICsgaG90LmdldFJvd0hlaWdodChpKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWxIZWlnaHQgPiBtYXhIZWlnaHQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG90LnVwZGF0ZVNldHRpbmdzKHsgaGVpZ2h0OiBhY3R1YWxIZWlnaHQgfSk7XG5cbiAgICByZXR1cm4gaG90O1xufVxuIiwiaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5cbi8vIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGF1ZGlvIHRvdXJzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdWRpb1RvdXIgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihkaXZpZCwgY29kZSwgYm51bSwgYXVkaW9fdGV4dCkge1xuICAgICAgICAvLyBCdWcgRml4OiBJZiBhIGNsYXNzIGV4dGVuZHMgYW5vdGhlciBjbGFzcywgdGhpcyBpcyB1bmRlZmluZWQgVU5USUwgc3VwZXIgaXMgY2FsbGVkXG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXVkaW9fdG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy50b3VyQnV0dG9ucyA9IFtdO1xuICAgICAgICB0aGlzLmVsZW0gPSBudWxsOyAvLyBjdXJyZW50IGF1ZGlvIGVsZW1lbnQgcGxheWluZ1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IG51bGw7IC8vIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgdGhpcy5sZW4gPSBudWxsOyAvLyBjdXJyZW50IGxlbmd0aCBvZiBhdWRpbyBmaWxlcyBmb3IgdG91clxuICAgICAgICB0aGlzLmJ1dHRvbkNvdW50ID0gbnVsbDsgLy8gbnVtYmVyIG9mIGF1ZGlvIHRvdXIgYnV0dG9uc1xuICAgICAgICB0aGlzLmFuYW1lID0gbnVsbDsgLy8gdGhlIGF1ZGlvIGZpbGUgbmFtZVxuICAgICAgICB0aGlzLmFoYXNoID0gbnVsbDsgLy8gaGFzaCBvZiB0aGUgYXVkaW8gZmlsZSBuYW1lIHRvIHRoZSBsaW5lcyB0byBoaWdobGlnaHRcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IG51bGw7IC8vIGRpdiBpZFxuICAgICAgICB0aGlzLmFmaWxlID0gbnVsbDsgLy8gZmlsZSBuYW1lIGZvciBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsgLy8gZmxhZyB0byBzYXkgaWYgcGxheWluZyBvciBub3RcbiAgICAgICAgdGhpcy50b3VyTmFtZSA9IFwiXCI7XG4gICAgICAgIC8vIFJlcGxhY2luZyBoYXMgYmVlbiBkb25lIGhlcmUgdG8gbWFrZSBzdXJlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgY29kZSBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKnNpbmdsZXEqXCIsIFwiJ1wiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipvcGVuKlwiLCBcIihcIik7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqY2xvc2UqXCIsIFwiKVwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipubGluZSpcIiwgXCI8YnIvPlwiKTtcbiAgICAgICAgdmFyIGNvZGVBcnJheSA9IGNvZGUuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIHZhciBhdWRpb19oYXNoID0gW107XG4gICAgICAgIHZhciBidmFsID0gW107XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3RleHQucmVwbGFjZUFsbChcIipkb3VibGVxKlwiLCAnXCInKTtcbiAgICAgICAgdmFyIGF1ZGlvX3R5cGUgPSBhdHlwZS5zcGxpdChcIiphdHlwZSpcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGF1ZGlvX2hhc2hbaV0gPSBhdWRpb190eXBlW2ldO1xuICAgICAgICAgICAgdmFyIGF3b3JkID0gYXVkaW9fdHlwZVtpXS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICBidmFsLnB1c2goYXdvcmRbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmaXJzdCA9XG4gICAgICAgICAgICBcIjxwcmU+PGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgXCJfbDEnPlwiICtcbiAgICAgICAgICAgIFwiMS4gICBcIiArXG4gICAgICAgICAgICBjb2RlQXJyYXlbMF0gK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIG51bV9saW5lcyA9IGNvZGVBcnJheS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtX2xpbmVzOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgOSkge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDk5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmaXJzdCArIFwiPC9wcmU+XCI7XG4gICAgICAgIC8vbGF5aW5nIG91dCB0aGUgSFRNTCBjb250ZW50XG4gICAgICAgIHZhciBiY291bnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF1ZGlvX3R5cGUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIG5ld0J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tc3VjY2Vzc1wiO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGJ2YWxbaV0ucmVwbGFjZSgvXFxcIi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudG91ckJ1dHRvbnMucHVzaChuZXdCdXR0b24pO1xuICAgICAgICAgICAgYmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyLmFsaWduID0gXCJjZW50ZXJcIjtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZS5hbGlnbiA9IFwibGVmdFwiO1xuICAgICAgICAkKHRoaXMud2luZG93Y29kZSkuaHRtbChmaXJzdCk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLWZhc3QtYmFja3dhcmRcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tc3RlcC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1mb3J3YXJkXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLm5hbWUgPSBcImZpcnN0X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5uYW1lID0gXCJwcmV2X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8ubmFtZSA9IFwicGF1c2VfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLm5hbWUgPSBcIm5leHRfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLm5hbWUgPSBcImxhc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby50aXRsZSA9IFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby50aXRsZSA9IFwiUGxheSBwcmV2aW91cyBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8udGl0bGUgPSBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgZmlyc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGxhc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc3RhdHVzLmNsYXNzTmFtZSA9IFwiYWxlcnQgYWxlcnQtaW5mb1wiO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6IG5vbmU7XCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tZGVmYXVsdFwiO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmlubmVySFRNTCA9IFwiU3RvcCB0b3VyXCI7XG4gICAgICAgICQodGhpcy5hdWRpb190b3VyKS5hcHBlbmQoXG4gICAgICAgICAgICB0aGlzLmF1ZGlvX2NvZGUsXG4gICAgICAgICAgICB0aGlzLndpbmRvd2NvZGUsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubmV4dF9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubGFzdF9hdWRpbyxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucyxcbiAgICAgICAgICAgIHRoaXMuc3RvcF9idXR0b25cbiAgICAgICAgKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmFwcGVuZCh0aGlzLmF1ZGlvX3RvdXIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuQ29kZU1pcnJvci5jbS1zLWRlZmF1bHQudWktcmVzaXphYmxlXCIpLmhpZGUoKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zdG9wX2J1dHRvbikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiY2xvc2VXaW5kb3dcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiBkaXZpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuYXVkaW9fdG91cikucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIlxuICAgICAgICAgICAgICAgICkuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19vcHQuYnRuLmJ0bi1kZWZhdWx0Omxhc3QtY2hpbGRcIikuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFswXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMV0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsxXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMl0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsyXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbM10pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFszXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbNF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFs0XSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIHBhdXNlIG9yIHBsYXkgdGhlIGF1ZGlvXG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIG1ha2UgdGhlIGltYWdlIGJ1dHRvbnMgbG9vayBkaXNhYmxlZFxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICB9XG4gICAgdG91cihkaXZpZCwgYXVkaW9fdHlwZSwgYmNvdW50KSB7XG4gICAgICAgIC8vIHNldCBnbG9iYWxzXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBiY291bnQ7XG4gICAgICAgIHRoaXMudGhlRGl2aWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDdweDsgbWFyZ2luLWJvdHRvbTogM3B4O1wiXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVuYWJsZSBwcmV2LCBwYXVzZS9wbGF5IGFuZCBuZXh0IGJ1dHRvbnMgYW5kIG1ha2UgdmlzaWJsZVxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgLy8gZGlzYWJsZSB0b3VyIGJ1dHRvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiY291bnQ7IGkrKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tpXSkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3R5cGUuc3BsaXQoXCI7XCIpO1xuICAgICAgICB2YXIgbmFtZSA9IGF0eXBlWzBdLnJlcGxhY2VBbGwoJ1wiJywgXCIgXCIpO1xuICAgICAgICB0aGlzLnRvdXJOYW1lID0gbmFtZTtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zdGFydGluZ1wiLCBuYW1lKSk7XG4gICAgICAgIC8vbG9nIHRvdXIgdHlwZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcIkF1ZGlvXCIsIGFjdDogbmFtZSwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICAgICAgdmFyIG1heCA9IGF0eXBlLmxlbmd0aDtcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWhhc2ggPSBbXTtcbiAgICAgICAgdGhpcy5hbmFtZSA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGF0eXBlW2ldLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIHZhciB0ZW1wX2xpbmUgPSB0ZW1wWzBdO1xuICAgICAgICAgICAgdmFyIHRlbXBfYW5hbWUgPSB0ZW1wWzFdO1xuICAgICAgICAgICAgdmFyIGFrZXkgPSB0ZW1wX2FuYW1lLnN1YnN0cmluZygxLCB0ZW1wX2FuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgbG51bXMgPSB0ZW1wX2xpbmUuc3Vic3RyaW5nKDEsIHRlbXBfbGluZS5sZW5ndGgpO1xuICAgICAgICAgICAgLy9hbGVydChcImFrZXk6XCIrYWtleStcImxudW06XCIrbG51bXMpO1xuICAgICAgICAgICAgLy8gc3RyKz1cIjxhdWRpbyBpZD1cIitha2V5K1wiIHByZWxvYWQ9J2F1dG8nPjxzb3VyY2Ugc3JjPSdodHRwOi8vaWNlLXdlYi5jYy5nYXRlY2guZWR1L2NlMjEvYXVkaW8vXCIrXG4gICAgICAgICAgICAvLyBha2V5K1wiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitha2V5K1xuICAgICAgICAgICAgLy8gXCIub2dnJyB0eXBlPSdhdWRpby9vZ2cnPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xuICAgICAgICAgICAgLy92YXIgZGlyID1cbiAgICAgICAgICAgIC8vICAgIFwiaHR0cDovL21lZGlhLmludGVyYWN0aXZlcHl0aG9uLm9yZy9cIiArXG4gICAgICAgICAgICAvLyAgICBlQm9va0NvbmZpZy5iYXNlY291cnNlLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICAgLy8gICAgXCIvYXVkaW8vXCI7XG4gICAgICAgICAgICB2YXIgZGlyID0gXCIuLi9fc3RhdGljL2F1ZGlvL1wiXG4gICAgICAgICAgICBzdHIgKz0gXCI8YXVkaW8gaWQ9XCIgKyBha2V5ICsgXCIgcHJlbG9hZD0nYXV0bycgPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPGJyIC8+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICB0aGlzLmFoYXNoW2FrZXldID0gbG51bXM7XG4gICAgICAgICAgICB0aGlzLmFuYW1lLnB1c2goYWtleSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLmF1ZGlvX2NvZGUpLmh0bWwoc3RyKTtcbiAgICAgICAgdGhpcy5sZW4gPSB0aGlzLmFuYW1lLmxlbmd0aDsgLy8gc2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZmlsZSBpbiB0aGUgdG91clxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgfVxuICAgIGhhbmRsZVBsYXlpbmcoKSB7XG4gICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAvLyB1bmJpbmQgY3VycmVudCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHRoZSBwcmV2IGxpbmVzXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgIH1cbiAgICBmaXJzdEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJmaXJzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSAwO1xuICAgICAgICAvLyBzdGFydCBhdCB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgcHJldkF1ZGlvKCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGF1ZGlvXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwicHJldlwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW92ZSB0byBwcmV2aW91cyB0byB0aGUgY3VycmVudCAoYnV0IHRoZSBjdXJyZW50IGluZGV4IGhhcyBtb3ZlZCB0byB0aGUgbmV4dClcbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggLSAxO1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIHByZXYgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJuZXh0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiBub3QgYXQgdGhlIGVuZFxuICAgICAgICBpZiAodGhpcy5jdXJySW5kZXggPCB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMuY3VyckluZGV4ICsgMTtcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4gLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsYXN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImxhc3RcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vdmUgdG8gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmxlbiAtIDE7XG4gICAgICAgIC8vIHN0YXJ0IGF0IGxhc3RcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICBwbGF5Q3VyckluZGV4QXVkaW8oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHBsYXkgdGhlIGN1cnJlbnQgYXVkaW8gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICAgICAgdGhpcy5wbGF5YXVkaW8odGhpcy5jdXJySW5kZXgsIHRoaXMuYW5hbWUsIHRoaXMudGhlRGl2aWQsIHRoaXMuYWhhc2gpO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgdGhlIGVuZCBvZiB0aGUgdG91clxuICAgIGhhbmRsZVRvdXJFbmQoKSB7XG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXCJUaGUgXCIgKyB0aGlzLnRvdXJOYW1lICsgXCIgaGFzIGVuZGVkLlwiKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGF1c2UgYXVkaW9cIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAvLyBlbmFibGUgdGhlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYnV0dG9uQ291bnQ7IGorKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tqXSkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBvbmx5IGNhbGwgdGhpcyBvbmUgYWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgICBvdXRlckF1ZGlvKCkge1xuICAgICAgICAvLyB1bmJpbmQgZW5kZWRcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xuICAgICAgICAvLyBzZXQgdGhpcy5wbGF5aW5nIHRvIGZhbHNlXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1bmhpZ2hsaWdodCBwcmV2aW91cyBsaW5lcyBmcm9tIHRoZSBsYXN0IGF1ZGlvXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRoaXMuY3VyckluZGV4IHRvIHBvaW50IHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICB0aGlzLmN1cnJJbmRleCsrO1xuICAgICAgICAvLyBpZiB0aGUgZW5kIG9mIHRoZSB0b3VyIHJlc2V0IHRoZSBidXR0b25zXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUb3VyRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBub3QgZG9uZSB5ZXQgc28gcGxheSB0aGUgbmV4dCBhdWRpb1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBsYXkgdGhlIGF1ZGlvIGF0IHRoZSBjdXJyZW50IGluZGV4XG4gICAgICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYXkgdGhlIGF1ZGlvIG5vdyB0aGF0IGl0IGlzIHJlYWR5XG4gICAgcGxheVdoZW5SZWFkeShhZmlsZSwgZGl2aWQsIGFoYXNoKSB7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50XG4gICAgICAgICQoXCIjXCIgKyBhZmlsZSkudW5iaW5kKFwiY2FucGxheXRocm91Z2hcIik7XG4gICAgICAgIHRoaXMuZWxlbS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIHRoaXMucGxheWluZyA9IHRydWU7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJpbiBwbGF5V2hlblJlYWR5IFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGFoYXNoW2FmaWxlXSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID09PVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKFwiI1wiICsgYWZpbGUpLmJpbmQoXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckF1ZGlvKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpIGFuZCBzZXQgdGhlIGR1cmF0aW9uIGFuZCBoaWdobGlnaHQgdGhlIGxpbmVzXG4gICAgcGxheWF1ZGlvKGksIGFuYW1lLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgdGhpcy5hZmlsZSA9IGFuYW1lW2ldO1xuICAgICAgICB0aGlzLmVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFmaWxlKTtcbiAgICAgICAgLy8gaWYgdGhpcyBpc24ndCByZWFkeSB0byBwbGF5IHlldCAtIG5vIGR1cmF0aW9uIHlldCB0aGVuIHdhaXRcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlhdWRpbyBcIiArIGVsZW0uZHVyYXRpb24pO1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5lbGVtLmR1cmF0aW9uKSB8fCB0aGlzLmVsZW0uZHVyYXRpb24gPT0gMCkge1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXNcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpb1wiKSk7XG4gICAgICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImNhbnBsYXl0aHJvdWdoXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIHJlYWR5IHNvIHBsYXkgaXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYXVzZSBpZiB0aGlzLnBsYXlpbmcgYW5kIHBsYXkgaWYgcGF1c2VkXG4gICAgcGF1c2VBbmRQbGF5QXVkaW8oZGl2aWQpIHtcbiAgICAgICAgdmFyIGJ0biA9IHRoaXMucGF1c2VfYXVkaW87XG4gICAgICAgIC8vIGlmIHBhdXNlZCBhbmQgY2xpY2tlZCB0aGVuIGNvbnRpbnVlIGZyb20gY3VycmVudFxuICAgICAgICBpZiAodGhpcy5lbGVtLnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gY2FsY3VhbHRlIHRoZSB0aW1lIGxlZnQgdG8gcGxheSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gKHRoaXMuZWxlbS5kdXJhdGlvbiAtIHRoaXMuZWxlbS5jdXJyZW50VGltZSkgKiAxMDAwO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTsgLy8gc3RhcnQgdGhlIGF1ZGlvIGZyb20gY3VycmVudCBzcG90XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gJC5pMThuKFxuICAgICAgICAgICAgICAgIFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwbGF5XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYXVkaW8gd2FzIHRoaXMucGxheWluZyBwYXVzZSBpdFxuICAgICAgICBlbHNlIGlmICh0aGlzLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpOyAvLyBwYXVzZSB0aGUgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBsYXlcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpb1wiKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWRcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHByb2Nlc3MgdGhlIGxpbmVzXG4gICAgcHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcikge1xuICAgICAgICB2YXIgY29tbWEgPSBsbnVtLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgaWYgKGNvbW1hLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgY29tbWFbaV0sIGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdW5oaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIGJhY2sgdG8gdHJhbnNwYXJlbnRcbiAgICB1bmhpZ2hsaWdodExpbmVzKGRpdmlkLCBsbnVtKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIH1cbiAgICAvLyBoaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIGEgeWVsbG93IGNvbG9yXG4gICAgaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwiI2ZmZmY5OVwiKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYXNzZWQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBoeXBoZW4gPSBsbnVtLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdmFyIHN0cjtcbiAgICAgICAgLy8gaWYgYSByYW5nZSBvZiBsaW5lc1xuICAgICAgICBpZiAoaHlwaGVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KGh5cGhlblswXSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcGFyc2VJbnQoaHlwaGVuWzFdKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykge1xuICAgICAgICAgICAgICAgIC8vYWxlcnQoayk7XG4gICAgICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGs7XG4gICAgICAgICAgICAgICAgaWYgKCQoc3RyKS50ZXh0KCkgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2FsZXJ0KGxudW0pO1xuICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGxudW07XG4gICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAvLyQoc3RyKS5lZmZlY3QoXCJoaWdobGlnaHRcIix7fSwoZHVyKjEwMDApKzQ1MDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIHRlc3RTdHJpbmcgPSBgU3RhcnRpbmcgVGVzdHNcbkV4cGVjdGVkOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWV0aG9kIHByaW50QW5zd2VyKCkgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiA2IGxpbmUocykgb2YgdGV4dCAgICAgICAgQWN0dWFsOiAwIGxpbmUocykgb2YgdGV4dCAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWFpbiBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IGZhbHNlXG5IZWxsbyBXb3JsZFxuRXhwZWN0ZWQ6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBBY3R1YWw6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBJbnN0YW5jZSBWYXJpYWJsZSBUeXBlKHMpICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBBY3R1YWw6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRRdWVzdGlvbigpICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRGVidWdnaW5nIG91dHB1dFxuTW9yZSBkZWJ1ZyBvdXRwdXRcbkV4cGVjdGVkOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgQWN0dWFsOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgUHJpdmF0ZSBJbnN0YW5jZSBWYXJpYWJsZShzKSAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBwYXNzICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBwYXNzICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBmYWlsICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBmYWlsICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkVuZGluZyBUZXN0c1xuWW91IGdvdCA2IG91dCBvZiA3IGNvcnJlY3QuIDg1LjcxJWA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpVbml0VGVzdFBhcnNlciB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0LCBwYXJlbnRJZCkge1xuICAgICAgICBsZXQgcGF0dCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBcIkV4cGVjdGVkOlxcXFxzKyguKj8pQWN0dWFsOlxcXFxzKyguKj8pTWVzc2FnZTpcXFxccysoLio/KVBhc3NlZDpcXFxccysodHJ1ZXxmYWxzZSlcIixcbiAgICAgICAgICAgIFwiZ1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGV4dFJlc3VsdHMgPSBcIlwiO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG91dHB1dC5tYXRjaEFsbChwYXR0KTtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwidW5pdHRlc3QtcmVzdWx0c1wiKTtcbiAgICAgICAgbGV0IHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKTtcbiAgICAgICAgdGJsLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRibCk7XG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtwYXJlbnRJZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgICAgdHIuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPlJlc3VsdDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5FeHBlY3RlZDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5BY3R1YWw8L3RoPjx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+Tm90ZXM8L3RoPic7XG4gICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRkXCIpO1xuICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gXCJQYXNzXCI7XG4gICAgICAgICAgICAgICAgdGQuc3R5bGUgPVxuICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3I6IHJnYigxMzEsIDIxMSwgMTMwKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIkZhaWxcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyMiwgMTQyLCAxNTApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XG4gICAgICAgICAgICB0YmwuYXBwZW5kQ2hpbGQodHIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gbWF0Y2hbaV07XG4gICAgICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlID0gcGFyZW50O1xuICAgICAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyArPSBtYXRjaFswXSArIFwiXFxuXCI7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoID0gb3V0cHV0Lm1hdGNoKFxuICAgICAgICAgICAgL1lvdSBnb3RcXHMrKFxcZCspIG91dCBvZiAoXFxkKykgY29ycmVjdC5cXHMrKFxcZCtcXC5cXGQrKSUvXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpO1xuICAgICAgICAgICAgbGV0IHBjdFN0cmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGN0U3RyaW5nLmlubmVySFRNTCA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgdGhpcy5wY3RTdHJpbmcgPSBwY3RTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBjdCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkID0gbWF0Y2hbMl0gLSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIlN0YXJ0aW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIkVuZGluZyBUZXN0c1wiLCBcIlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC8oPGJyPikrL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2VBbGwoXCImbHQ7aW1nXCIsIFwiPGltZ1wiKTtcbiAgICAgICAgdGhpcy5zdGRvdXQgPSBvdXRwdXQ7XG4gICAgfVxufVxuXG4vLyBsZXQgeCA9IG5ldyBSZXN1bHRzVG9UYWJsZSh0ZXN0U3RyaW5nKTtcbi8vIGNvbnNvbGUubG9nKHguc3Rkb3V0KTtcbi8vIGNvbnNvbGUubG9nKHgudGFibGUpO1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBNRDUgZnJvbSBcIi4vbWQ1LmpzXCI7XG5pbXBvcnQgSlVuaXRUZXN0UGFyc2VyIGZyb20gXCIuL2V4dHJhY3RVbml0UmVzdWx0cy5qc1wiO1xuaW1wb3J0IFwiLi4vLi4vY29kZWxlbnMvanMvcHl0dXRvci1lbWJlZC5idW5kbGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3RkaW4gPSAkKG9yaWcpLmRhdGEoXCJzdGRpblwiKTtcbiAgICAgICAgdGhpcy5kYXRhZmlsZSA9ICQob3JpZykuZGF0YShcImRhdGFmaWxlXCIpO1xuICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJzb3VyY2VmaWxlXCIpO1xuICAgICAgICB0aGlzLmNvbXBpbGVhcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImNvbXBpbGVhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5saW5rYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJsaW5rYXJnc1wiKSk7XG4gICAgICAgIHRoaXMucnVuYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJydW5hcmdzXCIpKTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlcmFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiaW50ZXJwcmV0ZXJhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5BUElfS0VZID0gXCI2NzAzM3BWN2VVVXZxbzA3T0pESVY4VVowNDlhTEVLMVwiO1xuICAgICAgICB0aGlzLlVTRV9BUElfS0VZID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5KT0JFX1NFUlZFUiA9IGVCb29rQ29uZmlnLmpvYmVob3N0IHx8IGVCb29rQ29uZmlnLmhvc3Q7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBlQm9va0NvbmZpZy5wcm94eXVyaV9ydW5zIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUnVuXCI7XG4gICAgICAgIHRoaXMuam9iZVB1dEZpbGVzID1cbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByb3h5dXJpX2ZpbGVzIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUHVzaEZpbGUvXCI7XG4gICAgICAgIHRoaXMuam9iZUNoZWNrRmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVDaGVja0ZpbGUvXCI7XG4gICAgICAgIC8vIFRPRE86ICBzaG91bGQgYWRkIGEgcHJvcGVyIHB1dC9jaGVjayBpbiBwYXZlbWVudC50bXBsIGFzIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgd2lsbCBicmVhayBvbiBydW5lc3RvbmVcbiAgICAgICAgdGhpcy5kaXYyaWQgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5wdXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvck91dHB1dCgpO1xuICAgIH1cbiAgICBvdXRwdXRmdW4oYSkge31cbiAgICBjcmVhdGVJbnB1dEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuZm9yID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgICQobGFiZWwpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnXCIpKTtcbiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRpblwiO1xuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlucHV0LnNpemUgPSBcIjM1XCI7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zdGRpbjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgICB0aGlzLnN0ZGluX2VsID0gaW5wdXQ7XG4gICAgfVxuICAgIGNyZWF0ZUVycm9yT3V0cHV0KCkge31cblxuICAgIC8qICBNYWluIHJ1blByb2cgbWV0aG9kIGZvciBsaXZlY29kZVxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5TZXR1cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VG9Kb2JlKCk7XG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKGBTZXJ2ZXIgRXJyb3I6ICR7cmVzLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcnVuUmVzdWx0cyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKb2JlUmVzcG9uc2UocnVuUmVzdWx0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnJcIikgKyBlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gYGZhaWw6ICR7ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZTpcbiAgICAgKiBJbiBvcmRlciB0byBjaGVjayBmb3Igc3VwcGxlbWVudGFsIGZpbGVzIGluIGphdmEgYW5kIGRlYWwgd2l0aCBhc3luY2hyb25pY2l0eVxuICAgICAqIEkgc3BsaXQgdGhlIG9yaWdpbmFsIHJ1blByb2cgaW50byB0d28gZnVuY3Rpb25zOiBydW5Qcm9nIGFuZCBydW5Qcm9nX2NhbGxiYWNrXG4gICAgICovXG4gICAgYXN5bmMgcnVuU2V0dXAoKSB7XG4gICAgICAgIHZhciBzdGRpbjtcbiAgICAgICAgdmFyIHNvdXJjZTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciBzZmlsZW1hcCA9IHtcbiAgICAgICAgICAgIGphdmE6IFwiXCIsXG4gICAgICAgICAgICBjcHA6IFwidGVzdC5jcHBcIixcbiAgICAgICAgICAgIGM6IFwidGVzdC5jXCIsXG4gICAgICAgICAgICBweXRob24zOiBcInRlc3QucHlcIixcbiAgICAgICAgICAgIHB5dGhvbjI6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgb2N0YXZlOiBcIm9jdGF0ZXN0Lm1cIixcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNvdXJjZWZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIHRlc3Rkcml2ZXJuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIGZpbGVfY2hlY2twO1xuXG4gICAgICAgIC8vIGV4dHJhY3QgdGhlIGNsYXNzIG5hbWVzIHNvIGZpbGVzIGNhbiBiZSBuYW1lZCBwcm9wZXJseVxuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgbGV0IGNsYXNzTWF0Y2ggPSBuZXcgUmVnRXhwKC9wdWJsaWMgY2xhc3NcXHMrKFxcdyspW1xccyt7XS8pO1xuICAgICAgICAgICAgc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICAgICAgbGV0IG0gPSBzb3VyY2UubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1bml0IHRlc3QgY29kZVxuICAgICAgICAgICAgbSA9IHRoaXMuc3VmZml4Lm1hdGNoKGNsYXNzTWF0Y2gpO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZHJpdmVybmFtZSA9IG1bMV0gKyBcIi5qYXZhXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YSBpcyBjb252ZXJ0aWJsZSB0byBCYXNlNjQuIElmIG5vdCB0aGVuIGVycm9yIG91dCBub3dcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ0b2Eoc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWxlcnQoXG4gICAgICAgICAgICAgICAgXCJFcnJvcjogQmFkIENoYXJhY3RlcnMgaW4gdGhlIGFjdGl2ZWNvZGUgd2luZG93LiBMaWtlbHkgYSBxdW90ZSBjaGFyYWN0ZXIgdGhhdCBoYXMgYmVlbiBjb3B5L3Bhc3RlZC4g8J+ZgVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcblxuICAgICAgICAvLyBhc3NlbWJsZSBwYXJhbWV0ZXJzIGZvciBKT0JFXG4gICAgICAgIHZhciBwYXJhbWxpc3QgPSBbXG4gICAgICAgICAgICBcImNvbXBpbGVhcmdzXCIsXG4gICAgICAgICAgICBcImxpbmthcmdzXCIsXG4gICAgICAgICAgICBcInJ1bmFyZ3NcIixcbiAgICAgICAgICAgIFwiaW50ZXJwcmV0ZXJhcmdzXCIsXG4gICAgICAgICAgICBcIm1lbW9yeWxpbWl0XCIsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBwYXJhbW9iaiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwYXJhbSBvZiBwYXJhbWxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3BhcmFtXSkge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqW3BhcmFtXSA9IGV2YWwodGhpc1twYXJhbV0pOyAvLyBuZWVkcyBhIGxpc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PT0gXCJvY3RhdmVcIikge1xuICAgICAgICAgICAgcGFyYW1vYmoubWVtb3J5bGltaXQgPSAyMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSBzZmlsZW1hcFt0aGlzLmxhbmd1YWdlXTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmdcIikpO1xuICAgICAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbnRlbnQsIGJhc2U2NDtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWZpbGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgaWRzID0gdGhpcy5kYXRhZmlsZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGlkc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlID09PSBudWxsIHx8IGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIGZpbGUgd2l0aCBnaXZlbiBpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGZpbGUgaXMgaW4gZGJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZmlsZVJlYWRlcihmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGZpbGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCBpZiBmaWxlIGlzIGFuIGltYWdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09PSBcImphclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZmlsZXMuY29uY2F0KHRoaXMucGFyc2VKYXZhQ2xhc3Nlcyhjb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbXCJqcGdcIiwgXCJwbmdcIiwgXCJnaWZcIl0uaW5kZXhPZihmaWxlRXh0ZW5zaW9uKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS50b0RhdGFVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnRvRGF0YVVSTChcImltYWdlL1wiICsgZmlsZUV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZyhiYXNlNjQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZmlsZS5zcmMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNyYy5pbmRleE9mKFwiLFwiKSArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogZmlsZU5hbWUsIGNvbnRlbnQ6IGJhc2U2NCB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBjbGFzc05hbWUgb3IgdW4gcmVjb2duaXplZCBjbGFzc05hbWUgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbmRpdmlkdWFsIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgdHlwZSBvZiBmaWxlLCAudHh0LCAuamF2YSwgLmNzdiwgZXRjXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUgdGhlIHRlc3QgZHJpdmVyIGZvciB0aGUgc3R1ZGVudFxuICAgICAgICAvLyBjb2RlIGFuZCBzZW5kIHRoZSBzdHVkZW50IGNvZGUgYXMgYSBmaWxlLiAgV2UnbGwgZG8gdGhhdCBoZXJlLlxuICAgICAgICB0aGlzLmp1bml0RHJpdmVyQ29kZSA9IGBcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlO1xuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlO1xuXG4gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UnVubmVyIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBDb2RlVGVzdEhlbHBlci5yZXNldEZpbmFsUmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBKVW5pdENvcmUucnVuQ2xhc3Nlcygke3Rlc3Rkcml2ZXJuYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiLmphdmFcIixcbiAgICAgICAgICAgICAgICAgICAgXCIuY2xhc3NcIlxuICAgICAgICAgICAgICAgICl9KTtcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZVRlc3RIZWxwZXIuZ2V0RmluYWxSZXN1bHRzKCkpO1xuXG4gICAgICAgICAgICAgICAgaW50IHRvdGFsID0gcmVzdWx0LmdldFJ1bkNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGZhaWxzID0gcmVzdWx0LmdldEZhaWx1cmVDb3VudCgpO1xuICAgICAgICAgICAgICAgIGludCBjb3JyICA9IHRvdGFsIC0gZmFpbHM7XG4gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiWW91IGdvdCBcIiArIGNvcnIgKyBcIiBvdXQgb2YgXCIgKyB0b3RhbCArIFwiIGNvcnJlY3QuIFwiICsgU3RyaW5nLmZvcm1hdChcIiUuMmZcIiwgKDEwMC4wICogY29yciAvIHRvdGFsKSkgKyBcIiVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4ICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBzb3VyY2VmaWxlbmFtZSwgY29udGVudDogc291cmNlIH0pO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHRlc3Rkcml2ZXJuYW1lLCBjb250ZW50OiB0aGlzLnN1ZmZpeCB9KTtcbiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuanVuaXREcml2ZXJDb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmFtb2JqLmNvbXBpbGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MucHVzaChzb3VyY2VmaWxlbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqLmNvbXBpbGVhcmdzID0gW3NvdXJjZWZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcnVuc3BlYyA9IHtcbiAgICAgICAgICAgIGxhbmd1YWdlX2lkOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlY29kZTogc291cmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1vYmosXG4gICAgICAgICAgICBzb3VyY2VmaWxlbmFtZTogdGhpcy5zb3VyY2VmaWxlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdGRpbikge1xuICAgICAgICAgICAgcnVuc3BlYy5pbnB1dCA9IHN0ZGluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5yZXNvbHZlKFwicmVhZHlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdID0gW107XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlQ29udGVudCA9IGZpbGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgIFwicnVuZXN0b25lXCIgKyBNRDUoZmlsZU5hbWUgKyBmaWxlQ29udGVudCk7XG4gICAgICAgICAgICAgICAgcnVuc3BlY1tcImZpbGVfbGlzdFwiXS5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2hlY2tGaWxlKGZpbGVzW2ldLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XG4gICAgICAgICAgICB0aGlzLmRpdjJpZCA9IGluc3RhbmNlLmRpdjJpZDtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5hbGwocHJvbWlzZXMpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBcIiArIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZV9jaGVja3A7XG4gICAgfVxuXG4gICAgLyogU3VibWl0IHRoZSBhc3NlbWJsZWQgam9iIHRvIHRoZSBKT0JFIHNlcnZlciBhbmQgYXdhaXQgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBzdWJtaXRUb0pvYmUoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5qc29uX3J1bnNwZWM7XG4gICAgICAgIGxldCBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHRoaXMucmVzb3VyY2U7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAkKHRoaXMuZXJyRGl2KS5yZW1vdmUoKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtQVBJLUtFWVwiOiB0aGlzLkFQSV9LRVksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGhvc3QsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcblxuICAgICAgICAvLy8kKFwiI1wiICsgZGl2aWQgKyBcIl9lcnJpbmZvXCIpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHByb2Nlc3NKb2JlUmVzcG9uc2UocmVzdWx0KSB7XG4gICAgICAgIHZhciBsb2dyZXN1bHQ7XG4gICAgICAgIHZhciBvZGl2ID0gdGhpcy5vdXRwdXQ7XG4gICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0ge307XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAxNSkge1xuICAgICAgICAgICAgbG9ncmVzdWx0ID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSByZXN1bHQub3V0Y29tZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycmluZm8gPSBsb2dyZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IG5ldyBKVW5pdFRlc3RQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCh0aGlzLnBhcnNlZE91dHB1dC5zdGRvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQucGN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0LnBjdCA9IHRoaXMucGFyc2VkT3V0cHV0LnBhc3NlZCA9IHRoaXMucGFyc2VkT3V0cHV0LmZhaWxlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3RoaXMucGFyc2VkT3V0cHV0LnBjdH06cGFzc2VkOiR7dGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5mYWlsZWR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDExOiAvLyBjb21waWxlciBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnJcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuY21waW5mbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiAvLyBydW4gdGltZSBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3Rkb3V0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuc3RkZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEzOiAvLyB0aW1lIGxpbWl0XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4Y1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3RkZXJyLnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnJcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbzogaGFuZGxlIHNlcnZlciBidXN5IGFuZCB0aW1lb3V0IGVycm9ycyB0b29cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgbGV0IHJkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgaWYgKHJkaXYpIHtcbiAgICAgICAgICAgIHJkaXYucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkT3V0cHV0ICYmIHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC5wY3RTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSm9iZUVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHZhciBlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lcnJEaXYgPSBlQ29udGFpbmVyO1xuICAgICAgICBlQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIGVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICBlQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKSk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGZpbGUgaXMgb24gc2VydmVyXG4gICAgICogUGxhY2VzIGl0IG9uIHNlcnZlciBpZiBpdCBpcyBub3Qgb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7b2JqZWN0e25hbWUsIGNvbnRlbnRzfX0gZmlsZSAgICBGaWxlIHRvIHBsYWNlIG9uIHNlcnZlclxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZXNvbHZlIHByb21pc2UgcmVzb2x2ZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZWplY3QgIHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgY2hlY2tGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZV9pZCA9IHRoaXMuZGl2MmlkW2ZpbGUubmFtZV07XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZUNoZWNrRmlsZXMgKyBmaWxlX2lkO1xuICAgICAgICB2YXIgaG9zdCA9IHRoaXMuSk9CRV9TRVJWRVIgKyByZXNvdXJjZTtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkhFQURcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgMjA4OlxuICAgICAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgbm90IG9uIFNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRGF0YUZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGaWxlIGFscmVhZHkgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgZmlsZSBvbiBhIHNlcnZlclxuICAgICAqL1xuICAgIHB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lO1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZU5hbWVdO1xuICAgICAgICB2YXIgY29udGVudHMgPSBmaWxlLmNvbnRlbnQ7XG4gICAgICAgIC8vIEZpbGUgdHlwZXMgYmVpbmcgdXBsb2FkZWQgdGhhdCBjb21lIGluIGFscmVhZHkgaW4gYmFzZTY0IGZvcm1hdFxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IFtcImphclwiLCBcInppcFwiLCBcInBuZ1wiLCBcImpwZ1wiLCBcImpwZWdcIl07XG4gICAgICAgIHZhciBjb250ZW50c2I2NDtcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMuaW5kZXhPZihleHRlbnNpb24pID09PSAtMSkge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBidG9hKGNvbnRlbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzYjY0ID0gY29udGVudHM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7IGZpbGVfY29udGVudHM6IGNvbnRlbnRzYjY0IH0pO1xuICAgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLmpvYmVQdXRGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiUFVUXCIsIGhvc3QsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUFQSS1LRVlcIiwgdGhpcy5BUElfS0VZKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZvcmJpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkJhZCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzdWNjZXNzZnVsbHkgc2VudCBmaWxlIFwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJGaWxlIFwiICsgZmlsZU5hbWUgK1wiLCBcIiArIGZpbGVfaWQgK1wiIHBsYWNlZCBvbiBzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVycm9yIHNlbmRpbmcgZmlsZVwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBsZXQgY2xNZXNzID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgY2xNZXNzID0gXCJCdWlsZGluZyB5b3VyIHZpc3VhbGl6YXRpb25cIjtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuaW5uZXJIVE1MID0gY2xNZXNzO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIGlmIChjb2RlLm1hdGNoKC9TeXN0ZW0uZXhpdC8pKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIlNvcnJ5Li4uIFN5c3RlbS5leGl0IGJyZWFrcyB0aGUgdmlzdWFsaXplciB0ZW1wb3JhcmlseSByZW1vdmluZ1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvU3lzdGVtLmV4aXRcXChcXGQrXFwpOy8sIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBteVZhcnMuc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXREaXYgPSB0aGlzLmNvZGVsZW5zLmlkO1xuXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXCIvcnVuZXN0b25lL3Byb3h5L3B5dHV0b3JfdHJhY2VcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15VmFycyksXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBsZXQgdmlzID0gYWRkVmlzdWFsaXplclRvUGFnZShkYXRhLCB0YXJnZXREaXYsIHtcbiAgICAgICAgICAgICAgICBzdGFydGluZ0luc3RydWN0aW9uOiAwLFxuICAgICAgICAgICAgICAgIGVkaXRDb2RlQmFzZVVSTDogbnVsbCxcbiAgICAgICAgICAgICAgICBoaWRlQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFuZzogbXlWYXJzLmxhbmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXREaXZFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldERpdik7XG4gICAgICAgICAgICB0YXJnZXREaXZFcnJvci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgIFwiU29ycnksIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHlvdXIgdmlzdWFsaXphdGlvbi5cIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IFRyYWNlIEZhaWxlZCAtLSBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VwZXJhdGVzIHRleHQgaW50byBtdWx0aXBsZSAuamF2YSBmaWxlc1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dCBTdHJpbmcgd2l0aCBtdWxpcGxlIGphdmEgY2xhc3NlcyBuZWVkZWQgdG8gYmUgc2VwZXJhdGVkXG4gICAgICogQHJldHVybiB7YXJyYXkgb2Ygb2JqZWN0c30gIC5uYW1lIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGZpbGUgd2l0aCAuamF2YSBleHRlbnNpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAuY29udGVudCBnaXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVcbiAgICAgKi9cbiAgICBwYXJzZUphdmFDbGFzc2VzKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YWNrID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICB2YXIgaW1wb3J0SW5kZXggPSAwO1xuICAgICAgICB2YXIgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiXFxuXCIgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dC5jaGFyQXQoaSkgIT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoaSArIDEpICE9PSBcIi9cIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxIDwgdGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09ICdcIicgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRleHQuY2hhckF0KGkpICE9PSBcIidcIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcENvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBDb3VudCA+IDAgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgdGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgc3RhY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zLCBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW3ddID09PSBcImV4dGVuZHNcIiB8fCB3b3Jkc1t3XSA9PT0gXCJpbXBsZW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3cgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB3b3Jkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKGltcG9ydEluZGV4LCBlbmRJbmRleCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbXBvcnRJbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgIGVuZE9mTGFzdENvbW1lbnRCZWZvcmVDbGFzc0JlZ2lucyA9IGVuZEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVuZXNjYXBlSHRtbChzYWZlKSB7XG4gICAgaWYgKHNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHNhZmVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mbHQ7L2csIFwiPFwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJnF1b3Q7L2csICdcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvJiN4Mjc7L2csIFwiJ1wiKTtcbiAgICB9XG59XG4iLCIvKipcbiAqXG4gKiAgTUQ1IChNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0pXG4gKiAgaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNRDUoc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gUm90YXRlTGVmdChsVmFsdWUsIGlTaGlmdEJpdHMpIHtcbiAgICAgICAgcmV0dXJuIChsVmFsdWUgPDwgaVNoaWZ0Qml0cykgfCAobFZhbHVlID4+PiAoMzIgLSBpU2hpZnRCaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQWRkVW5zaWduZWQobFgsIGxZKSB7XG4gICAgICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XG4gICAgICAgIGxYOCA9IGxYICYgMHg4MDAwMDAwMDtcbiAgICAgICAgbFk4ID0gbFkgJiAweDgwMDAwMDAwO1xuICAgICAgICBsWDQgPSBsWCAmIDB4NDAwMDAwMDA7XG4gICAgICAgIGxZNCA9IGxZICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFJlc3VsdCA9IChsWCAmIDB4M2ZmZmZmZmYpICsgKGxZICYgMHgzZmZmZmZmZik7XG4gICAgICAgIGlmIChsWDQgJiBsWTQpIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg4MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFg0IHwgbFk0KSB7XG4gICAgICAgICAgICBpZiAobFJlc3VsdCAmIDB4NDAwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbFJlc3VsdCBeIDB4YzAwMDAwMDAgXiBsWDggXiBsWTg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg0MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRih4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRyh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSCh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSSh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB5IF4gKHggfCB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEYoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEgoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEkoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29udmVydFRvV29yZEFycmF5KHN0cmluZykge1xuICAgICAgICB2YXIgbFdvcmRDb3VudDtcbiAgICAgICAgdmFyIGxNZXNzYWdlTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgdmFyIGxOdW1iZXJPZldvcmRzX3RlbXAxID0gbE1lc3NhZ2VMZW5ndGggKyA4O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPVxuICAgICAgICAgICAgKGxOdW1iZXJPZldvcmRzX3RlbXAxIC0gKGxOdW1iZXJPZldvcmRzX3RlbXAxICUgNjQpKSAvIDY0O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHMgPSAobE51bWJlck9mV29yZHNfdGVtcDIgKyAxKSAqIDE2O1xuICAgICAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XG4gICAgICAgIHZhciBsQnl0ZVBvc2l0aW9uID0gMDtcbiAgICAgICAgdmFyIGxCeXRlQ291bnQgPSAwO1xuICAgICAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XG4gICAgICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID1cbiAgICAgICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHxcbiAgICAgICAgICAgICAgICAoc3RyaW5nLmNoYXJDb2RlQXQobEJ5dGVDb3VudCkgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgICAgICBsQnl0ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbFdvcmRDb3VudCA9IChsQnl0ZUNvdW50IC0gKGxCeXRlQ291bnQgJSA0KSkgLyA0O1xuICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSB8ICgweDgwIDw8IGxCeXRlUG9zaXRpb24pO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMl0gPSBsTWVzc2FnZUxlbmd0aCA8PCAzO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMV0gPSBsTWVzc2FnZUxlbmd0aCA+Pj4gMjk7XG4gICAgICAgIHJldHVybiBsV29yZEFycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdvcmRUb0hleChsVmFsdWUpIHtcbiAgICAgICAgdmFyIFdvcmRUb0hleFZhbHVlID0gXCJcIixcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIlwiLFxuICAgICAgICAgICAgbEJ5dGUsXG4gICAgICAgICAgICBsQ291bnQ7XG4gICAgICAgIGZvciAobENvdW50ID0gMDsgbENvdW50IDw9IDM7IGxDb3VudCsrKSB7XG4gICAgICAgICAgICBsQnl0ZSA9IChsVmFsdWUgPj4+IChsQ291bnQgKiA4KSkgJiAyNTU7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCIwXCIgKyBsQnl0ZS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSA9XG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWUgK1xuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAuc3Vic3RyKFdvcmRUb0hleFZhbHVlX3RlbXAubGVuZ3RoIC0gMiwgMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmRUb0hleFZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFV0ZjhFbmNvZGUoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChuKTtcblxuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcbiAgICB9XG5cbiAgICB2YXIgeCA9IEFycmF5KCk7XG4gICAgdmFyIGssIEFBLCBCQiwgQ0MsIERELCBhLCBiLCBjLCBkO1xuICAgIHZhciBTMTEgPSA3LFxuICAgICAgICBTMTIgPSAxMixcbiAgICAgICAgUzEzID0gMTcsXG4gICAgICAgIFMxNCA9IDIyO1xuICAgIHZhciBTMjEgPSA1LFxuICAgICAgICBTMjIgPSA5LFxuICAgICAgICBTMjMgPSAxNCxcbiAgICAgICAgUzI0ID0gMjA7XG4gICAgdmFyIFMzMSA9IDQsXG4gICAgICAgIFMzMiA9IDExLFxuICAgICAgICBTMzMgPSAxNixcbiAgICAgICAgUzM0ID0gMjM7XG4gICAgdmFyIFM0MSA9IDYsXG4gICAgICAgIFM0MiA9IDEwLFxuICAgICAgICBTNDMgPSAxNSxcbiAgICAgICAgUzQ0ID0gMjE7XG5cbiAgICBzdHJpbmcgPSBVdGY4RW5jb2RlKHN0cmluZyk7XG5cbiAgICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XG5cbiAgICBhID0gMHg2NzQ1MjMwMTtcbiAgICBiID0gMHhlZmNkYWI4OTtcbiAgICBjID0gMHg5OGJhZGNmZTtcbiAgICBkID0gMHgxMDMyNTQ3NjtcblxuICAgIGZvciAoayA9IDA7IGsgPCB4Lmxlbmd0aDsgayArPSAxNikge1xuICAgICAgICBBQSA9IGE7XG4gICAgICAgIEJCID0gYjtcbiAgICAgICAgQ0MgPSBjO1xuICAgICAgICBERCA9IGQ7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweGQ3NmFhNDc4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDFdLCBTMTIsIDB4ZThjN2I3NTYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMl0sIFMxMywgMHgyNDIwNzBkYik7XG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweGMxYmRjZWVlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTMTEsIDB4ZjU3YzBmYWYpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgNV0sIFMxMiwgMHg0Nzg3YzYyYSk7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweGE4MzA0NjEzKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDddLCBTMTQsIDB4ZmQ0Njk1MDEpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgOF0sIFMxMSwgMHg2OTgwOThkOCk7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhiNDRmN2FmKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzEzLCAweGZmZmY1YmIxKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDExXSwgUzE0LCAweDg5NWNkN2JlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZiOTAxMTIyKTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDEzXSwgUzEyLCAweGZkOTg3MTkzKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzEzLCAweGE2Nzk0MzhlKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5YjQwODIxKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDFdLCBTMjEsIDB4ZjYxZTI1NjIpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVlNWE1MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAwXSwgUzI0LCAweGU5YjZjN2FhKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMjEsIDB4ZDYyZjEwNWQpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxNV0sIFMyMywgMHhkOGExZTY4MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA0XSwgUzI0LCAweGU3ZDNmYmM4KTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFlMWNkZTYpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTRdLCBTMjIsIDB4YzMzNzA3ZDYpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NWExNGVkKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDEzXSwgUzIxLCAweGE5ZTNlOTA1KTtcbiAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDJdLCBTMjIsIDB4ZmNlZmEzZjgpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZmMDJkOSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzMxLCAweGZmZmEzOTQyKTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MWY2ODEpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTRdLCBTMzQsIDB4ZmRlNTM4MGMpO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyA0XSwgUzMyLCAweDRiZGVjZmE5KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDddLCBTMzMsIDB4ZjZiYjRiNjApO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4YmViZmJjNzApO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMzEsIDB4Mjg5YjdlYzYpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMF0sIFMzMiwgMHhlYWExMjdmYSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDZdLCBTMzQsIDB4NDg4MWQwNSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweGU2ZGI5OWU1KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzMzLCAweDFmYTI3Y2Y4KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDJdLCBTMzQsIDB4YzRhYzU2NjUpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyA3XSwgUzQyLCAweDQzMmFmZjk3KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzQzLCAweGFiOTQyM2E3KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4ZmM5M2EwMzkpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTNDEsIDB4NjU1YjU5YzMpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTNDEsIDB4NmZhODdlNGYpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4ZmUyY2U2ZTApO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgNl0sIFM0MywgMHhhMzAxNDMxNCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxM10sIFM0NCwgMHg0ZTA4MTFhMSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweGY3NTM3ZTgyKTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDExXSwgUzQyLCAweGJkM2FmMjM1KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTNDMsIDB4MmFkN2QyYmIpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7XG4gICAgICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBQSk7XG4gICAgICAgIGIgPSBBZGRVbnNpZ25lZChiLCBCQik7XG4gICAgICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XG4gICAgICAgIGQgPSBBZGRVbnNpZ25lZChkLCBERCk7XG4gICAgfVxuXG4gICAgdmFyIHRlbXAgPSBXb3JkVG9IZXgoYSkgKyBXb3JkVG9IZXgoYikgKyBXb3JkVG9IZXgoYykgKyBXb3JkVG9IZXgoZCk7XG5cbiAgICByZXR1cm4gdGVtcC50b0xvd2VyQ2FzZSgpO1xufVxuIiwiU2suYnVpbHRpbkZpbGVzPXtcImZpbGVzXCI6e1wic3JjL2J1aWx0aW4vc3lzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixhPU1hdGgucG93LGM9e30sZD1bXSxlPVNrLmdldFN5c0FyZ3YoKTtmb3IoYj0wO2I8ZS5sZW5ndGg7KytiKWQucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZVtiXSkpO3JldHVybiBjLmFyZ3Y9bmV3IFNrLmJ1aWx0aW5zLmxpc3QoZCksYy5jb3B5cmlnaHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJDb3B5cmlnaHQgMjAwOS0yMDEwIFNjb3R0IEdyYWhhbS5cXFxcbkFsbCBSaWdodHMgUmVzZXJ2ZWQuXFxcXG5cXFwiKSxTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGMudmVyc2lvbj1cXFwiMy43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDMpLG5ldyBTay5idWlsdGluLmludF8oNyldKSk6KGMudmVyc2lvbj1cXFwiMi43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDIpLG5ldyBTay5idWlsdGluLmludF8oNyldKSksYy5tYXhpbnQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhhKDIsNTMpLTEpLGMubWF4c2l6ZT1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tb2R1bGVzPVNrLnN5c21vZHVsZXMsYy5wYXRoPVNrLnJlYWxzeXNwYXRoLGMuZ2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2suZXhlY0xpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmV4ZWNMaW1pdCl9KSxjLnNldEV4ZWN1dGlvbkxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLmV4ZWNMaW1pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJFeGVjdXRpb24gbGltaXRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2suZXhlY0xpbWl0PVNrLmJ1aWx0aW4uYXNudW0kKGEpKX0pLGMucmVzZXRUaW1lb3V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5leGVjU3RhcnQ9bmV3IERhdGV9KSxjLmdldFlpZWxkTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2sueWllbGRMaW1pdD9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50XyhTay55aWVsZExpbWl0KX0pLGMuc2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKG51bGw9PT1Tay55aWVsZExpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIllpZWxkaW5nIGlzIG5vdCBlbmFibGVkXFxcIik7dm9pZCAwIT09YSYmKFNrLnlpZWxkTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5kZWJ1Zz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdGRvdXRfXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRvdXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndcXFwiKSksYy5fX3N0ZGluX189bmV3IFNrLmJ1aWx0aW4uZmlsZShuZXcgU2suYnVpbHRpbi5zdHIoXFxcIi9kZXYvc3RkaW5cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInJcXFwiKSksYy5zdGRvdXQ9Yy5fX3N0ZG91dF9fLGMuc3RkaW49Yy5fX3N0ZGluX18sY307XCIsXCJzcmMvYnVpbHRpbi90aGlzLnB5XCI6XCJzID0gXFxcIlxcXCJcXFwiR3VyIE1yYSBicyBDbGd1YmEsIG9sIEd2eiBDcmdyZWZcXG5cXG5Pcm5oZ3ZzaHkgdmYgb3JnZ3JlIGd1bmEgaHR5bC5cXG5Sa2N5dnB2ZyB2ZiBvcmdncmUgZ3VuYSB2emN5dnB2Zy5cXG5GdnpjeXIgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3lyay5cXG5QYnpjeXJrIHZmIG9yZ2dyZSBndW5hIHBiemN5dnBuZ3JxLlxcblN5bmcgdmYgb3JnZ3JlIGd1bmEgYXJmZ3JxLlxcbkZjbmVmciB2ZiBvcmdncmUgZ3VuYSBxcmFmci5cXG5Fcm5xbm92eXZnbCBwYmhhZ2YuXFxuRmNycHZueSBwbmZyZiBuZXJhJ2cgZmNycHZueSByYWJodHUgZ2Igb2VybnggZ3VyIGVoeXJmLlxcbk55Z3ViaHR1IGNlbnBndnBueXZnbCBvcm5nZiBjaGV2Z2wuXFxuUmVlYmVmIGZ1Ymh5cSBhcmlyZSBjbmZmIGZ2eXJhZ3lsLlxcbkhheXJmZiBya2N5dnB2Z3lsIGZ2eXJhcHJxLlxcblZhIGd1ciBzbnByIGJzIG56b3Z0aHZnbCwgZXJzaGZyIGd1ciBncnpjZ25ndmJhIGdiIHRocmZmLlxcbkd1cmVyIGZ1Ymh5cSBvciBiYXItLSBuYXEgY2Vyc3Jlbm95bCBiYXlsIGJhciAtLWJvaXZiaGYgam5sIGdiIHFiIHZnLlxcbk55Z3ViaHR1IGd1bmcgam5sIHpubCBhYmcgb3IgYm9pdmJoZiBuZyBzdmVmZyBoYXlyZmYgbGJoJ2VyIFFoZ3B1LlxcbkFiaiB2ZiBvcmdncmUgZ3VuYSBhcmlyZS5cXG5OeWd1Ymh0dSBhcmlyZSB2ZiBic2dyYSBvcmdncmUgZ3VuYSAqZXZ0dWcqIGFiai5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgdW5lcSBnYiBya2N5bnZhLCB2ZydmIG4gb25xIHZxcm4uXFxuVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHJuZmwgZ2IgcmtjeW52YSwgdmcgem5sIG9yIG4gdGJicSB2cXJuLlxcbkFuenJmY25wcmYgbmVyIGJhciB1YmF4dmF0IHRlcm5nIHZxcm4gLS0geXJnJ2YgcWIgemJlciBicyBndWJmciFcXFwiXFxcIlxcXCJcXG5cXG5kID0ge31cXG5mb3IgYyBpbiAoNjUsIDk3KTpcXG4gICAgZm9yIGkgaW4gcmFuZ2UoMjYpOlxcbiAgICAgICAgZFtjaHIoaStjKV0gPSBjaHIoKGkrMTMpICUgMjYgKyBjKVxcblxcbnByaW50KFxcXCJcXFwiLmpvaW4oW2QuZ2V0KGMsIGMpIGZvciBjIGluIHNdKSlcXG5cIixcInNyYy9saWIvQmFzZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkJhc2VIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQmFzdGlvbi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NHSUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNHSUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Db25maWdQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvbmZpZ1BhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0Nvb2tpZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29va2llIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvRG9jWE1MUlBDU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJEb2NYTUxSUENTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9IVE1MUGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJIVE1MUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvTWltZVdyaXRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiTWltZVdyaXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1F1ZXVlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJRdWV1ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZVhNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NvY2tldFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU29ja2V0U2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU3RyaW5nSU8ucHlcIjpcInJcXFwiXFxcIlxcXCJGaWxlLWxpa2Ugb2JqZWN0cyB0aGF0IHJlYWQgZnJvbSBvciB3cml0ZSB0byBhIHN0cmluZyBidWZmZXIuXFxuXFxuVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLlxcblxcbmYgPSBTdHJpbmdJTygpICAgICAgIyByZWFkeSBmb3Igd3JpdGluZ1xcbmYgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZ1xcbmYuY2xvc2UoKSAgICAgICAgICAgIyBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGRcXG5mbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlXFxucG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcykgICAgICAgICAjIHNldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0ZcXG5idWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0ZcXG5idWYgPSBmLnJlYWQobikgICAgICMgcmVhZCB1cCB0byBuIGJ5dGVzXFxuYnVmID0gZi5yZWFkbGluZSgpICAjIHJlYWQgdW50aWwgZW5kIG9mIGxpbmUgKCdcXFxcbicpIG9yIEVPRlxcbmxpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRlxcbmYudHJ1bmNhdGUoW3NpemVdKSAgIyB0cnVuY2F0ZSBmaWxlIGF0IHRvIGF0IG1vc3Qgc2l6ZSAoZGVmYXVsdDogY3VycmVudCBwb3MpXFxuZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb25cXG5mLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKVxcbmYuZ2V0dmFsdWUoKSAgICAgICAgIyByZXR1cm4gd2hvbGUgZmlsZSdzIGNvbnRlbnRzIGFzIGEgc3RyaW5nXFxuXFxuTm90ZXM6XFxuLSBVc2luZyBhIHJlYWwgZmlsZSBpcyBvZnRlbiBmYXN0ZXIgKGJ1dCBsZXNzIGNvbnZlbmllbnQpLlxcbi0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0XFxuICBpdCdzIG5vdCBzdWJjbGFzc2FibGUuXFxuLSBmaWxlbm8oKSBpcyBsZWZ0IHVuaW1wbGVtZW50ZWQgc28gdGhhdCBjb2RlIHdoaWNoIHVzZXMgaXQgdHJpZ2dlcnNcXG4gIGFuIGV4Y2VwdGlvbiBlYXJseS5cXG4tIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGxcXG4gIGJ5dGVzIHRoYXQgb2NjdXB5IHNwYWNlIGluIHRoZSBidWZmZXIuXFxuLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFtcXFwiU3RyaW5nSU9cXFwiXVxcblxcbmRlZiBfY29tcGxhaW5faWZjbG9zZWQoY2xvc2VkKTpcXG4gICAgaWYgY2xvc2VkOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpXFxuXFxuY2xhc3MgU3RyaW5nSU86XFxuICAgIFxcXCJcXFwiXFxcImNsYXNzIFN0cmluZ0lPKFtidWZmZXJdKVxcblxcbiAgICBXaGVuIGEgU3RyaW5nSU8gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZCB0byBhbiBleGlzdGluZ1xcbiAgICBzdHJpbmcgYnkgcGFzc2luZyB0aGUgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYgbm8gc3RyaW5nIGlzIGdpdmVuLFxcbiAgICB0aGUgU3RyaW5nSU8gd2lsbCBzdGFydCBlbXB0eS5cXG5cXG4gICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsIGJ1dFxcbiAgICBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0IHN0cmluZ3MgdGhhdFxcbiAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZSA4dGggYml0KSB3aWxsIGNhdXNlXFxuICAgIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKCkgaXMgY2FsbGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZiA9ICcnKTpcXG4gICAgICAgICMgRm9yY2Ugc2VsZi5idWYgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmLCBzdHIpOlxcbiAgICAgICAgICAgIGJ1ZiA9IHN0cihidWYpXFxuICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZlxcbiAgICAgICAgc2VsZi5sZW4gPSBsZW4oYnVmKVxcbiAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHNlbGYucG9zID0gMFxcbiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBuZXh0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBpdGVyKGYpIHJldHVybnMgZlxcbiAgICAgICAgKHVubGVzcyBmIGlzIGNsb3NlZCkuIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsIHR5cGljYWxseVxcbiAgICAgICAgaW4gYSBmb3IgbG9vcCAoZm9yIGV4YW1wbGUsIGZvciBsaW5lIGluIGY6IHByaW50IGxpbmUpLCB0aGUgbmV4dCgpXFxuICAgICAgICBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSxcXG4gICAgICAgIG9yIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gRU9GIGlzIGhpdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgciA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgaWYgbm90IHI6XFxuICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvblxcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIGNsb3NlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJlZSB0aGUgbWVtb3J5IGJ1ZmZlci5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOlxcbiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYucG9zID0gTm9uZVxcblxcbiAgICBkZWYgaXNhdHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJucyBGYWxzZSBiZWNhdXNlIFN0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYVxcbiAgICAgICAgdHR5LWxpa2UgZGV2aWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLlxcblxcbiAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDAgKGFic29sdXRlIGZpbGVcXG4gICAgICAgIHBvc2l0aW9uaW5nKTsgb3RoZXIgdmFsdWVzIGFyZSAxIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50XFxuICAgICAgICBwb3NpdGlvbikgYW5kIDIgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGZpbGUncyBlbmQpLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGlmIG1vZGUgPT0gMTpcXG4gICAgICAgICAgICBwb3MgKz0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgbW9kZSA9PSAyOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLmxlblxcbiAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKVxcblxcbiAgICBkZWYgdGVsbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gc2VsZi5wb3NcXG5cXG4gICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGVcXG4gICAgICAgIChsZXNzIGlmIHRoZSByZWFkIGhpdHMgRU9GIGJlZm9yZSBvYnRhaW5pbmcgc2l6ZSBieXRlcykuXFxuXFxuICAgICAgICBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBvbWl0dGVkLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRlxcbiAgICAgICAgaXMgcmVhY2hlZC4gVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuIEFuIGVtcHR5XFxuICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPCAwOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IG1pbihzZWxmLnBvcytuLCBzZWxmLmxlbilcXG4gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvczpuZXdwb3NdXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKTpcXG4gICAgICAgIHJcXFwiXFxcIlxcXCJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLlxcblxcbiAgICAgICAgQSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZSBzdHJpbmcgKGJ1dCBtYXkgYmUgYWJzZW50XFxuICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXNcXG4gICAgICAgIHByZXNlbnQgYW5kIG5vbi1uZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGVcXG4gICAgICAgIHRyYWlsaW5nIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLlxcblxcbiAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIG9ubHkgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuXFxuICAgICAgICBOb3RlOiBVbmxpa2Ugc3RkaW8ncyBmZ2V0cygpLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGxcXG4gICAgICAgIGNoYXJhY3RlcnMgKCdcXFxcMCcpIGlmIHRoZXkgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGkgPSBzZWxmLmJ1Zi5maW5kKCdcXFxcbicsIHNlbGYucG9zKVxcbiAgICAgICAgaWYgaSA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gaSsxXFxuICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYucG9zICsgbGVuZ3RoIDwgbmV3cG9zOlxcbiAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aFxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50ID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWFkIHVudGlsIEVPRiB1c2luZyByZWFkbGluZSgpIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlXFxuICAgICAgICBsaW5lcyB0aHVzIHJlYWQuXFxuXFxuICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZWhpbnQgYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZiByZWFkaW5nIHVwXFxuICAgICAgICB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5IHNpemVoaW50IGJ5dGVzIChvciBtb3JlXFxuICAgICAgICB0byBhY2NvbW1vZGF0ZSBhIGZpbmFsIHdob2xlIGxpbmUpLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0b3RhbCA9IDBcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHdoaWxlIGxpbmU6XFxuICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpXFxuICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpXFxuICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOlxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgc2l6ZT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IGlzIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0b1xcbiAgICAgICAgKGF0IG1vc3QpIHRoYXQgc2l6ZS4gVGhlIHNpemUgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXFxuICAgICAgICBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHVubGVzcyB0aGUgcG9zaXRpb25cXG4gICAgICAgIGlzIGJleW9uZCB0aGUgbmV3IGZpbGUgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBleGNlZWRzIHRoZSBmaWxlJ3MgY3VycmVudCBzaXplLCB0aGVcXG4gICAgICAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNpemUgaXMgTm9uZTpcXG4gICAgICAgICAgICBzaXplID0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgc2l6ZSA8IDA6XFxuICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigyMiwgXFxcIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWRcXFwiKVxcbiAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6XFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplXFxuICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZ2V0dmFsdWUoKVs6c2l6ZV1cXG4gICAgICAgIHNlbGYubGVuID0gc2l6ZVxcblxcbiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS5cXG5cXG4gICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgbm90IHM6IHJldHVyblxcbiAgICAgICAgIyBGb3JjZSBzIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGVcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6XFxuICAgICAgICAgICAgcyA9IHN0cihzKVxcbiAgICAgICAgc3BvcyA9IHNlbGYucG9zXFxuICAgICAgICBzbGVuID0gc2VsZi5sZW5cXG4gICAgICAgIGlmIHNwb3MgPT0gc2xlbjpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpXFxuICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIHNwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQoJ1xcXFwwJyooc3BvcyAtIHNsZW4pKVxcbiAgICAgICAgICAgIHNsZW4gPSBzcG9zXFxuICAgICAgICBuZXdwb3MgPSBzcG9zICsgbGVuKHMpXFxuICAgICAgICBpZiBzcG9zIDwgc2xlbjpcXG4gICAgICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtzZWxmLmJ1Zls6c3Bvc10sIHMsIHNlbGYuYnVmW25ld3BvczpdXVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gJydcXG4gICAgICAgICAgICBpZiBuZXdwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBzZWxmLmxlbiA9IHNsZW5cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuXFxuICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gVGhlIHNlcXVlbmNlIGNhbiBiZSBhbnlcXG4gICAgICAgIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLiBUaGVyZVxcbiAgICAgICAgaXMgbm8gcmV0dXJuIHZhbHVlLlxcblxcbiAgICAgICAgKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoIHJlYWRsaW5lcygpOyB3cml0ZWxpbmVzKCkgZG9lcyBub3QgYWRkXFxuICAgICAgICBsaW5lIHNlcGFyYXRvcnMuKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGVcXG4gICAgICAgIGZvciBsaW5lIGluIGl0ZXJhYmxlOlxcbiAgICAgICAgICAgIHdyaXRlKGxpbmUpXFxuXFxuICAgIGRlZiBmbHVzaChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXJcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcblxcbiAgICBkZWYgZ2V0dmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIFJldHJpZXZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIFxcXCJmaWxlXFxcIiBhdCBhbnkgdGltZSBiZWZvcmVcXG4gICAgICAgIHRoZSBTdHJpbmdJTyBvYmplY3QncyBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQuXFxuXFxuICAgICAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncyxcXG4gICAgICAgIGJ1dCBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0XFxuICAgICAgICBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGVcXG4gICAgICAgIDh0aCBiaXQpIHdpbGwgY2F1c2UgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKVxcbiAgICAgICAgaXMgY2FsbGVkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHJldHVybiBzZWxmLmJ1ZlxcblwiLFwic3JjL2xpYi9Vc2VyRGljdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckRpY3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyTGlzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckxpc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyU3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyU3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX0xXUENvb2tpZUphci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX0xXUENvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19Nb3ppbGxhQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTW96aWxsYUNvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fZnV0dXJlX18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9fZnV0dXJlX18gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fX3BoZWxsb19fLmZvby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19waGVsbG9fXy5mb28gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fYWJjb2xsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfYWJjb2xsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX3N0cnB0aW1lLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfc3RycHRpbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfdGhyZWFkaW5nX2xvY2FsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhYmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9haWZjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhaWZjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWx0YWlyL19faW5pdF9fLnB5XCI6XCJpbXBvcnQgcmFuZG9tXFxuXFxudHJ5OlxcbiAgICBmcm9tIHZlZ2FfY2FsbGVyIGltcG9ydCByZW5kZXJfZ3JhcGhcXG5leGNlcHQ6XFxuICAgIHByaW50KFxcXCJNb2NrIHJlbmRlclxcXCIpXFxuXFxuICAgIGRlZiByZW5kZXJfZ3JhcGgoanMpOlxcbiAgICAgICAgcHJpbnQoanMpXFxuXFxuXFxuY2xhc3MgQ2hhcnQ6XFxuICAgICMgVE9ETyBhbGxvdyBkYXRhIHRvIGJlIHNwZWNpZmllZCBhcyBhIFVSTCB0byBhIENTViBvciBEQiBvciBqc29uXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB0aXRsZT1Ob25lKTpcXG4gICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZVxcbiAgICAgICAgc2VsZi5kYXRhX2lkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwLCA1MDAwMDAwKVxcbiAgICAgICAgc2VsZi5kc25hbWUgPSBcXFwiZGF0YS17fVxcXCIuZm9ybWF0KHNlbGYuZGF0YV9pZClcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gRGF0YSgqKmRhdGEpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGFcXG5cXG4gICAgICAgIHNlbGYuanNvbiA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcIiRzY2hlbWFcXFwiXSA9IFxcXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuNS5qc29uXFxcIlxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl0gPSB7fVxcbiAgICAgICAgaWYgc2VsZi50aXRsZTpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcInRpdGxlXFxcIl0gPSBzZWxmLnRpdGxlXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHtcXFwidmFsdWVzXFxcIjogc2VsZi5kYXRhLnZhbHN9XFxuICAgICAgICBzZWxmLmlzX2NvbXBvc2l0ZSA9IEZhbHNlXFxuXFxuICAgICMgbWFyayBjYW4gYmUgYSBzaW1wbGUgc3RyaW5nIG9yIGEgZGljdGlvbmFyeVxcbiAgICAjIFxcXCJtYXJrXFxcIjoge1xcXCJjb2xvclxcXCI6IFxcXCJncmVlblxcXCIsIFxcXCJvcGFjaXR5XFxcIjogMC4yLCBcXFwidHlwZVxcXCI6IFxcXCJyZWN0XFxcIn1cXG5cXG4gICAgZGVmIG1hcmtfanNvbihzZWxmLCBtYXJrX3R5cGUsICoqa3dhcmdzKTpcXG4gICAgICAgIGlmIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXSA9IHt9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1bXFxcInR5cGVcXFwiXSA9IG1hcmtfdHlwZVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdLnVwZGF0ZShrd2FyZ3MpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0gbWFya190eXBlXFxuXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgbWFya19iYXIoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJiYXJcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfcG9pbnQoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJwb2ludFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19saW5lKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwibGluZVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19yZWN0KHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwicmVjdFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19hcmVhKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwiYXJlYVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya190aWNrKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwidGlja1xcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgZW5jb2RlKHNlbGYsIHg9XFxcIlxcXCIsIHk9XFxcIlxcXCIsIGNvbG9yPVxcXCJcXFwiLCBzaXplPVxcXCJcXFwiLCB0b29sdGlwPVxcXCJcXFwiKTpcXG4gICAgICAgIHNlbGYuZW5jb2RpbmcgPSB7fVxcbiAgICAgICAgaWYgeDpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSB4LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieFxcXCJdID0gQXhpcyh4KS50b0pzb24oKVxcbiAgICAgICAgaWYgeTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHksIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSB5LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieVxcXCJdID0gQXhpcyh5KS50b0pzb24oKVxcblxcbiAgICAgICAgIyBcXFwiY29sb3JcXFwiOiB7XFxcInR5cGVcXFwiOiBcXFwibm9taW5hbFxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJzcGVjaWVzXFxcIn1cXG4gICAgICAgIGlmIGNvbG9yOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKGNvbG9yKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcImNvbG9yXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgIyBcXFwic2l6ZVxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJxdWFudGl0YXRpdmVcXFwiLCBcXFwiZmllbGRcXFwiOiBcXFwiQWNjZWxlcmF0aW9uXFxcIn1cXG4gICAgICAgIGlmIHNpemU6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoc2l6ZSlcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJzaXplXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgaWYgdG9vbHRpcDpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZSh0b29sdGlwKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInRvb2x0aXBcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmVuY29kaW5nXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgaW50ZXJhY3RpdmUoc2VsZik6XFxuICAgICAgICBpY29uZmlnID0ge1xcbiAgICAgICAgICAgIFxcXCJzZWxlY3RvcjAwMlxcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiBcXFwiaW50ZXJ2YWxcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiYmluZFxcXCI6IFxcXCJzY2FsZXNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZW5jb2RpbmdzXFxcIjogW1xcXCJ4XFxcIiwgXFxcInlcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIm9uXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInRyYW5zbGF0ZVxcXCI6IFxcXCJbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ6b29tXFxcIjogXFxcIndoZWVsIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtYXJrXFxcIjoge1xcXCJmaWxsXFxcIjogXFxcIiMzMzNcXFwiLCBcXFwiZmlsbE9wYWNpdHlcXFwiOiAwLjEyNSwgXFxcInN0cm9rZVxcXCI6IFxcXCJ3aGl0ZVxcXCJ9LFxcbiAgICAgICAgICAgICAgICBcXFwicmVzb2x2ZVxcXCI6IFxcXCJnbG9iYWxcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNlbGYuanNvbltcXFwic2VsZWN0aW9uXFxcIl0gPSBpY29uZmlnXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgZGlzcGxheShzZWxmKTpcXG4gICAgICAgIHJlbmRlcl9ncmFwaChzZWxmLmpzb24pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcImxheWVyXFxcIilcXG5cXG4gICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwidmNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwiaGNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBhZGRfbGF5ZXIoc2VsZiwgb3RoZXIsIGxuYW1lKTpcXG4gICAgICAgICMgbXVsdGxlIGxheWVycyBhcmUgYWRkZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlXFxuICAgICAgICAjIGV4aXN0aW5nIGxheWVyLiAgSWYgdGhlIGxheWVyIGRvZXMgbm90IGV4aXN0IHRoZW4gaW5pdGlhbGl6ZVxcbiAgICAgICAgIyBpdCBmcm9tIHNlbGYuXFxuICAgICAgICBpZiBsbmFtZSBub3QgaW4gc2VsZi5qc29uOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0gPSBbXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXSA9IHt9XFxuICAgICAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogc2VsZi5kc25hbWV9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdW3NlbGYuZHNuYW1lXSA9IHNlbGYuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwibWFya1xcXCJdID0gc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmpzb25bbG5hbWVdLmFwcGVuZCh0ZW1wKVxcbiAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bb3RoZXIuZHNuYW1lXSA9IG90aGVyLmpzb25bXFxcImRhdGFcXFwiXVtcXFwidmFsdWVzXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcImRhdGFcXFwiXSA9IHtcXFwibmFtZVxcXCI6IG90aGVyLmRzbmFtZX1cXG4gICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBvdGhlci5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBvdGhlci5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcblxcbiMgICBcXFwiZGF0YXNldHNcXFwiOiB7XFxuIyAgICAgXFxcImRhdGEtZTU2ZTQzMzU0ZDliOGYyYWIwZDFlOTBjZjI3Y2Q0N2ZcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiA0LCBcXFwiYlxcXCI6IDEsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDUsIFxcXCJiXFxcIjogMiwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNiwgXFxcImJcXFwiOiAzLCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdLFxcbiMgICAgIFxcXCJkYXRhLWE0YzMwNDdhMTViZjkzODBjMmU2MTVjZjg3NjQ4MzY5XFxcIjogW1xcbiMgICAgICAge1xcXCJhXFxcIjogMSwgXFxcImJcXFwiOiA0LCBcXFwiY1xcXCI6IFxcXCJyXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiAyLCBcXFwiYlxcXCI6IDUsIFxcXCJjXFxcIjogXFxcImdcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDMsIFxcXCJiXFxcIjogNiwgXFxcImNcXFwiOiBcXFwiYlxcXCJ9XFxuIyAgICAgXVxcbiMgICB9XFxuXFxuIyBUT0RPOiAgYWRkIGEgcmVjdCBtYXJrIHR5cGUgZm9yIGEgaGVhdCBtYXBcXG5cXG5cXG5kZWYgX2dldF9uYW1lX3R5cGUobmFtZSk6XFxuICAgIHR5cGVkID0ge1xcXCJRXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJPXFxcIjogXFxcIm9yZGluYWxcXFwiLCBcXFwiTlxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcIlRcXFwiOiBcXFwidGVtcG9yYWxcXFwifVxcbiAgICBudCA9IG5hbWUuc3BsaXQoXFxcIjpcXFwiKVxcbiAgICB0c3RyaW5nID0gXFxcInF1YW50aXRhdGl2ZVxcXCJcXG4gICAgaWYgbGVuKG50KSA9PSAyOlxcbiAgICAgICAgdHN0cmluZyA9IHR5cGVkW250WzFdXVxcbiAgICByZXR1cm4gbnRbMF0sIHRzdHJpbmdcXG5cXG5cXG5jbGFzcyBBeGlzOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmluPUZhbHNlKTpcXG4gICAgICAgIHNlbGYuYWdncmVnYXRlID0gTm9uZVxcbiAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnR5cGUgPSBfZ2V0X25hbWVfdHlwZShuYW1lKVxcbiAgICAgICAgaWYgXFxcIigpXFxcIiBpbiBzZWxmLm5hbWU6ICAjIGFnZ3JlZ2F0ZSBmdW5jdGlvblxcbiAgICAgICAgICAgIHNlbGYuYWdncmVnYXRlID0gc2VsZi5uYW1lLnJlcGxhY2UoXFxcIigpXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZVxcbiAgICAgICAgc2VsZi5iaW4gPSBiaW5cXG5cXG4gICAgZGVmIHRvSnNvbihzZWxmKTpcXG4gICAgICAgIGpzb24gPSB7fVxcbiAgICAgICAgaWYgc2VsZi5uYW1lOlxcbiAgICAgICAgICAgIGpzb25bXFxcImZpZWxkXFxcIl0gPSBzZWxmLm5hbWVcXG4gICAgICAgIGlmIHNlbGYudHlwZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJ0eXBlXFxcIl0gPSBzZWxmLnR5cGVcXG4gICAgICAgIGlmIHNlbGYuYmluOlxcbiAgICAgICAgICAgIGpzb25bXFxcImJpblxcXCJdID0gVHJ1ZVxcbiAgICAgICAgaWYgc2VsZi5hZ2dyZWdhdGU6XFxuICAgICAgICAgICAganNvbltcXFwiYWdncmVnYXRlXFxcIl0gPSBzZWxmLmFnZ3JlZ2F0ZVxcblxcbiAgICAgICAgcmV0dXJuIGpzb25cXG5cXG5cXG5jbGFzcyBYKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgWShBeGlzKTpcXG4gICAgcGFzc1xcblxcblxcbmNsYXNzIERhdGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlucHV0IGNhbiBiZSB0aGUgZm9ybSBvZiBhIHNlcmllcyBvZiBrZXl3b3JkIGFyZ3Mgd2hlcmVcXG4gICAgICAgIHRoZSBrZXl3b3JkIGlzIHRoZSBjb2x1bW4gbmFtZSwgb3IgYSBzaW5nbGUga2V5d29yZCBkYXRhXFxuICAgICAgICB0aGF0IGlzIGEgbGlzdCBvZiBqc29uIHN0eWxlIHJlY29yZHMgYXMgcm93cy5cXG4gICAgICAgIGNvdWxkIGFsc28gYWNjZXB0IGEgY3N2IGZpbGU/IG9yIGtleXdvcmRzIGNvbHVtbnMgYW5kIHJvd3NcXG4gICAgICAgIFRoaXMgYWNjZXB0cyBhIGxvdCBtb3JlIG9wdGlvbnMgdGhhdCBcXFwicmVhbCBhbHRhaXJcXFwiIHRvIG1ha2UgaXQgZWFzaWVyXFxuICAgICAgICB0byB3b3JrIHdpdGggbm9uLURhdGFGcmFtZSBkYXRhIHNldHMuICBJbnRlcm5hbGx5OlxcbiAgICAgICAgc2VsZi5rZXlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNvbHVtbiBuYW1lc1xcbiAgICAgICAgc2VsZi52YWxzIGlzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgb2YgdGhlIGZvcm0gW3tjb2wxOnZhbDEsIGNvbDI6dmFsMiwgLi4uIGNvbG46dmFsbn0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbDE6dmFsMywgY29sMjp2YWw0LCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWw1LCBjb2wyOnZhbDYsIC4uLiBjb2xuOnZhbG59XVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIHRvZG86IGFjY2VwdCBhIFVSTCBhcyB0aGUgYXJndW1lbnQgdG8gcmVhZCBhIENTViBvciBKU09OIGZpbGVcXG4gICAgICAgIGlmIGxlbihrd2FyZ3MpID09IDEgYW5kIFxcXCJkYXRhXFxcIiBpbiBrd2FyZ3M6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0ga3dhcmdzW1xcXCJkYXRhXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBzZWxmLmRhdGFbMF0ua2V5cygpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gc2VsZi5kYXRhXFxuICAgICAgICBlbGlmIGxlbihrd2FyZ3MpID09IDIgYW5kIChcXFwiY29sdW1uc1xcXCIgaW4ga3dhcmdzKSBhbmQgKFxcXCJyb3dzXFxcIiBpbiBrd2FyZ3MpOlxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGt3YXJnc1tcXFwiY29sdW1uc1xcXCJdXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gW11cXG4gICAgICAgICAgICBmb3IgciBpbiBrd2FyZ3NbXFxcInJvd3NcXFwiXTpcXG4gICAgICAgICAgICAgICAgc2VsZi52YWxzLmFwcGVuZChkaWN0KHppcChzZWxmLmtleXMsIHIpKSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAga2V5cyA9IGt3YXJncy5rZXlzKClcXG4gICAgICAgICAgICB2YWxzID0gW11cXG4gICAgICAgICAgICBwcmltYXJ5X2tleSA9IGxpc3Qoa2V5cylbMF1cXG4gICAgICAgICAgICBmb3IgaXggaW4gcmFuZ2UobGVuKGt3YXJnc1twcmltYXJ5X2tleV0pKTpcXG4gICAgICAgICAgICAgICAgZCA9IHt9XFxuICAgICAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czpcXG4gICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IGt3YXJnc1trZXldW2l4XVxcbiAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZChkKVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IHZhbHNcXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBrZXlzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgIyBoZWFkZXIgPSBcXFwiXFxcXHRcXFwiLmpvaW4oc2VsZi5rZXlzKSArIFxcXCJcXFxcblxcXCJcXG4gICAgICAgIGhlYWRlciA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICBoZWFkZXIgKz0ga2V5LmNlbnRlcigxMCkgKyBcXFwiIFxcXCJcXG4gICAgICAgIGhlYWRlciArPSBcXFwiXFxcXG5cXFwiXFxuICAgICAgICB0ZW1wbGF0ZSA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICB0ZW1wbGF0ZSArPSBcXFwie1xcXCIgKyBrZXkgKyBcXFwiOiA8MTB9IFxcXCJcXG4gICAgICAgIHRlbXBsYXRlICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Igcm93IGluIHNlbGYudmFsczpcXG4gICAgICAgICAgICByZXMgKz0gdGVtcGxhdGUuZm9ybWF0KCoqcm93KVxcblxcbiAgICAgICAgcmV0dXJuIGhlYWRlciArIHJlc1xcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuICAgIGQgPSBEYXRhKGE9WzMsIDQsIDVdLCBiPVsxLCAyLCAzXSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pXFxuICAgIHByaW50KGQpXFxuICAgIHByaW50KFxcbiAgICAgICAgdHlwZShcXG4gICAgICAgICAgICBDaGFydCh7XFxcImFcXFwiOiBsaXN0KFxcXCJhYmNcXFwiKSwgXFxcImJcXFwiOiBbMSwgMiwgM119KS5tYXJrX2JhcigpLmVuY29kZSh4PVxcXCJhOk5cXFwiLCB5PVxcXCJiXFxcIilcXG4gICAgICAgIClcXG4gICAgKVxcbiAgICBhYSA9IChcXG4gICAgICAgIENoYXJ0KERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSkpXFxuICAgICAgICAubWFya19wb2ludChjb2xvcj1cXFwicmVkXFxcIilcXG4gICAgICAgIC5lbmNvZGUoeD1cXFwiYlxcXCIsIHk9XFxcImFcXFwiLCBjb2xvcj1cXFwiYzpPXFxcIilcXG4gICAgKVxcbiAgICBwcmludChcXFwiYWEgPSBcXFwiLCBhYSlcXG4gICAgYWEuZGlzcGxheSgpXFxuXFxuICAgIGJiID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVsxLCAyLCAzXSwgYj1bNCwgNSwgNl0sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX2xpbmUoKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJiYiA9IFxcXCIsIGJiKVxcbiAgICBiYi5kaXNwbGF5KClcXG4gICAgcHJpbnQoXFxcImFhK2JiXFxcIiwgKGFhICsgYmIpLmRpc3BsYXkoKSlcXG4gICAgIyBDaGFydChEYXRhKGE9WzEsMiwzLDIsMiw0LDUsNSw2LDcsOCw4LDgsOCw4LDksMCwwXSkpLm1hcmtfYmFyKCkuZW5jb2RlKEF4aXMoJ2E6UScsIGJpbj1UcnVlKSx5PSdjb3VudCgpJylcXG5cXG5cXG4jIHRvZG86IHNlZSBpZiBJIGNhbiB3b3JrIHdpdGggdGhlIHJlcHIgb2YgYW4gb2JqZWN0IHRvIGdldCB0aGUgYmVoYXZpb3IgdGhhdCBhbHRhaXIgZ2V0cyBpbiBub3RlYm9va3NcXG4jIHRvZG86IGltcGxlbWVudCBhIEJpbiBvYmplY3QgdG8gc3BlY2lmaXkgbWF4Ymluc1xcblwiLFwic3JjL2xpYi9hbHRhaXIvdmVnYV9jYWxsZXIuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdmVnYV9jYWxsZXIuanNcXFwiLF9fcGFja2FnZV9fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxyZW5kZXJfZ3JhcGg6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJyZW5kZXJfZ3JhcGhcXFwiLGFyZ3VtZW50cywxLDEpO2xldCBiPVxcXCIjXFxcIitTay5kaXZpZCtcXFwiX2dyYXBoaWNzXFxcIjt0cnl7dmVnYUVtYmVkKGIsU2suZmZpLnJlbWFwVG9KcyhhKSx7YWN0aW9uczohMH0pfWNhdGNoKGEpe3Rocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiRXJyb3IgaW4gZ3JhcGggc3BlY2lmaWNhdGlvbiB1bmFibGUgdG8gcmVuZGVyIHRoZSBncmFwaFxcXFxuXFxcIithLm1lc3NhZ2UpfX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL2FudGlncmF2aXR5LnB5XCI6XCJpbXBvcnQgd2ViYnJvd3NlclxcblxcbndlYmJyb3dzZXIub3BlbihcXFwiaHR0cHM6Ly94a2NkLmNvbS8zNTMvXFxcIilcXG5cIixcInNyYy9saWIvYW55ZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhbnlkYm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hcnJheS5qc1wiOlwiJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVtcXFwiY1xcXCIsXFxcImJcXFwiLFxcXCJCXFxcIixcXFwidVxcXCIsXFxcImhcXFwiLFxcXCJIXFxcIixcXFwiaVxcXCIsXFxcIklcXFwiLFxcXCJsXFxcIixcXFwiTFxcXCIsXFxcImZcXFwiLFxcXCJkXFxcIl07cmV0dXJuIGEuX19uYW1lX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpLGEuYXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLC0xPT1iLmluZGV4T2YoU2suZmZpLnJlbWFwVG9KcyhjKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGMsIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZClcXFwiKTtpZihkJiYhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7aWYoYS4kZC5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihcXFwidHlwZWNvZGVcXFwiKSxjKSxhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfX21vZHVsZV9fXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpKSxhLnR5cGVjb2RlPWMsdm9pZCAwPT09ZClhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdDtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpYS5pbnRlcm5hbEl0ZXJhYmxlPWQ7ZWxzZSBmb3IoYS5pbnRlcm5hbEl0ZXJhYmxlPW5ldyBTay5idWlsdGluLmxpc3QsaXRlcj1Tay5hYnN0ci5pdGVyKGQpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KSxjLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLnR5cGVjb2RlKSxjPVxcXCJcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkubGVuZ3RoJiYoXFxcImNcXFwiPT1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpP2M9XFxcIiwgJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLmludGVybmFsSXRlcmFibGUpLmpvaW4oXFxcIlxcXCIpK1xcXCInXFxcIjpjPVxcXCIsIFxcXCIrU2suZmZpLnJlbWFwVG9KcyhTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLl9fcmVwcl9fLFthLmludGVybmFsSXRlcmFibGVdKSkpLG5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXkoJ1xcXCIrYitcXFwiJ1xcXCIrYytcXFwiKVxcXCIpfSksYy5fX3N0cl9fPWMuX19yZXByX18sYy5fX2dldGF0dHJpYnV0ZV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50cCRnZXRhdHRyKGIpfSksYy5hcHBlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGJdKSxTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmV4dGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSwhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7Zm9yKGl0ZXI9U2suYWJzdHIuaXRlcihiKSxpdGVtPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pdGVtO2l0ZW09aXRlci50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsaXRlbV0pfSl9LFxcXCJhcnJheVxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi9hc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jaGF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY2hhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jb3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY29yZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2F0ZXhpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXRleGl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXVkaW9kZXYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImF1ZGlvZGV2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmFzZTY0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiYXNlNjQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JpbmhleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmluaGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmlzZWN0LnB5XCI6XCJcXFwiXFxcIlxcXCJCaXNlY3Rpb24gYWxnb3JpdGhtcy5cXFwiXFxcIlxcXCJcXG5cXG5kZWYgaW5zb3J0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuZGVmIGJpc2VjdF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDw9IHgsIGFuZCBhbGwgZSBpblxcbiAgICBhW2k6XSBoYXZlIGUgPiB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYWZ0ZXIgdGhlIHJpZ2h0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgcmV0dXJuIGxvXFxuXFxuZGVmIGluc29ydF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSBsZWZ0IG9mIHRoZSBsZWZ0bW9zdCB4LlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzFcXG4gICAgICAgIGVsc2U6IGhpID0gbWlkXFxuICAgIGEuaW5zZXJ0KGxvLCB4KVxcblxcblxcbmRlZiBiaXNlY3RfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDwgeCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+PSB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYmVmb3JlIHRoZSBsZWZ0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgcmV0dXJuIGxvXFxuXFxuIyBPdmVyd3JpdGUgYWJvdmUgZGVmaW5pdGlvbnMgd2l0aCBhIGZhc3QgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfYmlzZWN0IGltcG9ydCAqXFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyBDcmVhdGUgYWxpYXNlc1xcbmJpc2VjdCA9IGJpc2VjdF9yaWdodFxcbmluc29ydCA9IGluc29ydF9yaWdodFxcblwiLFwic3JjL2xpYi9ic2RkYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYnNkZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jUHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY1Byb2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jYWxlbmRhci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2FsZW5kYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jZ2kucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaXRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjZ2l0YiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NodW5rLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjaHVuayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NtZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY21kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGVjcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZW9wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2Rlb3AgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2xsZWN0aW9ucy5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtjb25zdCBhPXt9O3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXFxcImtleXdvcmRcXFwiLCExLCEwKSxiPT4oYS5faXNrZXl3b3JkPWIuJGQuaXNrZXl3b3JkLFNrLmltcG9ydE1vZHVsZShcXFwiaXRlcnRvb2xzXFxcIiwhMSwhMCkpLGI9PihhLl9jaGFpbj1iLiRkLmNoYWluLGEuX3N0YXJtYXA9Yi4kZC5zdGFybWFwLGEuX3JlcGVhdD1iLiRkLnJlcGVhdCxTay5pbXBvcnRNb2R1bGUoXFxcIm9wZXJhdG9yXFxcIiwhMSwhMCkpLGI9PnthLl9pdGVtZ2V0dGVyPWIuJGQuaXRlbWdldHRlcn0sKCk9PmNvbGxlY3Rpb25zX21vZChhKSl9ZnVuY3Rpb24gY29sbGVjdGlvbnNfbW9kKGEpe2Z1bmN0aW9uIGNvdW50ZXJOdW1iZXJTbG90KGIpe3JldHVybiBmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jJiYhKGMgaW5zdGFuY2VvZiBhLkNvdW50ZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPW5ldyBhLkNvdW50ZXI7cmV0dXJuIGIuY2FsbCh0aGlzLGQsYyksZH19ZnVuY3Rpb24gY291bnRlcklucGxhY2VTbG90KGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJDb3VudGVyIFxcXCIrYStcXFwiPSBcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgaXMgbm90IHN1cHBvcnRlZFxcXCIpO3JldHVybiBiLmNhbGwodGhpcyxjKSx0aGlzLmtlZXAkcG9zaXRpdmUoKX19ZnVuY3Rpb24gbmFtZWR0dXBsZShiLGMsZCxsLG0pe2Z1bmN0aW9uIF9tYWtlKGEsYil7cmV0dXJuIGEucHJvdG90eXBlLnRwJG5ldyhTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiKSl9ZnVuY3Rpb24gX2FzZGljdChhKXtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5fZmllbGRzLnYubGVuZ3RoO2MrKyliLnB1c2goYS5fZmllbGRzLnZbY10pLGIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5kaWN0KGIpfWZ1bmN0aW9uIF9yZXBsYWNlKGEsYil7YT1uZXcgU2suYnVpbHRpbi5kaWN0KGEpO2NvbnN0IGM9YS50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwicG9wXFxcIikpLGQ9U2suYWJzdHIuZ2F0dHIoYixuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9tYWtlXFxcIikpLGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5LGY9ZShkLFtlKFNrLmJ1aWx0aW4ubWFwXyxbYyxyLGJdKV0pO2lmKGEuc3EkbGVuZ3RoKCkpe2NvbnN0IGI9YS5zayRhc2FycmF5KCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiR290IHVuZXhwZWN0ZCBmaWVsZCBuYW1lczogW1xcXCIrYi5tYXAoYT0+XFxcIidcXFwiK2EuJGpzc3RyKCkrXFxcIidcXFwiKStcXFwiXVxcXCIpfXJldHVybiBmfWlmKGI9Yi50cCRzdHIoKSxTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbYl0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpK1xcXCInXFxcIik7Y29uc3Qgbj1iLiRqc3N0cigpO2lmKGUudGVzdChuKXx8IWcudGVzdChuKXx8IW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrbitcXFwiJ1xcXCIpO2xldCBvLHA7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSlvPWMuJGpzc3RyKCkucmVwbGFjZShoLFxcXCIgXFxcIikuc3BsaXQoaiksMT09by5sZW5ndGgmJlxcXCJcXFwiPT09b1swXSYmKG89W10pLHA9by5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKTtlbHNle289W10scD1bXTtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKWI9Yi50cCRzdHIoKSxwLnB1c2goYiksby5wdXNoKGIuJGpzc3RyKCkpfWxldCBxPW5ldyBTZXQ7aWYoU2subWlzY2V2YWwuaXNUcnVlKGQpKWZvcihpPTA7aTxvLmxlbmd0aDtpKyspKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpfHxmLnRlc3Qob1tpXSl8fCFnLnRlc3Qob1tpXSl8fCFvW2ldfHxxLmhhcyhvW2ldKSkmJihvW2ldPVxcXCJfXFxcIitpLHBbaV09bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfXFxcIitpKSkscS5hZGQob1tpXSk7ZWxzZSBmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXtpZihTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbcFtpXV0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihmLnRlc3Qob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYoIWcudGVzdChvW2ldKXx8IW9baV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYocS5oYXMob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICdcXFwiK29baV0rXFxcIidcXFwiKTtxLmFkZChvW2ldKX1jb25zdCByPW5ldyBTay5idWlsdGluLnR1cGxlKHApLHM9W107bGV0IHQ9W107aWYoIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGwpKXtpZih0PVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGwpLHQubGVuZ3RoPm8ubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiR290IG1vcmUgZGVmYXVsdCB2YWx1ZXMgdGhhbiBmaWVsZCBuYW1lc1xcXCIpO2ZvcihsZXQgYT0wLGI9cC5sZW5ndGgtdC5sZW5ndGg7YjxwLmxlbmd0aDthKyssYisrKXMucHVzaChwW2JdKSxzLnB1c2godFthXSl9Y29uc3QgdT1uZXcgU2suYnVpbHRpbi5kaWN0KHMpO19tYWtlLmNvX3Zhcm5hbWVzPVtcXFwiX2Nsc1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sX2FzZGljdC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiXSxfcmVwbGFjZS5jb19rd2FyZ3M9MSxfcmVwbGFjZS5jb192YXJuYW1lcz1bXFxcIl9zZWxmXFxcIl07Y29uc3Qgdj17fTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl2W3BbZV0uJG1hbmdsZWRdPW5ldyBTay5idWlsdGluLnByb3BlcnR5KG5ldyBhLl9pdGVtZ2V0dGVyKFtuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSksdm9pZCAwLHZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFsaWFzIGZvciBmaWVsZCBudW1iZXIgXFxcIitlKSk7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3Mobix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gTmFtZWRUdXBsZSgpe30sYmFzZTpTay5idWlsdGluLnR1cGxlLHNsb3RzOnt0cCRkb2M6bitcXFwiKFxcXCIrby5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIix0cCRuZXcoYSxiKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJfX25ld19fXFxcIixvLGEsYix0KTtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5idWlsdGluLnR1cGxlLmNhbGwoYyxhKSxjfSwkcigpe2NvbnN0IGE9dGhpcy52Lm1hcCgoYSxiKT0+b1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIil9fSxwcm90bzpPYmplY3QuYXNzaWduKHtfX21vZHVsZV9fOlNrLmJ1aWx0aW4uY2hlY2tOb25lKG0pP1NrLmdsb2JhbHMuX19uYW1lX186bSxfX3Nsb3RzX186bmV3IFNrLmJ1aWx0aW4udHVwbGUsX2ZpZWxkczpyLF9maWVsZF9kZWZhdWx0czp1LF9tYWtlOm5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kKG5ldyBTay5idWlsdGluLmZ1bmMoX21ha2UpKSxfYXNkaWN0Om5ldyBTay5idWlsdGluLmZ1bmMoX2FzZGljdCksX3JlcGxhY2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfcmVwbGFjZSl9LHYpfSl9YS5fX2FsbF9fPW5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJkZXF1ZVxcXCIsXFxcImRlZmF1bHRkaWN0XFxcIixcXFwibmFtZWR0dXBsZVxcXCIsXFxcIkNvdW50ZXJcXFwiLFxcXCJPcmRlcmVkRGljdFxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKSxhLmRlZmF1bHRkaWN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVmYXVsdGRpY3QoYSxiKXt0aGlzLmRlZmF1bHRfZmFjdG9yeT1hLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMsYil9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2NvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9fSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fbWlzc2luZ19fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLmRlZmF1bHRfZmFjdG9yeSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7ZWxzZXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmRlZmF1bHRfZmFjdG9yeSxbXSk7cmV0dXJuIHRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpLGJ9fSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntkZWZhdWx0X2ZhY3Rvcnk6eyRnZXQoKXtyZXR1cm4gdGhpcy5kZWZhdWx0X2ZhY3Rvcnl9LCRzZXQoYSl7YT1hfHxTay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YX19fSxzbG90czp7dHAkZG9jOlxcXCJkZWZhdWx0ZGljdChkZWZhdWx0X2ZhY3RvcnlbLCAuLi5dKSAtLT4gZGljdCB3aXRoIGRlZmF1bHQgZmFjdG9yeVxcXFxuXFxcXG5UaGUgZGVmYXVsdCBmYWN0b3J5IGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cyB0byBwcm9kdWNlXFxcXG5hIG5ldyB2YWx1ZSB3aGVuIGEga2V5IGlzIG5vdCBwcmVzZW50LCBpbiBfX2dldGl0ZW1fXyBvbmx5LlxcXFxuQSBkZWZhdWx0ZGljdCBjb21wYXJlcyBlcXVhbCB0byBhIGRpY3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy5cXFxcbkFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZVxcXFxucGFzc2VkIHRvIHRoZSBkaWN0IGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcga2V5d29yZCBhcmd1bWVudHMuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1jKXRoaXMuZGVmYXVsdF9mYWN0b3J5PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGVcXFwiKTtlbHNlIHRoaXMuZGVmYXVsdF9mYWN0b3J5PWM7cmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaW5pdC5jYWxsKHRoaXMsYSxiKX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5kZWZhdWx0X2ZhY3RvcnkpLGI9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiZGVmYXVsdGRpY3QoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiKVxcXCIpfX0scHJvdG86eyRjb3B5KCl7Y29uc3QgYj1bXTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKHRoaXMpLGE9PntiLnB1c2goYSksYi5wdXNoKHRoaXMubXAkc3Vic2NyaXB0KGEpKX0pLG5ldyBhLmRlZmF1bHRkaWN0KHRoaXMuZGVmYXVsdF9mYWN0b3J5LGIpfX19KSxhLkNvdW50ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiQ291bnRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIENvdW50ZXIoKXt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3QsU2suYnVpbHRpbi5kaWN0LmFwcGx5KHRoaXMpfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxtZXRob2RzOntlbGVtZW50czp7JGZsYWdzOntOb0FyZ3M6ITB9LCRtZXRoKCl7Y29uc3QgYj1hLl9jaGFpbi50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwiZnJvbV9pdGVyYWJsZVxcXCIpKSxjPWEuX3N0YXJtYXAsZD1hLl9yZXBlYXQsZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXk7cmV0dXJuIGUoYixbZShjLFtkLGUodGhpcy50cCRnZXRhdHRyKHRoaXMuc3RyJGl0ZW1zKSldKV0pfX0sbW9zdF9jb21tb246eyRmbGFnczp7TmFtZWRBcmdzOltcXFwiblxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSRdfSwkbWV0aChhKXtsZW5ndGg9dGhpcy5zcSRsZW5ndGgoKSxTay5idWlsdGluLmNoZWNrTm9uZShhKT9hPWxlbmd0aDooYT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKSxhPWE+bGVuZ3RoP2xlbmd0aDowPmE/MDphKTtjb25zdCBiPXRoaXMuJGl0ZW1zKCkuc29ydCgoYyxhKT0+U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiTHRcXFwiKT8xOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjWzFdLGFbMV0sXFxcIkd0XFxcIik/LTE6MCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi5zbGljZSgwLGEpLm1hcChhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSkpfX0sdXBkYXRlOnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInVwZGF0ZVxcXCIsYSwwLDEpLHRoaXMuY291bnRlciR1cGRhdGUoYSxiKX19LHN1YnRyYWN0OnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwic3VidHJhY3RcXFwiLGEsMCwxKTtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiU3ViXFxcIikpfWVsc2UgZm9yKGl0ZXI9U2suYWJzdHIuaXRlcihjKSxrPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1rO2s9aXRlci50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGspO3RoaXMubXAkYXNzX3N1YnNjcmlwdChrLFNrLmFic3RyLm51bWJlckJpbk9wKGEsdGhpcy4kb25lLFxcXCJTdWJcXFwiKSl9Yj1ifHxbXTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrPTIpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbY10pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYSk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2MrMV0sXFxcIlN1YlxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19taXNzaW5nX186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHplcm99LCRmbGFnczp7T25lQXJnOiEwfX0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuQ291bnRlcixbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH19fSxnZXRzZXRzOntfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9LHNsb3RzOnt0cCRkb2M6XFxcIkRpY3Qgc3ViY2xhc3MgZm9yIGNvdW50aW5nIGhhc2hhYmxlIGl0ZW1zLiAgU29tZXRpbWVzIGNhbGxlZCBhIGJhZ1xcXFxuICAgIG9yIG11bHRpc2V0LiAgRWxlbWVudHMgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IGtleXMgYW5kIHRoZWlyIGNvdW50c1xcXFxuICAgIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSB2YWx1ZXMuXFxcXG5cXFxcbiAgICA+Pj4gYyA9IENvdW50ZXIoJ2FiY2RlYWJjZGFiY2FiYScpICAjIGNvdW50IGVsZW1lbnRzIGZyb20gYSBzdHJpbmdcXFxcblxcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKDMpICAgICAgICAgICAgICAgICMgdGhyZWUgbW9zdCBjb21tb24gZWxlbWVudHNcXFxcbiAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV1cXFxcbiAgICA+Pj4gc29ydGVkKGMpICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QgYWxsIHVuaXF1ZSBlbGVtZW50c1xcXFxuICAgIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ11cXFxcbiAgICA+Pj4gJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSkgICAjIGxpc3QgZWxlbWVudHMgd2l0aCByZXBldGl0aW9uc1xcXFxuICAgICdhYWFhYWJiYmJjY2NkZGUnXFxcXG4gICAgPj4+IHN1bShjLnZhbHVlcygpKSAgICAgICAgICAgICAgICAgIyB0b3RhbCBvZiBhbGwgY291bnRzXFxcXG4gICAgMTVcXFxcblxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgY291bnQgb2YgbGV0dGVyICdhJ1xcXFxuICAgIDVcXFxcbiAgICA+Pj4gZm9yIGVsZW0gaW4gJ3NoYXphbSc6ICAgICAgICAgICAjIHVwZGF0ZSBjb3VudHMgZnJvbSBhbiBpdGVyYWJsZVxcXFxuICAgIC4uLiAgICAgY1tlbGVtXSArPSAxICAgICAgICAgICAgICAgICMgYnkgYWRkaW5nIDEgdG8gZWFjaCBlbGVtZW50J3MgY291bnRcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgc2V2ZW4gJ2EnXFxcXG4gICAgN1xcXFxuICAgID4+PiBkZWwgY1snYiddICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCAnYidcXFxcbiAgICA+Pj4gY1snYiddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgemVybyAnYidcXFxcbiAgICAwXFxcXG5cXFxcbiAgICA+Pj4gZCA9IENvdW50ZXIoJ3NpbXNhbGFiaW0nKSAgICAgICAjIG1ha2UgYW5vdGhlciBjb3VudGVyXFxcXG4gICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAgICAgIyBhZGQgaW4gdGhlIHNlY29uZCBjb3VudGVyXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIG5pbmUgJ2EnXFxcXG4gICAgOVxcXFxuXFxcXG4gICAgPj4+IGMuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgY291bnRlclxcXFxuICAgID4+PiBjXFxcXG4gICAgQ291bnRlcigpXFxcXG5cXFxcbiAgICBOb3RlOiAgSWYgYSBjb3VudCBpcyBzZXQgdG8gemVybyBvciByZWR1Y2VkIHRvIHplcm8sIGl0IHdpbGwgcmVtYWluXFxcXG4gICAgaW4gdGhlIGNvdW50ZXIgdW50aWwgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgb3IgdGhlIGNvdW50ZXIgaXMgY2xlYXJlZDpcXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWFhYmJjJylcXFxcbiAgICA+Pj4gY1snYiddIC09IDIgICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSB0aGUgY291bnQgb2YgJ2InIGJ5IHR3b1xcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKCkgICAgICAgICAgICAgICAgICMgJ2InIGlzIHN0aWxsIGluLCBidXQgaXRzIGNvdW50IGlzIHplcm9cXFxcbiAgICBbKCdhJywgMyksICgnYycsIDEpLCAoJ2InLCAwKV1cXFxcblxcXFxuXFxcIix0cCRpbml0KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLnRwanNfbmFtZSxhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfSwkcigpe2NvbnN0IGE9MDx0aGlzLnNpemU/U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY6XFxcIlxcXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStcXFwiKVxcXCIpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJGFzc19zdWJzY3JpcHQoYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLm1wJGxvb2t1cChhKSYmU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpOlNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUubXAkYXNzX3N1YnNjcmlwdC5jYWxsKHRoaXMsYSxiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHBvc2l0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJG5lZ2F0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJHN1YnRyYWN0OmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIlN1YlxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJGFkZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1Tay5hYnN0ci5udW1iZXJCaW5PcChkLGIubXAkc3Vic2NyaXB0KGMpLFxcXCJBZGRcXFwiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZSx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxlKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRpbnBsYWNlX2FkZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIitcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiQWRkXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJGlucGxhY2Vfc3VidHJhY3Q6Y291bnRlcklucGxhY2VTbG90KFxcXCItXFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e2NvbnN0IGM9U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKHRoaXMubXAkc3Vic2NyaXB0KGEpLGIsXFxcIlN1YlxcXCIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLGMpfSl9KSxuYiRvcjpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZTpkO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGFuZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZDplO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSl9KSxuYiRpbnBsYWNlX2FuZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIiZcXFwiLGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57Y29uc3QgZD1hLm1wJHN1YnNjcmlwdChiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxjLFxcXCJMdFxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixkKX0pfSksbmIkaW5wbGFjZV9vcjpjb3VudGVySW5wbGFjZVNsb3QoXFxcInxcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy5tcCRzdWJzY3JpcHQoYSksXFxcIkd0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpfSl9KSxuYiRyZWZsZWN0ZWRfYW5kOm51bGwsbmIkcmVmbGVjdGVkX29yOm51bGwsbmIkcmVmbGVjdGVkX2FkZDpudWxsLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpudWxsfSxwcm90bzp7a2VlcCRwb3NpdGl2ZSgpe3JldHVybiB0aGlzLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLHRoaXMuJHplcm8sXFxcIkx0RVxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSl9KSx0aGlzfSwkemVybzpuZXcgU2suYnVpbHRpbi5pbnRfKDApLCRvbmU6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpdGVtc1xcXCIpLGNvdW50ZXIkdXBkYXRlKGEsYil7Y29uc3QgYz1hWzBdO2lmKHZvaWQgMCE9PWMpaWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGMpKWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIkFkZFxcXCIpKX1lbHNlIGlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihhLHZvaWQgMCxcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsYy5tcCRzdWJzY3JpcHQoYiksXFxcIkFkZFxcXCIpKX1pZihiJiZiLmxlbmd0aClpZighdGhpcy5zcSRsZW5ndGgoKSl0aGlzLnVwZGF0ZSRjb21tb24oW10sYixcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErPTIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYyk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGMsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2ErMV0sXFxcIkFkZFxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24gZnJvbWtleXMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb3VudGVyLmZyb21rZXlzKCkgaXMgdW5kZWZpbmVkLiAgVXNlIENvdW50ZXIoaXRlcmFibGUpIGluc3RlYWQuXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn19fX0pO2NvbnN0IGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJvZGljdF9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIG9kaWN0X2l0ZXJfKGEpe3RoaXMuJGluZGV4PTAsdGhpcy4kc2VxPWEuc2skYXNhcnJheSgpLHRoaXMuJG9yaWc9YX0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheUNoZWNrU2l6ZSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO2EuT3JkZXJlZERpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiT3JkZXJlZERpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBPcmRlcmVkRGljdCgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzPVtdLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMpLHRoaXN9LGJhc2U6U2suYnVpbHRpbi5kaWN0LHNsb3RzOnt0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIk9yZGVyZWREaWN0XFxcIixhLDAsMSksYS51bnNoaWZ0KHRoaXMpLHJlcz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy51cGRhdGUsYSxiKX0sdHAkZG9jOlxcXCJEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlclxcXCIsJHIoKXtsZXQgYSxiO2NvbnN0IGM9W107Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGQ9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1iLnRwJGl0ZXJuZXh0KCkpYT10aGlzLm1wJHN1YnNjcmlwdChkKSx2b2lkIDA9PT1hJiYoYT1udWxsKSxjLnB1c2goXFxcIihcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoZCkrXFxcIiwgXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIpXFxcIik7cmV0dXJuIGI9Yy5qb2luKFxcXCIsIFxcXCIpLDA8Yy5sZW5ndGgmJihiPVxcXCJbXFxcIitiK1xcXCJdXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcmRlcmVkRGljdChcXFwiK2IrXFxcIilcXFwiKX0sdHAkcmljaGNvbXBhcmUoYixjKXtpZihcXFwiRXFcXFwiIT1jJiZcXFwiTmVcXFwiIT1jKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPVxcXCJFcVxcXCI9PWM7aWYoIShiIGluc3RhbmNlb2YgYS5PcmRlcmVkRGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkcmljaGNvbXBhcmUuY2FsbCh0aGlzLGIsYyk7Y29uc3QgZT10aGlzLnNpemUsZj1iLnNpemU7aWYoZSE9PWYpcmV0dXJuIWQ7Zm9yKGxldCBhPXRoaXMudHAkaXRlcigpLGU9Yi50cCRpdGVyKCksZj1hLnRwJGl0ZXJuZXh0KCksZz1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKSl7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZixnLFxcXCJFcVxcXCIpKSlyZXR1cm4hZDtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGYpLGM9Yi5tcCRzdWJzY3JpcHQoZyk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFxcXCJFcVxcXCIpKSlyZXR1cm4hZH1yZXR1cm4gZH0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2NvbnN0IGI9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpfWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfX0sbWV0aG9kczp7cG9wOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImRlZmF1bHRcXFwiXSxEZWZhdWx0czpbbnVsbF19LCRtZXRoKGEsYil7cmV0dXJuIG51bGw9PT1iP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCxbdGhpcyxhXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGEsYl0pfX0scG9waXRlbTp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEpe2xldCBiLGM7aWYoIXRoaXMub3JkZXJlZGtleXMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFxcXCJkaWN0aW9uYXJ5IGlzIGVtcHR5XFxcIik7cmV0dXJuIGI9dGhpcy5vcmRlcmVka2V5c1swXSxTay5taXNjZXZhbC5pc1RydWUoYSkmJihiPXRoaXMub3JkZXJlZGtleXNbdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgtMV0pLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucG9wLFt0aGlzLGJdKSxuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9fSxtb3ZlX3RvX2VuZDp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJrZXlcXFwiLFxcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEsYil7bGV0IGMsZD0tMTtmb3IobGV0IGU9MDtlPHRoaXMub3JkZXJlZGtleXMubGVuZ3RoO2UrKylpZihjPXRoaXMub3JkZXJlZGtleXNbZV0sYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpe2Q9ZTticmVha31pZigtMSE9PWQpdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoZCwxKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik/dGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpOnRoaXMub3JkZXJlZGtleXMudW5zaGlmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9fX0scHJvdG86e3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zbGljZSgwKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTstMT09YyYmdGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuc2V0JGl0ZW0uY2FsbCh0aGlzLGEsYil9LHBvcCRpdGVtKGEpe3ZhciBiPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTtpZigtMSE9YilyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoYiwxKSxTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCRpdGVtLmNhbGwodGhpcyxhKX19fSksYS5kZXF1ZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJjb2xsZWN0aW9ucy5kZXF1ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRlcXVlKGEsYixjLGQsZSl7dGhpcy5oZWFkPWN8fDAsdGhpcy50YWlsPWR8fDAsdGhpcy5tYXNrPWV8fDEsdGhpcy5tYXhsZW49Yix0aGlzLnY9YXx8WywsXX0sc2xvdHM6e3RwJGRvYzpcXFwiZGVxdWUoW2l0ZXJhYmxlWywgbWF4bGVuXV0pIC0tPiBkZXF1ZSBvYmplY3RcXFxcblxcXFxuQSBsaXN0LWxpa2Ugc2VxdWVuY2Ugb3B0aW1pemVkIGZvciBkYXRhIGFjY2Vzc2VzIG5lYXIgaXRzIGVuZHBvaW50cy5cXFwiLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7aWYoW2l0ZXJhYmxlLG1heGxlbl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImRlcXVlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwibWF4bGVuXFxcIl0sYSxiKSx2b2lkIDAhPT1tYXhsZW4mJiFTay5idWlsdGluLmNoZWNrTm9uZShtYXhsZW4pKWlmKG1heGxlbj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQobWF4bGVuLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFxcXCIpLDA+bWF4bGVuKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1heGxlbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2Vsc2UgdGhpcy5tYXhsZW49bWF4bGVuO3RoaXMuJGNsZWFyKCksdm9pZCAwIT09aXRlcmFibGUmJnRoaXMuJGV4dGVuZChpdGVyYWJsZSl9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHJpY2hjb21wYXJlKGIsYyl7dmFyIGQ9TWF0aC5tYXg7aWYodGhpcz09PWImJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9YixmPXRoaXMudjtiPWIudjtjb25zdCBnPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGg9ZS50YWlsLWUuaGVhZCZlLm1hc2s7bGV0IGosbD1kKGcsaCk7aWYoZz09PWgpZm9yKGw9MDtsPGcmJmw8aCYmKGo9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sXFxcIkVxXFxcIiksISFqKTsrK2wpO2lmKGw+PWd8fGw+PWgpc3dpdGNoKGMpe2Nhc2VcXFwiTHRcXFwiOnJldHVybiBnPGg7Y2FzZVxcXCJMdEVcXFwiOnJldHVybiBnPD1oO2Nhc2VcXFwiRXFcXFwiOnJldHVybiBnPT09aDtjYXNlXFxcIk5vdEVxXFxcIjpyZXR1cm4gZyE9PWg7Y2FzZVxcXCJHdFxcXCI6cmV0dXJuIGc+aDtjYXNlXFxcIkd0RVxcXCI6cmV0dXJuIGc+PWg7fXJldHVyblxcXCJFcVxcXCIhPT1jJiYoXFxcIk5vdEVxXFxcIj09PWN8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmW3RoaXMuaGVhZCtsJnRoaXMubWFza10sYltlLmhlYWQrbCZlLm1hc2tdLGMpKX0sdHAkaXRlcigpe3JldHVybiBuZXcgYyh0aGlzKX0sJHIoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYodGhpcy4kZW50ZXJlZF9yZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlsuLi5dXFxcIik7dGhpcy4kZW50ZXJlZF9yZXByPSEwO2ZvcihsZXQgYz0wO2M8YjtjKyspYS5wdXNoKFNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy52W3RoaXMuaGVhZCtjJnRoaXMubWFza10pKTtjb25zdCBjPVNrLmFic3RyLnR5cGVOYW1lKHRoaXMpO3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj8odGhpcy4kZW50ZXJlZF9yZXByPXZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoYytcXFwiKFtcXFwiK2EuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXFxcIiwgXFxcIikrXFxcIl0pXFxcIikpOm5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSwgbWF4bGVuPVxcXCIrdGhpcy5tYXhsZW4rXFxcIilcXFwiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJGJvb2woKXtyZXR1cm4gMCE9KHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrKX0sdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRjb25jYXQoYil7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJjYW4gb25seSBjb25jYXRlbmF0ZSBkZXF1ZSAobm90ICdcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInKSB0byBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy4kY29weSgpO2ZvcihsZXQgYT1iLnRwJGl0ZXIoKSxkPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9YS50cCRpdGVybmV4dCgpKWMuJHB1c2goZCk7cmV0dXJuIGN9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFza30sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIik7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayxjPXRoaXMuJGNvcHkoKTtsZXQgZDswPj1hJiZjLiRjbGVhcigpO2ZvcihsZXQgZT0xO2U8YTtlKyspZm9yKGxldCBhPTA7YTxiO2ErKylkPXRoaXMuaGVhZCthJnRoaXMubWFzayxjLiRwdXNoKHRoaXMudltkXSk7cmV0dXJuIGN9LG1wJHN1YnNjcmlwdChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Ynx8YTwtYil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3JldHVybiB0aGlzLnZbY119LG1wJGFzc19zdWJzY3JpcHQoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Y3x8YTwtYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTt2b2lkIDA9PT1iP3RoaXMuZGVsJGl0ZW0oYSk6dGhpcy5zZXQkaXRlbShhLGIpfSxuYiRpbnBsYWNlX2FkZChhKXtmb3IodGhpcy5tYXhsZW49dm9pZCAwLGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSk7cmV0dXJuIHRoaXN9LG5iJGlucGxhY2VfbXVsdGlwbHkoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXFxcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAne3RwJG5hbWV9J1xcXCIpLDA+PWEmJnRoaXMuJGNsZWFyKCk7Y29uc3QgYj10aGlzLiRjb3B5KCksYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGQ9MTtkPGE7ZCsrKWZvcihsZXQgYT0wO2E8YzthKyspe2NvbnN0IGM9dGhpcy5oZWFkK2EmdGhpcy5tYXNrO2IuJHB1c2godGhpcy52W2NdKX1yZXR1cm4gdGhpcy52PWIudix0aGlzLmhlYWQ9Yi5oZWFkLHRoaXMudGFpbD1iLnRhaWwsdGhpcy5tYXNrPWIubWFzayx0aGlzfX0sbWV0aG9kczp7YXBwZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxhcHBlbmRsZWZ0OnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaExlZnQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxjbGVhcjp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY2xlYXIoKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuXFxcIn0sX19jb3B5X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuXFxcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztsZXQgYz0wO2ZvcihsZXQgZD0wO2Q8YjtkKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMudlt0aGlzLmhlYWQrZCZ0aGlzLm1hc2tdLGEsXFxcIkVxXFxcIikmJmMrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5jb3VudCh2YWx1ZSkgLT4gaW50ZWdlciAtLSByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlXFxcIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kZXh0ZW5kKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0sZXh0ZW5kbGVmdDp7JG1ldGgoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2hMZWZ0KGkpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkV4dGVuZCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0saW5kZXg6eyRtZXRoKGEsYixjKXtjb25zdCBkPXRoaXMuJGluZGV4KGEsYixjKTtpZih2b2lkIDAhPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGQpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbmRleCh2YWx1ZSwgW3N0YXJ0LCBbc3RvcF1dKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXFxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cXFwifSxpbnNlcnQ6eyRtZXRoKGEsYil7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3Qge3RwJG5hbWV9XFxcIik7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih2b2lkIDAhPT10aGlzLm1heGxlbiYmYz49dGhpcy5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgYWxyZWFkeSBhdCBpdHMgbWF4aW11bSBzaXplXFxcIik7YT5jJiYoYT1jKSxhPD0tYyYmKGE9MCk7Y29uc3QgZD0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztsZXQgZT10aGlzLnRhaWw7Zm9yKHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2s7ZSE9PWQ7KXtjb25zdCBhPWUtMSZ0aGlzLm1hc2s7dGhpcy52W2VdPXRoaXMudlthXSxlPWF9cmV0dXJuIHRoaXMudltkXT1iLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXhcXFwifSxwb3A6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHBvcCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuXFxcIn0scG9wbGVmdDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wTGVmdCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgbGVmdG1vc3QgZWxlbWVudC5cXFwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9dGhpcy4kaW5kZXgoYSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIiBpcyBub3QgaW4gZGVxdWVcXFwiKTtjb25zdCBjPXRoaXMuaGVhZCtiJnRoaXMubWFzaztmb3IobGV0IGI9YztiIT09dGhpcy50YWlsOyl7Y29uc3QgYT1iKzEmdGhpcy5tYXNrO3RoaXMudltiXT10aGlzLnZbYV0sYj1hfXRoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7dmFyIGQ9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7ZDx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoZCx0aGlzLnYubGVuZ3RoPj4+MSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXFwifSxfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBkKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELl9fcmV2ZXJzZWRfXygpIC0tIHJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWVcXFwifSxyZXZlcnNlOnskbWV0aCgpe2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy50YWlsLGU9dGhpcy5tYXNrLGY9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBnPTA7Zzx+fihmLzIpO2crKyl7Y29uc3QgZj1kLWctMSZlLGE9YytnJmUsYj10aGlzLnZbZl07dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09Yn1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSpcXFwifSxyb3RhdGU6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT8xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWw7aWYoMD09PWF8fGM9PT1kKXJldHVybiB0aGlzO2lmKHRoaXMuaGVhZD1jLWEmdGhpcy5tYXNrLHRoaXMudGFpbD1kLWEmdGhpcy5tYXNrLDA8YSlmb3IobGV0IGU9MTtlPD1hO2UrKyl7Y29uc3QgZj1jLWUmdGhpcy5tYXNrLGE9ZC1lJnRoaXMubWFzazt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT12b2lkIDB9ZWxzZSBmb3IobGV0IGU9MDtlPmE7ZS0tKXtjb25zdCBmPWQtZSZ0aGlzLm1hc2ssYT1jLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUm90YXRlIHRoZSBkZXF1ZSBuIHN0ZXBzIHRvIHRoZSByaWdodCAoZGVmYXVsdCBuPTEpLiAgSWYgbiBpcyBuZWdhdGl2ZSwgcm90YXRlcyBsZWZ0LlxcXCJ9fSxnZXRzZXRzOnttYXhsZW46eyRnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5tYXhsZW4/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8odGhpcy5tYXhsZW4pfSwkZG9jOlxcXCJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZFxcXCJ9fSxwcm90bzp7JGNsZWFyKCl7dGhpcy5oZWFkPTAsdGhpcy50YWlsPTAsdGhpcy5tYXNrPTEsdGhpcy52PVssLF19LCRjb3B5KCl7cmV0dXJuIG5ldyBhLmRlcXVlKHRoaXMudi5zbGljZSgwKSx0aGlzLm1heGxlbix0aGlzLmhlYWQsdGhpcy50YWlsLHRoaXMubWFzayl9LCRleHRlbmQoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSl9LHNldCRpdGVtKGEsYil7Y29uc3QgYz0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzazt0aGlzLnZbY109Yn0sZGVsJGl0ZW0oYSl7Y29uc3QgYj0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztmb3IobGV0IGM9YjtjIT09dGhpcy50YWlsOyl7Y29uc3QgYT1jKzEmdGhpcy5tYXNrO3RoaXMudltjXT10aGlzLnZbYV0sYz1hfWNvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzayxjPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShjLHRoaXMudi5sZW5ndGg+Pj4xKX0sJHB1c2goYSl7dGhpcy52W3RoaXMudGFpbF09YSx0aGlzLnRhaWw9dGhpcy50YWlsKzEmdGhpcy5tYXNrLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcExlZnQoKSx0aGlzfSwkcHVzaExlZnQoYSl7dGhpcy5oZWFkPXRoaXMuaGVhZC0xJnRoaXMubWFzayx0aGlzLnZbdGhpcy5oZWFkXT1hLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcCgpLHRoaXN9LCRwb3AoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrO2NvbnN0IGE9dGhpcy52W3RoaXMudGFpbF07dGhpcy52W3RoaXMudGFpbF09dm9pZCAwO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRwb3BMZWZ0KCl7aWYodGhpcy5oZWFkPT09dGhpcy50YWlsKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcInBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlXFxcIik7Y29uc3QgYT10aGlzLnZbdGhpcy5oZWFkXTt0aGlzLnZbdGhpcy5oZWFkXT12b2lkIDAsdGhpcy5oZWFkPXRoaXMuaGVhZCsxJnRoaXMubWFzaztjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiBiPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShiLHRoaXMudi5sZW5ndGg+Pj4xKSxhfSwkcmVzaXplKGEsYil7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLm1hc2s7aWYodGhpcy5oZWFkPTAsdGhpcy50YWlsPWEsdGhpcy5tYXNrPWItMSwwPT09YylyZXR1cm4gdm9pZCh0aGlzLnYubGVuZ3RoPWIpO2NvbnN0IGU9QXJyYXkoYik7Zm9yKGxldCBmPTA7ZjxhO2YrKyllW2ZdPXRoaXMudltjK2YmZF07dGhpcy52PWV9LCRpbmRleChhLGIsYyl7Y29uc3QgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztiPXZvaWQgMD09PWI/MDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSxjPWM9PT12b2lkIDA/ZDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhjKTtjb25zdCBlPXRoaXMuaGVhZCxmPXRoaXMubWFzayxnPXRoaXMudixoPTA8PWI/YjpiPC1kPzA6ZCtiO2M9MDw9Yz9jOmM8LWQ/MDpkK2M7Zm9yKGxldCBkPWg7ZDxjO2QrKylpZihnW2UrZCZmXT09PWEpcmV0dXJuIGR9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBjPTA7YzxiOysrYyl7Y29uc3QgYj10aGlzLmhlYWQrYyZ0aGlzLm1hc2s7YS5wdXNoKHRoaXMudltiXSl9cmV0dXJuIGF9fX0pO2NvbnN0IGM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2RlcXVlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PTAsdGhpcy5kcT1hLnYsdGhpcy4kbGVuZ3RoPWEudGFpbC1hLmhlYWQmYS5tYXNrLHRoaXMuJGhlYWQ9YS5oZWFkLHRoaXMuJHRhaWw9YS50YWlsLHRoaXMuJG1hc2s9YS5tYXNrfSxpdGVybmV4dCgpe2lmKCEodGhpcy4kaW5kZXg+PXRoaXMuJGxlbmd0aCkpe2NvbnN0IGE9KDA8PXRoaXMuJGluZGV4P3RoaXMuJGhlYWQ6dGhpcy4kdGFpbCkrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgrKyx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbiBfX2xlbmd0aF9oaW50X18oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRsZW5ndGgtdGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19fX0pLGQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX3JldmVyc2VfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfcmV2ZXJzZV9pdGVyYXRvcihhKXt0aGlzLiRpbmRleD0oYS50YWlsLWEuaGVhZCZhLm1hc2spLTEsdGhpcy5kcT1hLnYsdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISgwPnRoaXMuJGluZGV4KSl7Y29uc3QgYT10aGlzLiRoZWFkK3RoaXMuJGluZGV4JnRoaXMuJG1hc2s7cmV0dXJuIHRoaXMuJGluZGV4LS0sdGhpcy5kcVthXX19LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn19KSxlPW5ldyBSZWdFeHAoL15bMC05XS4qLyksZj1uZXcgUmVnRXhwKC9eWzAtOV9dLiovKSxnPW5ldyBSZWdFeHAoL15cXFxcdyokLyksaD0vLC9nLGo9L1xcXFxzKy87cmV0dXJuIG5hbWVkdHVwbGUuY29fYXJnY291bnQ9MixuYW1lZHR1cGxlLmNvX2t3b25seWFyZ2NvdW50PTMsbmFtZWR0dXBsZS4ka3dkZWZzPVtTay5idWlsdGluLmJvb2wuZmFsc2UkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdLG5hbWVkdHVwbGUuY29fdmFybmFtZXM9W1xcXCJ0eXBlbmFtZVxcXCIsXFxcImZpZWxkX25hbWVzXFxcIixcXFwicmVuYW1lXFxcIixcXFwiZGVmYXVsdHNcXFwiLFxcXCJtb2R1bGVcXFwiXSxhLm5hbWVkdHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuYW1lZHR1cGxlKSxhfVwiLFwic3JjL2xpYi9jb2xvcnN5cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29sb3JzeXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21tYW5kcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tbWFuZHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlYWxsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21waWxlYWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tcGlsZXIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29uZmlnL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb25maWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb250ZXh0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb250ZXh0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29va2llbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb29raWVsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb3B5LnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5UaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGZyb20gQ1B5dGhvbi5cXG5Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsXFxuMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCB0eXBlc1xcbmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6XFxuICAgIHBhc3NcXG5lcnJvciA9IEVycm9yIFxcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBsb25nXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgbG9uZyA9IGludFxcblxcbmRlZiBjb3B5KHgpOlxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIGlmIGNhbGxhYmxlKHgpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgY29waWVyID0gZ2V0YXR0cihjbHMsIFxcXCJfX2NvcHlfX1xcXCIsIE5vbmUpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgaWYgY2xzIGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLCB0eXBlLCBmcm96ZW5zZXQsIGxvbmcpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgaWYgKGNscyA9PSBsaXN0KSBvciAoY2xzID09IGRpY3QpIG9yIChjbHMgPT0gc2V0KSBvciAoY2xzID09IHNsaWNlKTpcXG4gICAgICAgIHJldHVybiBjbHMoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgIHJ2ID0gcmVkdWN0b3IoNClcXG4gICAgZWxzZTpcXG4gICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgIGVsaWYgc3RyKGNscylbMTo2XSA9PSBcXFwiY2xhc3NcXFwiOlxcbiAgICAgICAgICAgIGNvcGllciA9IF9jb3B5X2luc3RcXG4gICAgICAgICAgICByZXR1cm4gY29waWVyKHgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEVycm9yKFxcXCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApXFxuXFxuZGVmIF9jb3B5X2luc3QoeCk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fY29weV9fJyk6XFxuICAgICAgICByZXR1cm4geC5fX2NvcHlfXygpXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOlxcbiAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKClcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0c3RhdGVfXycpOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IHguX19kaWN0X19cXG4gICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICByZXR1cm4geVxcblxcbmQgPSBfZGVlcGNvcHlfZGlzcGF0Y2ggPSB7fVxcblxcbmRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOlxcbiAgICBcXFwiXFxcIlxcXCJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy5cXG4gICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgbW9yZSBpbmZvLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgbWVtbyBpcyBOb25lOlxcbiAgICAgICAgbWVtbyA9IHt9XFxuICAgIGlkeCA9IGlkKHgpXFxuICAgIHkgPSBtZW1vLmdldChpZHgsIF9uaWwpXFxuICAgIGlmIHkgaXMgbm90IF9uaWw6XFxuICAgICAgICByZXR1cm4geVxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIHRyeTpcXG4gICAgICAgIGdldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19nZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19zZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGluaXRhcmdzID0gZ2V0YXR0cih4LCBcXFwiX19nZXRpbml0YXJnc19fXFxcIiwgTm9uZSlcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmVkdWN0b3IgPSBGYWxzZVxcbiAgICBpZiBnZXRzdGF0ZSBvciBzZXRzdGF0ZSBvciBpbml0YXJnczpcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBjb3B5aW5nIHdpdGggdXNlci1kZWZpbmVkIF9fZ2V0c3RhdGVfXywgX19zZXRzdGF0ZV9fIG9yIF9fZ2V0aW5pdGFyZ3NfXygpXFxcIilcXG4gICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoLmdldChjbHMpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2hbXFxcIkluc3RhbmNlVHlwZVxcXCJdXFxuICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pXFxuICAgIGVsc2U6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaXNzYyA9IGlzc3ViY2xhc3MoY2xzLCB0eXBlKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBjbHMgaXMgbm90IGEgY2xhc3MgKG9sZCBCb29zdDsgc2VlIFNGICM1MDIwODUpXFxuICAgICAgICAgICAgaXNzYyA9IDBcXG4gICAgICAgIGlmIGlzc2M6XFxuICAgICAgICAgICAgeSA9IF9kZWVwY29weV9hdG9taWMoeCwgbWVtbylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY29waWVyID0gZ2V0YXR0cih4LCBcXFwiX19kZWVwY29weV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICBpZiBjb3BpZXI6XFxuICAgICAgICAgICAgICAgIHkgPSBjb3BpZXIobWVtbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoMilcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1bihkZWVwKWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbylcXG4gICAgbWVtb1tpZHhdID0geVxcbiAgICBfa2VlcF9hbGl2ZSh4LCBtZW1vKSAjIE1ha2Ugc3VyZSB4IGxpdmVzIGF0IGxlYXN0IGFzIGxvbmcgYXMgZFxcbiAgICByZXR1cm4geVxcblxcbmRlZiBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pOlxcbiAgICByZXR1cm4geFxcbmRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtib29sXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgdHJ5OlxcbiMgZFt0eXBlcy5Db2RlVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuIyAgIHBhc3NcXG5kW3R5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6XFxuICAgIHkgPSBbXVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGEgaW4geDpcXG4gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKVxcbiAgICByZXR1cm4geVxcbmRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdFxcblxcbmRlZiBfZGVlcGNvcHlfc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBzZXQoW10pICAjIG1ha2UgZW1wdHkgc2V0XFxuICAgIG1lbW9baWQoeCldID0gcmVzdWx0ICAjIHJlZ2lzdGVyIHRoaXMgc2V0IGluIHRoZSBtZW1vIGZvciBsb29wIGNoZWNraW5nXFxuICAgIGZvciBhIGluIHg6ICAgIyBnbyB0aHJvdWdoIGVsZW1lbnRzIG9mIHNldFxcbiAgICAgICAgcmVzdWx0LmFkZChkZWVwY29weShhLCBtZW1vKSkgICMgYWRkIHRoZSBjb3BpZWQgZWxlbWVudHMgaW50byB0aGUgbmV3IHNldFxcbiAgICByZXR1cm4gcmVzdWx0ICMgcmV0dXJuIHRoZSBuZXcgc2V0XFxuZFtzZXRdID0gX2RlZXBjb3B5X3NldFxcblxcbmRlZiBfZGVlcGNvcHlfZnJvemVuc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBmcm96ZW5zZXQoX2RlZXBjb3B5X3NldCh4LG1lbW8pKSBcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgXFxuICAgIHJldHVybiByZXN1bHRcXG5kW2Zyb3plbnNldF0gPSBfZGVlcGNvcHlfZnJvemVuc2V0XFxuXFxuZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKTpcXG4gICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XVxcbiAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2VcXG4gICAgIyBjaGVjayBmb3IgaXQsIGluIGNhc2UgdGhlIHR1cGxlIGNvbnRhaW5zIHJlY3Vyc2l2ZSBtdXRhYmxlIHN0cnVjdHVyZXMuXFxuICAgIHRyeTpcXG4gICAgICAgIHJldHVybiBtZW1vW2lkKHgpXVxcbiAgICBleGNlcHQgS2V5RXJyb3I6XFxuICAgICAgICBwYXNzXFxuICAgIGZvciBrLCBqIGluIHppcCh4LCB5KTpcXG4gICAgICAgIGlmIGsgaXMgbm90IGo6XFxuICAgICAgICAgICAgeSA9IHR1cGxlKHkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSB4XFxuICAgIHJldHVybiB5XFxuZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGVcXG5cXG5kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6XFxuICAgIHkgPSB7fVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOlxcbiAgICAgICAgeVtkZWVwY29weShrZXksIG1lbW8pXSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKVxcbiAgICByZXR1cm4geVxcbmRbZGljdF0gPSBfZGVlcGNvcHlfZGljdFxcblxcbiMgZGVmIF9kZWVwY29weV9tZXRob2QoeCwgbWVtbyk6ICMgQ29weSBpbnN0YW5jZSBtZXRob2RzXFxuIyAgICAgeSA9IHR5cGUoeCkoeC5pbV9mdW5jLCBkZWVwY29weSh4LmltX3NlbGYsIG1lbW8pLCB4LmltX2NsYXNzKTtcXG4jICAgICByZXR1cm4geVxcbmRbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuXFxuZGVmIF9kZWVwY29weV9pbnN0KHgsIG1lbW8pOlxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2RlZXBjb3B5X18nKTpcXG4gICAgICAgICByZXR1cm4geC5fX2RlZXBjb3B5X18obWVtbylcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgICAgICB5ID0geC5fX2NsYXNzX18oKmFyZ3MpXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKVxcbiAgICAgICAgeS5fX2NsYXNzX18gPSB4Ll9fY2xhc3NfX1xcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICByZXR1cm4geVxcbmRbXFxcIkluc3RhbmNlVHlwZVxcXCJdID0gX2RlZXBjb3B5X2luc3RcXG5cXG5kZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6XFxuICAgIFxcXCJcXFwiXFxcIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby5cXG4gICAgQmVjYXVzZSB3ZSByZW1lbWJlciBvYmplY3RzIGJ5IHRoZWlyIGlkLCB3ZSBoYXZlXFxuICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0XFxuICAgIGFsaXZlIGJ5IHJlZmVyZW5jaW5nIHRoZW0uXFxuICAgIFdlIHN0b3JlIGEgcmVmZXJlbmNlIGF0IHRoZSBpZCBvZiB0aGUgbWVtbywgd2hpY2ggc2hvdWxkXFxuICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5XFxuICAgIHRoZSBtZW1vIGl0c2VsZi4uLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdHJ5OlxcbiAgICAgICAgbWVtb1tpZChtZW1vKV0uYXBwZW5kKHgpXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pXFxuICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF1cXG5cXG5kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKVxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgbiA9IGxlbihpbmZvKVxcbiAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSlcXG4gICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXVxcbiAgICBpZiBuID4gMjpcXG4gICAgICAgIHN0YXRlID0gaW5mb1syXVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSBOb25lXFxuICAgIGlmIG4gPiAzOlxcbiAgICAgICAgbGlzdGl0ZXIgPSBpbmZvWzNdXFxuICAgIGVsc2U6XFxuICAgICAgICBsaXN0aXRlciA9IE5vbmVcXG4gICAgaWYgbiA+IDQ6XFxuICAgICAgICBkaWN0aXRlciA9IGluZm9bNF1cXG4gICAgZWxzZTpcXG4gICAgICAgIGRpY3RpdGVyID0gTm9uZVxcbiAgICBpZiBkZWVwOlxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgIHkgPSBjYWxsYWJsZSgqYXJncylcXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuXFxuICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICAgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIHR1cGxlKSBhbmQgbGVuKHN0YXRlKSA9PSAyOlxcbiAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzbG90c3RhdGUgPSBOb25lXFxuICAgICAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICAgICAgICAgIGlmIHNsb3RzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2xvdHN0YXRlLml0ZW1zKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpXFxuXFxuICAgIGlmIGxpc3RpdGVyIGlzIG5vdCBOb25lOlxcbiAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6XFxuICAgICAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pXFxuICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSlcXG4gICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgICAgICAgICAgeVtrZXldID0gdmFsdWVcXG4gICAgcmV0dXJuIHlcXG5cXG5kZWwgZFxcblxcbmRlbCB0eXBlc1xcblxcbiMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X19cXG5jbGFzcyBfRW1wdHlDbGFzczpcXG4gICAgcGFzc1wiLFwic3JjL2xpYi9jb3B5X3JlZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29weV9yZWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jc3YucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNzdiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N0eXBlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3R5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNob2xpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N1cnNlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3Vyc2VzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGF0ZXRpbWUucHlcIjpcIlxcXCJcXFwiXFxcIkNvbmNyZXRlIGRhdGUvdGltZSBhbmQgcmVsYXRlZCB0eXBlcyAtLSBwcm90b3R5cGUgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLlxcblxcblNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9Gcm9udFBhZ2VcXG5cXG5TZWUgYWxzbyBodHRwOi8vZGlyLnlhaG9vLmNvbS9SZWZlcmVuY2UvY2FsZW5kYXJzL1xcblxcbkZvciBhIHByaW1lciBvbiBEU1QsIGluY2x1ZGluZyBtYW55IGN1cnJlbnQgRFNUIHJ1bGVzLCBzZWVcXG5odHRwOi8vd2ViZXhoaWJpdHMub3JnL2RheWxpZ2h0c2F2aW5nL1xcblxcbkZvciBtb3JlIGFib3V0IERTVCB0aGFuIHlvdSBldmVyIHdhbnRlZCB0byBrbm93LCBzZWVcXG5mdHA6Ly9lbHNpZS5uY2kubmloLmdvdi9wdWIvXFxuXFxuU291cmNlcyBmb3IgdGltZSB6b25lIGFuZCBEU1QgZGF0YTogaHR0cDovL3d3dy50d2luc3VuLmNvbS90ei90ei1saW5rLmh0bVxcblxcblRoaXMgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhlIHNhbmRib3ggb2YgdGhlIENQeXRob24gQ1ZTIHJlcG9zaXRvcnkuXFxuVGhhbmtzIHRvIFRpbSBQZXRlcnMgZm9yIHN1Z2dlc3RpbmcgdXNpbmcgaXQuXFxuXFxuVGhpcyB3YXMgdGhlbiBjb3BpZWQgZnJvbSBQeVB5IHY1LjEuMCBpbnRvIFNrdWxwdCBieSBNZXJlZHlkZCBMdWZmLCByZW1vdmluZ1xcbidmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyAoYW5kIHJlcGxhY2luZyBkaXZpc2lvbiBvcGVyYXRvcnMgYWNjb3JkaW5nbHkpXFxuYW5kIHBpY2tsZSBzdXBwb3J0ICh3aGljaCByZXF1aXJlcyAnc3RydWN0Jywgd2hpY2ggU2t1bHB0IGRvZXMgbm90IGN1cnJlbnRseVxcblthcyBvZiAzMS84LzIwMTZdIGhhdmUpXFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IHRpbWUgYXMgX3RpbWVcXG5pbXBvcnQgbWF0aCBhcyBfbWF0aFxcblxcbiMgUHl0aG9uIDItdnMtMyBjb21wYXQgaGFja1xcbmltcG9ydCBzeXNcXG51bmljb2RlID0gdW5pY29kZSBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBlbHNlIHN0clxcblxcbl9TRU5USU5FTCA9IG9iamVjdCgpXFxuXFxuZGVmIF9jbXAoeCwgeSk6XFxuICAgIHJldHVybiAwIGlmIHggPT0geSBlbHNlIDEgaWYgeCA+IHkgZWxzZSAtMVxcblxcbmRlZiBfcm91bmQoeCk6XFxuICAgIHJldHVybiBpbnQoX21hdGguZmxvb3IoeCArIDAuNSkgaWYgeCA+PSAwLjAgZWxzZSBfbWF0aC5jZWlsKHggLSAwLjUpKVxcblxcbk1JTllFQVIgPSAxXFxuTUFYWUVBUiA9IDk5OTlcXG5fTUlOWUVBUkZNVCA9IDE5MDBcXG5cXG5fTUFYX0RFTFRBX0RBWVMgPSA5OTk5OTk5OTlcXG5cXG4jIFV0aWxpdHkgZnVuY3Rpb25zLCBhZGFwdGVkIGZyb20gUHl0aG9uJ3MgRGVtby9jbGFzc2VzL0RhdGVzLnB5LCB3aGljaFxcbiMgYWxzbyBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW5cXG4jIGJvdGggZGlyZWN0aW9ucy4gIERpZmZlcmVuY2U6ICBEYXRlcy5weSBjYWxscyBKYW51YXJ5IDEgb2YgeWVhciAwIGRheVxcbiMgbnVtYmVyIDEuICBUaGUgY29kZSBoZXJlIGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDEgZGF5IG51bWJlciAxLiAgVGhpcyBpc1xcbiMgdG8gbWF0Y2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIFxcXCJwcm9sZXB0aWMgR3JlZ29yaWFuXFxcIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6XFxuIyBhbmQgUmVpbmdvbGQncyBcXFwiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zXFxcIiwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhclxcbiMgZm9yIGFsbCBjb21wdXRhdGlvbnMuICBTZWUgdGhlIGJvb2sgZm9yIGFsZ29yaXRobXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlblxcbiMgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFscyBhbmQgbWFueSBvdGhlciBjYWxlbmRhciBzeXN0ZW1zLlxcblxcbl9EQVlTX0lOX01PTlRIID0gWy0xLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVxcblxcbl9EQVlTX0JFRk9SRV9NT05USCA9IFstMV1cXG5kYm0gPSAwXFxuZm9yIGRpbSBpbiBfREFZU19JTl9NT05USFsxOl06XFxuICAgIF9EQVlTX0JFRk9SRV9NT05USC5hcHBlbmQoZGJtKVxcbiAgICBkYm0gKz0gZGltXFxuZGVsIGRibSwgZGltXFxuXFxuZGVmIF9pc19sZWFwKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiAxIGlmIGxlYXAgeWVhciwgZWxzZSAwLlxcXCJcXG4gICAgcmV0dXJuIHllYXIgJSA0ID09IDAgYW5kICh5ZWFyICUgMTAwICE9IDAgb3IgeWVhciAlIDQwMCA9PSAwKVxcblxcbmRlZiBfZGF5c19iZWZvcmVfeWVhcih5ZWFyKTpcXG4gICAgXFxcInllYXIgLT4gbnVtYmVyIG9mIGRheXMgYmVmb3JlIEphbnVhcnkgMXN0IG9mIHllYXIuXFxcIlxcbiAgICB5ID0geWVhciAtIDFcXG4gICAgcmV0dXJuIHkqMzY1ICsgeS8vNCAtIHkvLzEwMCArIHkvLzQwMFxcblxcbmRlZiBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB0aGF0IG1vbnRoIGluIHRoYXQgeWVhci5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCBtb250aFxcbiAgICBpZiBtb250aCA9PSAyIGFuZCBfaXNfbGVhcCh5ZWFyKTpcXG4gICAgICAgIHJldHVybiAyOVxcbiAgICByZXR1cm4gX0RBWVNfSU5fTU9OVEhbbW9udGhdXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB5ZWFyIHByZWNlZGluZyBmaXJzdCBkYXkgb2YgbW9udGguXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInXFxuICAgIHJldHVybiBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgX2lzX2xlYXAoeWVhcikpXFxuXFxuZGVmIF95bWQyb3JkKHllYXIsIG1vbnRoLCBkYXkpOlxcbiAgICBcXFwieWVhciwgbW9udGgsIGRheSAtPiBvcmRpbmFsLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGFzc2VydCAxIDw9IGRheSA8PSBkaW0sICgnZGF5IG11c3QgYmUgaW4gMS4uJWQnICUgZGltKVxcbiAgICByZXR1cm4gKF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpICtcXG4gICAgICAgICAgICBfZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICtcXG4gICAgICAgICAgICBkYXkpXFxuXFxuX0RJNDAwWSA9IF9kYXlzX2JlZm9yZV95ZWFyKDQwMSkgICAgIyBudW1iZXIgb2YgZGF5cyBpbiA0MDAgeWVhcnNcXG5fREkxMDBZID0gX2RheXNfYmVmb3JlX3llYXIoMTAxKSAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiIDEwMCAgIFxcXCJcXG5fREk0WSAgID0gX2RheXNfYmVmb3JlX3llYXIoNSkgICAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiICAgNCAgIFxcXCJcXG5cXG4jIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbSBwYXN0aW5nXFxuIyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy5cXG5hc3NlcnQgX0RJNFkgPT0gNCAqIDM2NSArIDFcXG5cXG4jIFNpbWlsYXJseSwgYSA0MDAteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTQwMFkgPT0gNCAqIF9ESTEwMFkgKyAxXFxuXFxuIyBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tXFxuIyBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTEwMFkgPT0gMjUgKiBfREk0WSAtIDFcXG5cXG5fVVNfUEVSX1VTID0gMVxcbl9VU19QRVJfTVMgPSAxMDAwXFxuX1VTX1BFUl9TRUNPTkQgPSAxMDAwMDAwXFxuX1VTX1BFUl9NSU5VVEUgPSA2MDAwMDAwMFxcbl9TRUNPTkRTX1BFUl9EQVkgPSAyNCAqIDM2MDBcXG5fVVNfUEVSX0hPVVIgPSAzNjAwMDAwMDAwXFxuX1VTX1BFUl9EQVkgPSA4NjQwMDAwMDAwMFxcbl9VU19QRVJfV0VFSyA9IDYwNDgwMDAwMDAwMFxcblxcbmRlZiBfb3JkMnltZChuKTpcXG4gICAgXFxcIm9yZGluYWwgLT4gKHllYXIsIG1vbnRoLCBkYXkpLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuXFxuICAgICMgbiBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZiBsZWFwIHllYXJzXFxuICAgICMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byBmaW5kIHRoZVxcbiAgICAjIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG4sIHRoZW4gd29yayB3aXRoIHRoZSBvZmZzZXRcXG4gICAgIyBmcm9tIHRoYXQgYm91bmRhcnkgdG8gbi4gIExpZmUgaXMgbXVjaCBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbVxcbiAgICAjIG4gZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzIG9mIG4gYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseVxcbiAgICAjIHRob3NlIGRpdmlzaWJsZSBieSBfREk0MDBZOlxcbiAgICAjXFxuICAgICMgICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xXFxuICAgICMgICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tXFxuICAgICMgICAgIDMxIERlYyAtNDAwICAgICAgICAtX0RJNDAwWSAgICAgICAtX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1fREk0MDBZICsxICAgLV9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAuLi5cXG4gICAgIyAgICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yXFxuICAgICMgICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMVxcbiAgICAjICAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDFcXG4gICAgIyAgICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyXFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMSBEZWMgIDQwMCAgICAgICAgIF9ESTQwMFkgICAgICAgIF9ESTQwMFkgLTFcXG4gICAgIyAgICAgIDEgSmFuICA0MDEgICAgICAgICBfREk0MDBZICsxICAgICBfREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgbiAtPSAxXFxuICAgIG40MDAsIG4gPSBkaXZtb2QobiwgX0RJNDAwWSlcXG4gICAgeWVhciA9IG40MDAgKiA0MDAgKyAxICAgIyAuLi4sIC0zOTksIDEsIDQwMSwgLi4uXFxuXFxuICAgICMgTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YgeWVhciwgdG9cXG4gICAgIyB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgbi5cXG4gICAgIyBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbFxcbiAgICAjIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUgZGVzaXJlZFxcbiAgICAjIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuXFxuICAgIG4xMDAsIG4gPSBkaXZtb2QobiwgX0RJMTAwWSlcXG5cXG4gICAgIyBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuXFxuICAgIG40LCBuID0gZGl2bW9kKG4sIF9ESTRZKVxcblxcbiAgICAjIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbiBtZWFuaW5nXFxuICAgICMgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUgNC15ZWFyIGN5Y2xlLlxcbiAgICBuMSwgbiA9IGRpdm1vZChuLCAzNjUpXFxuXFxuICAgIHllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xXFxuICAgIGlmIG4xID09IDQgb3IgbjEwMCA9PSA0OlxcbiAgICAgICAgYXNzZXJ0IG4gPT0gMFxcbiAgICAgICAgcmV0dXJuIHllYXItMSwgMTIsIDMxXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZSBmaW5kXFxuICAgICMgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28gbGFyZ2UuXFxuICAgIGxlYXB5ZWFyID0gbjEgPT0gMyBhbmQgKG40ICE9IDI0IG9yIG4xMDAgPT0gMylcXG4gICAgYXNzZXJ0IGxlYXB5ZWFyID09IF9pc19sZWFwKHllYXIpXFxuICAgIG1vbnRoID0gKG4gKyA1MCkgPj4gNVxcbiAgICBwcmVjZWRpbmcgPSBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgbGVhcHllYXIpXFxuICAgIGlmIHByZWNlZGluZyA+IG46ICAjIGVzdGltYXRlIGlzIHRvbyBsYXJnZVxcbiAgICAgICAgbW9udGggLT0gMVxcbiAgICAgICAgcHJlY2VkaW5nIC09IF9EQVlTX0lOX01PTlRIW21vbnRoXSArIChtb250aCA9PSAyIGFuZCBsZWFweWVhcilcXG4gICAgbiAtPSBwcmVjZWRpbmdcXG4gICAgYXNzZXJ0IDAgPD0gbiA8IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcblxcbiAgICAjIE5vdyB0aGUgeWVhciBhbmQgbW9udGggYXJlIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGVcXG4gICAgIyBzdGFydCBvZiB0aGF0IG1vbnRoOiAgd2UncmUgZG9uZSFcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBuKzFcXG5cXG4jIE1vbnRoIGFuZCBkYXkgbmFtZXMuICBGb3IgbG9jYWxpemVkIHZlcnNpb25zLCBzZWUgdGhlIGNhbGVuZGFyIG1vZHVsZS5cXG5fTU9OVEhOQU1FUyA9IFtOb25lLCBcXFwiSmFuXFxcIiwgXFxcIkZlYlxcXCIsIFxcXCJNYXJcXFwiLCBcXFwiQXByXFxcIiwgXFxcIk1heVxcXCIsIFxcXCJKdW5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgIFxcXCJKdWxcXFwiLCBcXFwiQXVnXFxcIiwgXFxcIlNlcFxcXCIsIFxcXCJPY3RcXFwiLCBcXFwiTm92XFxcIiwgXFxcIkRlY1xcXCJdXFxuX0RBWU5BTUVTID0gW05vbmUsIFxcXCJNb25cXFwiLCBcXFwiVHVlXFxcIiwgXFxcIldlZFxcXCIsIFxcXCJUaHVcXFwiLCBcXFwiRnJpXFxcIiwgXFxcIlNhdFxcXCIsIFxcXCJTdW5cXFwiXVxcblxcblxcbmRlZiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgZHN0ZmxhZyk6XFxuICAgIHdkYXkgPSAoX3ltZDJvcmQoeSwgbSwgZCkgKyA2KSAlIDdcXG4gICAgZG51bSA9IF9kYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGRcXG4gICAgcmV0dXJuIF90aW1lLnN0cnVjdF90aW1lKCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZGF5LCBkbnVtLCBkc3RmbGFnKSlcXG5cXG5kZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzKTpcXG4gICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLlxcbiAgICByZXN1bHQgPSBcXFwiJTAyZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgIGlmIHVzOlxcbiAgICAgICAgcmVzdWx0ICs9IFxcXCIuJTA2ZFxcXCIgJSB1c1xcbiAgICByZXR1cm4gcmVzdWx0XFxuXFxuIyBDb3JyZWN0bHkgc3Vic3RpdHV0ZSBmb3IgJXogYW5kICVaIGVzY2FwZXMgaW4gc3RyZnRpbWUgZm9ybWF0cy5cXG5kZWYgX3dyYXBfc3RyZnRpbWUob2JqZWN0LCBmb3JtYXQsIHRpbWV0dXBsZSk6XFxuICAgIHllYXIgPSB0aW1ldHVwbGVbMF1cXG4gICAgaWYgeWVhciA8IF9NSU5ZRUFSRk1UOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwieWVhcj0lZCBpcyBiZWZvcmUgJWQ7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49ICVkXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICh5ZWFyLCBfTUlOWUVBUkZNVCwgX01JTllFQVJGTVQpKVxcbiAgICAjIERvbid0IGNhbGwgdXRjb2Zmc2V0KCkgb3IgdHpuYW1lKCkgdW5sZXNzIGFjdHVhbGx5IG5lZWRlZC5cXG4gICAgZnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlZlxcbiAgICB6cmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICV6XFxuICAgIFpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJVpcXG5cXG4gICAgIyBTY2FuIGZvcm1hdCBmb3IgJXogYW5kICVaIGVzY2FwZXMsIHJlcGxhY2luZyBhcyBuZWVkZWQuXFxuICAgIG5ld2Zvcm1hdCA9IFtdXFxuICAgIHB1c2ggPSBuZXdmb3JtYXQuYXBwZW5kXFxuICAgIGksIG4gPSAwLCBsZW4oZm9ybWF0KVxcbiAgICB3aGlsZSBpIDwgbjpcXG4gICAgICAgIGNoID0gZm9ybWF0W2ldXFxuICAgICAgICBpICs9IDFcXG4gICAgICAgIGlmIGNoID09ICclJzpcXG4gICAgICAgICAgICBpZiBpIDwgbjpcXG4gICAgICAgICAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgICAgICAgICAgaSArPSAxXFxuICAgICAgICAgICAgICAgIGlmIGNoID09ICdmJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIGZyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlcGxhY2UgPSAnJTA2ZCcgJSBnZXRhdHRyKG9iamVjdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc2Vjb25kJywgMClcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoZnJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ3onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgenJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJfdXRjb2Zmc2V0XFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9iamVjdC5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcrJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICctJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChvZmZzZXQsIDYwKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenJlcGxhY2UgPSAnJWMlMDJkJTAyZCcgJSAoc2lnbiwgaCwgbSlcXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAnJScgbm90IGluIHpyZXBsYWNlXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKHpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbGlmIGNoID09ICdaJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIFpyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCBcXFwidHpuYW1lXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBvYmplY3QudHpuYW1lKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyZnRpbWUgaXMgZ29pbmcgdG8gaGF2ZSBhdCB0aGlzOiBlc2NhcGUgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBzLnJlcGxhY2UoJyUnLCAnJSUnKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChacmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgICAgICAgICAgICAgcHVzaChjaClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBwdXNoKCclJylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHVzaChjaClcXG4gICAgbmV3Zm9ybWF0ID0gXFxcIlxcXCIuam9pbihuZXdmb3JtYXQpXFxuICAgIHJldHVybiBfdGltZS5zdHJmdGltZShuZXdmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4jIEp1c3QgcmFpc2UgVHlwZUVycm9yIGlmIHRoZSBhcmcgaXNuJ3QgTm9uZSBvciBhIHN0cmluZy5cXG5kZWYgX2NoZWNrX3R6bmFtZShuYW1lKTpcXG4gICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvLnR6bmFtZSgpIG11c3QgcmV0dXJuIE5vbmUgb3Igc3RyaW5nLCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5vdCAnJXMnXFxcIiAlIHR5cGUobmFtZSkpXFxuXFxuIyBuYW1lIGlzIHRoZSBvZmZzZXQtcHJvZHVjaW5nIG1ldGhvZCwgXFxcInV0Y29mZnNldFxcXCIgb3IgXFxcImRzdFxcXCIuXFxuIyBvZmZzZXQgaXMgd2hhdCBpdCByZXR1cm5lZC5cXG4jIElmIG9mZnNldCBpc24ndCBOb25lIG9yIHRpbWVkZWx0YSwgcmFpc2VzIFR5cGVFcnJvci5cXG4jIElmIG9mZnNldCBpcyBOb25lLCByZXR1cm5zIE5vbmUuXFxuIyBFbHNlIG9mZnNldCBpcyBjaGVja2VkIGZvciBiZWluZyBpbiByYW5nZSwgYW5kIGEgd2hvbGUgIyBvZiBtaW51dGVzLlxcbiMgSWYgaXQgaXMsIGl0cyBpbnRlZ2VyIHZhbHVlIGlzIHJldHVybmVkLiAgRWxzZSBWYWx1ZUVycm9yIGlzIHJhaXNlZC5cXG5kZWYgX2NoZWNrX3V0Y19vZmZzZXQobmFtZSwgb2Zmc2V0KTpcXG4gICAgYXNzZXJ0IG5hbWUgaW4gKFxcXCJ1dGNvZmZzZXRcXFwiLCBcXFwiZHN0XFxcIilcXG4gICAgaWYgb2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICByZXR1cm5cXG4gICAgaWYgbm90IGlzaW5zdGFuY2Uob2Zmc2V0LCB0aW1lZGVsdGEpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwib3IgdGltZWRlbHRhLCBub3QgJyVzJ1xcXCIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSlcXG4gICAgZGF5cyA9IG9mZnNldC5kYXlzXFxuICAgIGlmIGRheXMgPCAtMSBvciBkYXlzID4gMDpcXG4gICAgICAgIG9mZnNldCA9IDE0NDAgICMgdHJpZ2dlciBvdXQtb2YtcmFuZ2VcXG4gICAgZWxzZTpcXG4gICAgICAgIHNlY29uZHMgPSBkYXlzICogODY0MDAgKyBvZmZzZXQuc2Vjb25kc1xcbiAgICAgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MClcXG4gICAgICAgIGlmIHNlY29uZHMgb3Igb2Zmc2V0Lm1pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhIHdob2xlIG51bWJlciBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwib2YgbWludXRlc1xcXCIgJSBuYW1lKVxcbiAgICAgICAgb2Zmc2V0ID0gbWludXRlc1xcbiAgICBpZiBub3QgLTE0NDAgPCBvZmZzZXQgPCAxNDQwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiJXMoKT0lZCwgbXVzdCBiZSBpbiAtMTQzOS4uMTQzOVxcXCIgJSAobmFtZSwgb2Zmc2V0KSlcXG4gICAgcmV0dXJuIG9mZnNldFxcblxcbmRlZiBfY2hlY2tfaW50X2ZpZWxkKHZhbHVlKTpcXG4gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5fX2ludF9fKClcXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBwYXNzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXInKVxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJylcXG4gICAgcmFpc2UgVHlwZUVycm9yKCdpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQnKVxcblxcbmRlZiBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIHllYXIgPSBfY2hlY2tfaW50X2ZpZWxkKHllYXIpXFxuICAgIG1vbnRoID0gX2NoZWNrX2ludF9maWVsZChtb250aClcXG4gICAgZGF5ID0gX2NoZWNrX2ludF9maWVsZChkYXkpXFxuICAgIGlmIG5vdCBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3llYXIgbXVzdCBiZSBpbiAlZC4uJWQnICUgKE1JTllFQVIsIE1BWFlFQVIpLCB5ZWFyKVxcbiAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInLCBtb250aClcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0sIGRheSlcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlcXG5cXG5kZWYgX2NoZWNrX3RpbWVfZmllbGRzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCk6XFxuICAgIGhvdXIgPSBfY2hlY2tfaW50X2ZpZWxkKGhvdXIpXFxuICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKVxcbiAgICBzZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKHNlY29uZClcXG4gICAgbWljcm9zZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKG1pY3Jvc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBob3VyIDw9IDIzOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaG91ciBtdXN0IGJlIGluIDAuLjIzJywgaG91cilcXG4gICAgaWYgbm90IDAgPD0gbWludXRlIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWludXRlIG11c3QgYmUgaW4gMC4uNTknLCBtaW51dGUpXFxuICAgIGlmIG5vdCAwIDw9IHNlY29uZCA8PSA1OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBtaWNyb3NlY29uZCA8PSA5OTk5OTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OScsIG1pY3Jvc2Vjb25kKVxcbiAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kXFxuXFxuZGVmIF9jaGVja190emluZm9fYXJnKHR6KTpcXG4gICAgaWYgdHogaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzXFxcIilcXG5cXG5cXG4jIE5vdGVzIG9uIGNvbXBhcmlzb246ICBJbiBnZW5lcmFsLCBkYXRldGltZSBtb2R1bGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgcmFpc2VcXG4jIFR5cGVFcnJvciB3aGVuIHRoZXkgZG9uJ3Qga25vdyBob3cgdG8gZG8gYSBjb21wYXJpc29uIHRoZW1zZWxmLiAgSWYgdGhleVxcbiMgcmV0dXJuZWQgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCwgY29tcGFyaXNvbiBjb3VsZCAoc2lsZW50bHkpIGZhbGwgYmFjayB0b1xcbiMgdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3RzLWJ5LWNvbXBhcmluZy10aGVpci1tZW1vcnktYWRkcmVzc2VzIHN0cmF0ZWd5LFxcbiMgYW5kIHRoYXQncyBub3QgaGVscGZ1bC4gIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9uczpcXG4jXFxuIyAxLiBGb3IgZGF0ZSBhbmQgZGF0ZXRpbWUsIGlmIHRoZSBvdGhlciBvYmplY3QgaGFzIGEgXFxcInRpbWV0dXBsZVxcXCIgYXR0cixcXG4jICAgIE5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLiAgVGhpcyBpcyBhIGhvb2sgdG8gYWxsb3cgb3RoZXIga2luZHMgb2ZcXG4jICAgIGRhdGV0aW1lLWxpa2Ugb2JqZWN0cyBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIGNvbXBhcmlzb24uXFxuI1xcbiMgMi4gRWxzZSBfX2VxX18gYW5kIF9fbmVfXyByZXR1cm4gRmFsc2UgYW5kIFRydWUsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXNcXG4jICAgIHNvIG9wZXJ0YWlvbnMgbGlrZVxcbiNcXG4jICAgICAgICB4ID09IHlcXG4jICAgICAgICB4ICE9IHlcXG4jICAgICAgICB4IGluIHNlcXVlbmNlXFxuIyAgICAgICAgeCBub3QgaW4gc2VxdWVuY2VcXG4jICAgICAgICBkaWN0W3hdID0geVxcbiNcXG4jICAgIGRvbid0IHJhaXNlIGFubm95aW5nIFR5cGVFcnJvcnMganVzdCBiZWNhdXNlIGEgZGF0ZXRpbWUgb2JqZWN0XFxuIyAgICBpcyBwYXJ0IG9mIGEgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9uLiAgSWYgdGhlcmUncyBubyBrbm93biB3YXkgdG9cXG4jICAgIGNvbXBhcmUgWCB0byBhIGRhdGV0aW1lLCBzYXlpbmcgdGhleSdyZSBub3QgZXF1YWwgaXMgcmVhc29uYWJsZS5cXG5cXG5kZWYgX2NtcGVycm9yKHgsIHkpOlxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgJyVzJyB0byAnJXMnXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgICAgIHR5cGUoeCkuX19uYW1lX18sIHR5cGUoeSkuX19uYW1lX18pKVxcblxcbmRlZiBfbm9ybWFsaXplX3BhaXIoaGksIGxvLCBmYWN0b3IpOlxcbiAgICBpZiBub3QgMCA8PSBsbyA8PSBmYWN0b3ItMTpcXG4gICAgICAgIGluYywgbG8gPSBkaXZtb2QobG8sIGZhY3RvcilcXG4gICAgICAgIGhpICs9IGluY1xcbiAgICByZXR1cm4gaGksIGxvXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGlnbm9yZV9vdmVyZmxvdz1GYWxzZSk6XFxuICAgICMgTm9ybWFsaXplIGFsbCB0aGUgaW5wdXRzLCBhbmQgc3RvcmUgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzLlxcbiAgICBzcywgdXMgPSBfbm9ybWFsaXplX3BhaXIoc3MsIHVzLCAxMDAwMDAwKVxcbiAgICBtbSwgc3MgPSBfbm9ybWFsaXplX3BhaXIobW0sIHNzLCA2MClcXG4gICAgaGgsIG1tID0gX25vcm1hbGl6ZV9wYWlyKGhoLCBtbSwgNjApXFxuICAgIGQsIGhoID0gX25vcm1hbGl6ZV9wYWlyKGQsIGhoLCAyNClcXG4gICAgeSwgbSwgZCA9IF9ub3JtYWxpemVfZGF0ZSh5LCBtLCBkLCBpZ25vcmVfb3ZlcmZsb3cpXFxuICAgIHJldHVybiB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1c1xcblxcbmRlZiBfbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSwgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBUaGF0IHdhcyBlYXN5LiAgTm93IGl0IGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXlcXG4gICAgIyBjYW4ndCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhcixcXG4gICAgIyBidXQgaWYgZGF5IGlzLCBlLmcuLCBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGhcXG4gICAgIyBhbmQgeWVhciB2YWx1ZXMgbWFrZSBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyB0aGVtc2VsdmVzKS5cXG4gICAgIyBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgeWVhciwgbW9udGggPSBfbm9ybWFsaXplX3BhaXIoeWVhciwgbW9udGgtMSwgMTIpXFxuICAgICAgICBtb250aCArPSAxXFxuICAgICAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMlxcblxcbiAgICAjIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzXFxuICAgICMgZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLlxcbiAgICAjIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlXFxuICAgICMgbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBpZiBub3QgMSA8PSBkYXkgPD0gZGltOlxcbiAgICAgICAgIyBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvXFxuICAgICAgICAjIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZSAoYWRqdXN0bWVudHNcXG4gICAgICAgICMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuXFxuICAgICAgICBpZiBkYXkgPT0gMDogICAgIyBtb3ZlIGJhY2sgYSBkYXlcXG4gICAgICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICAgICAgaWYgbW9udGggPiAwOlxcbiAgICAgICAgICAgICAgICBkYXkgPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0geWVhci0xLCAxMiwgMzFcXG4gICAgICAgIGVsaWYgZGF5ID09IGRpbSArIDE6ICAgICMgbW92ZSBmb3J3YXJkIGEgZGF5XFxuICAgICAgICAgICAgbW9udGggKz0gMVxcbiAgICAgICAgICAgIGRheSA9IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDEyOlxcbiAgICAgICAgICAgICAgICBtb250aCA9IDFcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG9yZGluYWwgPSBfeW1kMm9yZCh5ZWFyLCBtb250aCwgMSkgKyAoZGF5IC0gMSlcXG4gICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX29yZDJ5bWQob3JkaW5hbClcXG5cXG4gICAgaWYgbm90IGlnbm9yZV9vdmVyZmxvdyBhbmQgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcihcXFwiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2VcXFwiKVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfYWNjdW0odGFnLCBzb2ZhciwgbnVtLCBmYWN0b3IsIGxlZnRvdmVyKTpcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGludCk6XFxuICAgICAgICBwcm9kID0gbnVtICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGZsb2F0KTpcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihudW0pXFxuICAgICAgICBwcm9kID0gaW50KGludHBhcnQpICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICBpZiBmcmFjcGFydCA9PSAwLjA6XFxuICAgICAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyXFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmYWN0b3IsIGludClcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihmYWN0b3IgKiBmcmFjcGFydClcXG4gICAgICAgIHJzdW0gKz0gaW50KGludHBhcnQpXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXIgKyBmcmFjcGFydFxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAodGFnLCB0eXBlKG51bSkpKVxcblxcbmNsYXNzIHRpbWVkZWx0YShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy5cXG5cXG4gICAgU3VwcG9ydGVkIG9wZXJhdG9yczpcXG5cXG4gICAgLSBhZGQsIHN1YnRyYWN0IHRpbWVkZWx0YVxcbiAgICAtIHVuYXJ5IHBsdXMsIG1pbnVzLCBhYnNcXG4gICAgLSBjb21wYXJlIHRvIHRpbWVkZWx0YVxcbiAgICAtIG11bHRpcGx5LCBkaXZpZGUgYnkgaW50L2xvbmdcXG5cXG4gICAgSW4gYWRkaXRpb24sIGRhdGV0aW1lIHN1cHBvcnRzIHN1YnRyYWN0aW9uIG9mIHR3byBkYXRldGltZSBvYmplY3RzXFxuICAgIHJldHVybmluZyBhIHRpbWVkZWx0YSwgYW5kIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEgZGF0ZXRpbWVcXG4gICAgYW5kIGEgdGltZWRlbHRhIGdpdmluZyBhIGRhdGV0aW1lLlxcblxcbiAgICBSZXByZXNlbnRhdGlvbjogKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykuICBXaHk/ICBCZWNhdXNlIElcXG4gICAgZmVsdCBsaWtlIGl0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ19kYXlzJywgJ19zZWNvbmRzJywgJ19taWNyb3NlY29uZHMnLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGRheXM9X1NFTlRJTkVMLCBzZWNvbmRzPV9TRU5USU5FTCwgbWljcm9zZWNvbmRzPV9TRU5USU5FTCxcXG4gICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzPV9TRU5USU5FTCwgbWludXRlcz1fU0VOVElORUwsIGhvdXJzPV9TRU5USU5FTCwgd2Vla3M9X1NFTlRJTkVMKTpcXG4gICAgICAgIHggPSAwXFxuICAgICAgICBsZWZ0b3ZlciA9IDAuMFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pY3Jvc2Vjb25kc1xcXCIsIHgsIG1pY3Jvc2Vjb25kcywgX1VTX1BFUl9VUywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBtaWxsaXNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWlsbGlzZWNvbmRzXFxcIiwgeCwgbWlsbGlzZWNvbmRzLCBfVVNfUEVSX01TLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwic2Vjb25kc1xcXCIsIHgsIHNlY29uZHMsIF9VU19QRVJfU0VDT05ELCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbnV0ZXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWludXRlc1xcXCIsIHgsIG1pbnV0ZXMsIF9VU19QRVJfTUlOVVRFLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGhvdXJzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImhvdXJzXFxcIiwgeCwgaG91cnMsIF9VU19QRVJfSE9VUiwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBkYXlzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImRheXNcXFwiLCB4LCBkYXlzLCBfVVNfUEVSX0RBWSwgbGVmdG92ZXIpXFxuICAgICAgICBpZiB3ZWVrcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJ3ZWVrc1xcXCIsIHgsIHdlZWtzLCBfVVNfUEVSX1dFRUssIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbGVmdG92ZXIgIT0gMC4wOlxcbiAgICAgICAgICAgIHggKz0gX3JvdW5kKGxlZnRvdmVyKVxcbiAgICAgICAgcmV0dXJuIGNscy5fZnJvbV9taWNyb3NlY29uZHMoeClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV9taWNyb3NlY29uZHMoY2xzLCB1cyk6XFxuICAgICAgICBzLCB1cyA9IGRpdm1vZCh1cywgX1VTX1BFUl9TRUNPTkQpXFxuICAgICAgICBkLCBzID0gZGl2bW9kKHMsIF9TRUNPTkRTX1BFUl9EQVkpXFxuICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGUoZCwgcywgdXMsIEZhbHNlKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9jcmVhdGUoY2xzLCBkLCBzLCB1cywgbm9ybWFsaXplKTpcXG4gICAgICAgIGlmIG5vcm1hbGl6ZTpcXG4gICAgICAgICAgICBzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMClcXG4gICAgICAgICAgICBkLCBzID0gX25vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApXFxuXFxuICAgICAgICBpZiBub3QgLV9NQVhfREVMVEFfREFZUyA8PSBkIDw9IF9NQVhfREVMVEFfREFZUzpcXG4gICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkXFxcIiAlIChkLCBfTUFYX0RFTFRBX0RBWVMpKVxcblxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX2RheXMgPSBkXFxuICAgICAgICBzZWxmLl9zZWNvbmRzID0gc1xcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzID0gdXNcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfdG9fbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgoc2VsZi5fZGF5cyAqIF9TRUNPTkRTX1BFUl9EQVkgKyBzZWxmLl9zZWNvbmRzKSAqIF9VU19QRVJfU0VDT05EICtcXG4gICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lZGVsdGEgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuICAgICAgICBpZiBzZWxmLl9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcylcXG4gICAgICAgIHJldHVybiBcXFwiJXMoJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZGF5cylcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBtbSwgc3MgPSBkaXZtb2Qoc2VsZi5fc2Vjb25kcywgNjApXFxuICAgICAgICBoaCwgbW0gPSBkaXZtb2QobW0sIDYwKVxcbiAgICAgICAgcyA9IFxcXCIlZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgICAgICBpZiBzZWxmLl9kYXlzOlxcbiAgICAgICAgICAgIGRlZiBwbHVyYWwobik6XFxuICAgICAgICAgICAgICAgIHJldHVybiBuLCBhYnMobikgIT0gMSBhbmQgXFxcInNcXFwiIG9yIFxcXCJcXFwiXFxuICAgICAgICAgICAgcyA9IChcXFwiJWQgZGF5JXMsIFxcXCIgJSBwbHVyYWwoc2VsZi5fZGF5cykpICsgc1xcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHMgPSBzICsgXFxcIi4lMDZkXFxcIiAlIHNlbGYuX21pY3Jvc2Vjb25kc1xcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIHRvdGFsX3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUb3RhbCBzZWNvbmRzIGluIHRoZSBkdXJhdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90b19taWNyb3NlY29uZHMoKSAvIDEwLjAqKjZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRheXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXlzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmRzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRzXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyArIG90aGVyLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzICsgb3RoZXIuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyArIG90aGVyLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzIC0gb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgLSBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzIC0gb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19uZWdfXyhzZWxmKTpcXG4gICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZSgtc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuXFxuICAgIGRlZiBfX3Bvc19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpXFxuXFxuICAgIGRlZiBfX2Fic19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC1zZWxmXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjICogb3RoZXIpXFxuXFxuICAgIF9fcm11bF9fID0gX19tdWxfX1xcblxcbiAgICBkZWYgX19kaXZfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgaW50KTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fZnJvbV9taWNyb3NlY29uZHModXNlYyAvLyBvdGhlcilcXG5cXG4gICAgX19mbG9vcmRpdl9fID0gX19kaXZfX1xcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWVkZWx0YSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKVxcbiAgICAgICAgcmV0dXJuIF9jbXAoc2VsZi5fZ2V0c3RhdGUoKSwgb3RoZXIuX2dldHN0YXRlKCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiAoc2VsZi5fZGF5cyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgIT0gMCBvclxcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgIT0gMClcXG5cXG50aW1lZGVsdGEubWluID0gdGltZWRlbHRhKC1fTUFYX0RFTFRBX0RBWVMpXFxudGltZWRlbHRhLm1heCA9IHRpbWVkZWx0YShfTUFYX0RFTFRBX0RBWVMsIDI0KjM2MDAtMSwgMTAwMDAwMC0xKVxcbnRpbWVkZWx0YS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZSB0eXBlLlxcblxcbiAgICBDb25zdHJ1Y3RvcnM6XFxuXFxuICAgIF9fbmV3X18oKVxcbiAgICBmcm9tdGltZXN0YW1wKClcXG4gICAgdG9kYXkoKVxcbiAgICBmcm9tb3JkaW5hbCgpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG4gICAgX19hZGRfXywgX19yYWRkX18sIF9fc3ViX18gKGFkZC9yYWRkIG9ubHkgd2l0aCB0aW1lZGVsdGEgYXJnKVxcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICB0aW1ldHVwbGUoKVxcbiAgICB0b29yZGluYWwoKVxcbiAgICB3ZWVrZGF5KClcXG4gICAgaXNvd2Vla2RheSgpLCBpc29jYWxlbmRhcigpLCBpc29mb3JtYXQoKVxcbiAgICBjdGltZSgpXFxuICAgIHN0cmZ0aW1lKClcXG5cXG4gICAgUHJvcGVydGllcyAocmVhZG9ubHkpOlxcbiAgICB5ZWFyLCBtb250aCwgZGF5XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX3llYXInLCAnX21vbnRoJywgJ19kYXknLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdG9yLlxcblxcbiAgICAgICAgQXJndW1lbnRzOlxcblxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSAocmVxdWlyZWQsIGJhc2UgMSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgQWRkaXRpb25hbCBjb25zdHJ1Y3RvcnNcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBfdGltZS5sb2NhbHRpbWUodClcXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB0b2RheShjbHMpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tb3JkaW5hbChjbHMsIG4pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udHJ1Y3QgYSBkYXRlIGZyb20gYSBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSBhcmVcXG4gICAgICAgIG5vbi16ZXJvIGluIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBfb3JkMnltZChuKVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICAjIENvbnZlcnNpb25zIHRvIHN0cmluZ1xcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCknXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxLCB0emluZm89dGltZXpvbmUudXRjKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCwgdHppbmZvPWRhdGV0aW1lLnRpbWV6b25lLnV0YyknXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIGRhdGUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXkpXFxuXFxuICAgICMgWFhYIFRoZXNlIHNob3VsZG4ndCBkZXBlbmQgb24gdGltZS5sb2NhbHRpbWUoKSwgYmVjYXVzZSB0aGF0XFxuICAgICMgY2xpcHMgdGhlIHVzYWJsZSBkYXRlcyB0byBbMTk3MCAuLiAyMDM4KS4gIEF0IGxlYXN0IGN0aW1lKCkgaXNcXG4gICAgIyBlYXNpbHkgZG9uZSB3aXRob3V0IHVzaW5nIHN0cmZ0aW1lKCkgLS0gdGhhdCdzIGJldHRlciB0b28gYmVjYXVzZVxcbiAgICAjIHN0cmZ0aW1lKFxcXCIlY1xcXCIsIC4uLikgaXMgbG9jYWxlIHNwZWNpZmljLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAwMDowMDowMCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSwgc2VsZi5feWVhcilcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF93cmFwX3N0cmZ0aW1lKHNlbGYsIGZvcm1hdCwgc2VsZi50aW1ldHVwbGUoKSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREJy5cXG5cXG4gICAgICAgIFJlZmVyZW5jZXM6XFxuICAgICAgICAtIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWVcXG4gICAgICAgIC0gaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L2lzby10aW1lLmh0bWxcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlMDRkLSUwMmQtJTAyZFxcXCIgJSAoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgX19zdHJfXyA9IGlzb2Zvcm1hdFxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB5ZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwieWVhciAoMS05OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3llYXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtb250aChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1vbnRoICgxLTEyKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21vbnRoXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5ICgxLTMxKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheVxcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2NtcF9fLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSlcXG5cXG4gICAgZGVmIHRvb3JkaW5hbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwgZm9yIHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5LlxcblxcbiAgICAgICAgSmFudWFyeSAxIG9mIHllYXIgMSBpcyBkYXkgMS4gIE9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgdmFsdWVzXFxuICAgICAgICBjb250cmlidXRlIHRvIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyBkYXRlIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYuX3llYXJcXG4gICAgICAgIGlmIG1vbnRoIGlzIE5vbmU6XFxuICAgICAgICAgICAgbW9udGggPSBzZWxmLl9tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5fZGF5XFxuICAgICAgICByZXR1cm4gZGF0ZSh5ZWFyLCBtb250aCwgZGF5KVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheVxcbiAgICAgICAgeTIsIG0yLCBkMiA9IG90aGVyLl95ZWFyLCBvdGhlci5fbW9udGgsIG90aGVyLl9kYXlcXG4gICAgICAgIHJldHVybiBfY21wKCh5LCBtLCBkKSwgKHkyLCBtMiwgZDIpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiSGFzaC5cXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbXB1dGF0aW9uc1xcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgc2VsZi5fZGF5ICsgb3RoZXIuZGF5cyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRlKHksIG0sIGQpXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRlIHRvIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIDEpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN1YnRyYWN0IHR3byBkYXRlcywgb3IgYSBkYXRlIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIGRheXMxID0gc2VsZi50b29yZGluYWwoKVxcbiAgICAgICAgICAgIGRheXMyID0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoZGF5czEgLSBkYXlzMiwgMCwgMCwgRmFsc2UpXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgd2Vla2RheShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gZGF5IG9mIHRoZSB3ZWVrLCB3aGVyZSBNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYuXFxcIlxcbiAgICAgICAgcmV0dXJuIChzZWxmLnRvb3JkaW5hbCgpICsgNikgJSA3XFxuXFxuICAgICMgRGF5LW9mLXRoZS13ZWVrIGFuZCB3ZWVrLW9mLXRoZS15ZWFyLCBhY2NvcmRpbmcgdG8gSVNPXFxuXFxuICAgIGRlZiBpc293ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNy5cXFwiXFxuICAgICAgICAjIDEtSmFuLTAwMDEgaXMgYSBNb25kYXlcXG4gICAgICAgIHJldHVybiBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuXFxuICAgIGRlZiBpc29jYWxlbmRhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCB3ZWVrZGF5LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IElTTyB3ZWVrIG9mIHRoZSB5ZWFyIGlzIHRoZSAoTW9uLVN1bikgd2Vla1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5OyBldmVyeXRoaW5nIGVsc2UgZGVyaXZlc1xcbiAgICAgICAgZnJvbSB0aGF0LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IHdlZWsgaXMgMTsgTW9uZGF5IGlzIDEgLi4uIFN1bmRheSBpcyA3LlxcblxcbiAgICAgICAgSVNPIGNhbGVuZGFyIGFsZ29yaXRobSB0YWtlbiBmcm9tXFxuICAgICAgICBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2NhbGVuZGFyL2lzb2NhbGVuZGFyLmh0bVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgIHRvZGF5ID0gX3ltZDJvcmQoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG4gICAgICAgICMgSW50ZXJuYWxseSwgd2VlayBhbmQgZGF5IGhhdmUgb3JpZ2luIDBcXG4gICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgaWYgd2VlayA8IDA6XFxuICAgICAgICAgICAgeWVhciAtPSAxXFxuICAgICAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgICAgICB3ZWVrLCBkYXkgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMW1vbmRheSwgNylcXG4gICAgICAgIGVsaWYgd2VlayA+PSA1MjpcXG4gICAgICAgICAgICBpZiB0b2RheSA+PSBfaXNvd2VlazFtb25kYXkoeWVhcisxKTpcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICAgICAgICAgIHdlZWsgPSAwXFxuICAgICAgICByZXR1cm4geWVhciwgd2VlaysxLCBkYXkrMVxcblxcbl9kYXRlX2NsYXNzID0gZGF0ZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwiZGF0ZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG5kYXRlLm1pbiA9IGRhdGUoMSwgMSwgMSlcXG5kYXRlLm1heCA9IGRhdGUoOTk5OSwgMTIsIDMxKVxcbmRhdGUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShkYXlzPTEpXFxuXFxuY2xhc3MgdHppbmZvKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIGNsYXNzZXMuXFxuXFxuICAgIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGUgbmFtZSgpLCB1dGNvZmZzZXQoKSBhbmQgZHN0KCkgbWV0aG9kcy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICgpXFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS5cXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB0em5hbWUoKVxcXCIpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciB3ZXN0IG9mIFVUQylcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB1dGNvZmZzZXQoKVxcXCIpXFxuXFxuICAgIGRlZiBkc3Qoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLlxcblxcbiAgICAgICAgUmV0dXJuIDAgaWYgRFNUIG5vdCBpbiBlZmZlY3QuICB1dGNvZmZzZXQoKSBtdXN0IGluY2x1ZGUgdGhlIERTVFxcbiAgICAgICAgb2Zmc2V0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSBkc3QoKVxcXCIpXFxuXFxuICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS5cXFwiXFxuXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkdCwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgZGF0ZXRpbWUgYXJndW1lbnRcXFwiKVxcbiAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImR0LnR6aW5mbyBpcyBub3Qgc2VsZlxcXCIpXFxuXFxuICAgICAgICBkdG9mZiA9IGR0LnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBkdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIHV0Y29mZnNldCgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZXN1bHRcXFwiKVxcblxcbiAgICAgICAgIyBTZWUgdGhlIGxvbmcgY29tbWVudCBibG9jayBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgYW5cXG4gICAgICAgICMgZXhwbGFuYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXFxuICAgICAgICBkdGRzdCA9IGR0LmRzdCgpXFxuICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIGRzdCgpIHJlc3VsdFxcXCIpXFxuICAgICAgICBkZWx0YSA9IGR0b2ZmIC0gZHRkc3RcXG4gICAgICAgIGlmIGRlbHRhOlxcbiAgICAgICAgICAgIGR0ID0gZHQgKyBkZWx0YVxcbiAgICAgICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCk6IGR0LmRzdCBnYXZlIGluY29uc2lzdGVudCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0XFxcIilcXG4gICAgICAgIGlmIGR0ZHN0OlxcbiAgICAgICAgICAgIHJldHVybiBkdCArIGR0ZHN0XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBkdFxcblxcbl90emluZm9fY2xhc3MgPSB0emluZm9cXG5cXG5jbGFzcyB0aW1lKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlRpbWUgd2l0aCB0aW1lIHpvbmUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG5cXG4gICAgTWV0aG9kczpcXG5cXG4gICAgc3RyZnRpbWUoKVxcbiAgICBpc29mb3JtYXQoKVxcbiAgICB1dGNvZmZzZXQoKVxcbiAgICB0em5hbWUoKVxcbiAgICBkc3QoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2hvdXInLCAnX21pbnV0ZScsICdfc2Vjb25kJywgJ19taWNyb3NlY29uZCcsICdfdHppbmZvJywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICBob3VyLCBtaW51dGUgKHJlcXVpcmVkKVxcbiAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKVxcbiAgICAgICAgdHppbmZvIChkZWZhdWx0IHRvIE5vbmUpXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCA9IF9jaGVja190aW1lX2ZpZWxkcyhcXG4gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0emluZm8pXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5faG91ciA9IGhvdXJcXG4gICAgICAgIHNlbGYuX21pbnV0ZSA9IG1pbnV0ZVxcbiAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZCA9IG1pY3Jvc2Vjb25kXFxuICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm9cXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGhvdXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJob3VyICgwLTIzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hvdXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaW51dGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaW51dGUgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWludXRlXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmQgKDAtOTk5OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgdHppbmZvKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwidGltZXpvbmUgaW5mbyBvYmplY3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90emluZm9cXG5cXG4gICAgIyBTdGFuZGFyZCBjb252ZXJzaW9ucywgX19oYXNoX18gKGFuZCBoZWxwZXJzKVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpXFxuICAgICAgICBteXR6ID0gc2VsZi5fdHppbmZvXFxuICAgICAgICBvdHR6ID0gb3RoZXIuX3R6aW5mb1xcbiAgICAgICAgbXlvZmYgPSBvdG9mZiA9IE5vbmVcXG5cXG4gICAgICAgIGlmIG15dHogaXMgb3R0ejpcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IG15b2ZmID09IG90b2ZmXFxuXFxuICAgICAgICBpZiBiYXNlX2NvbXBhcmU6XFxuICAgICAgICAgICAgcmV0dXJuIF9jbXAoKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLl9ob3VyLCBvdGhlci5fbWludXRlLCBvdGhlci5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSB0aW1lc1xcXCIpXFxuICAgICAgICBteWhobW0gPSBzZWxmLl9ob3VyICogNjAgKyBzZWxmLl9taW51dGUgLSBteW9mZlxcbiAgICAgICAgb3RoaG1tID0gb3RoZXIuX2hvdXIgKiA2MCArIG90aGVyLl9taW51dGUgLSBvdG9mZlxcbiAgICAgICAgcmV0dXJuIF9jbXAoKG15aGhtbSwgc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAob3RoaG1tLCBvdGhlci5fc2Vjb25kLCBvdGhlci5fbWljcm9zZWNvbmQpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIYXNoLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgdHpvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG5vdCB0em9mZjogICMgemVybyBvciBOb25lXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2Qoc2VsZi5ob3VyICogNjAgKyBzZWxmLm1pbnV0ZSAtIHR6b2ZmLCA2MClcXG4gICAgICAgICAgICAgICAgaWYgMCA8PSBoIDwgMjQ6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZShoLCBtLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbnZlcnNpb24gdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfdHpzdHIoc2VsZiwgc2VwPVxcXCI6XFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gZm9ybWF0dGVkIHRpbWV6b25lIG9mZnNldCAoK3h4Onh4KSBvciBOb25lLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgYXNzZXJ0IDAgPD0gaGggPCAyNFxcbiAgICAgICAgICAgIG9mZiA9IFxcXCIlcyUwMmQlcyUwMmRcXFwiICUgKHNpZ24sIGhoLCBzZXAsIG1tKVxcbiAgICAgICAgcmV0dXJuIG9mZlxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZCwgJWRcXFwiICUgKHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICBlbGlmIHNlbGYuX3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZFxcXCIgJSBzZWxmLl9zZWNvbmRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcyA9IFxcXCJcXFwiXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHM9IFxcXCIlcyglZCwgJWQlcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLCBvciAnSEg6TU06U1Mreno6enonIGlmXFxuICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKVxcbiAgICAgICAgdHogPSBzZWxmLl90enN0cigpXFxuICAgICAgICBpZiB0ejpcXG4gICAgICAgICAgICBzICs9IHR6XFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuICBUaGUgZGF0ZSBwYXJ0IG9mIHRoZSB0aW1lc3RhbXAgcGFzc2VkXFxuICAgICAgICB0byB1bmRlcmx5aW5nIHN0cmZ0aW1lIHNob3VsZCBub3QgYmUgdXNlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGUgeWVhciBtdXN0IGJlID49IF9NSU5ZRUFSRk1UIGVsc2UgUHl0aG9uJ3Mgc3RyZnRpbWUgaW1wbGVtZW50YXRpb25cXG4gICAgICAgICMgY2FuIHJhaXNlIGEgYm9ndXMgZXhjZXB0aW9uLlxcbiAgICAgICAgdGltZXR1cGxlID0gKDE5MDAsIDEsIDEsXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCB0aW1ldHVwbGUpXFxuXFxuICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdCk6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmbXQsIChzdHIsIHVuaWNvZGUpKTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10Ll9fY2xhc3NfXy5fX25hbWVfXylcXG4gICAgICAgIGlmIGxlbihmbXQpICE9IDA6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm10KVxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmKVxcblxcbiAgICAjIFRpbWV6b25lIGZ1bmN0aW9uc1xcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShOb25lKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCBob3VyPU5vbmUsIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSxcXG4gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IHRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8pXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuc2Vjb25kIG9yIHNlbGYubWljcm9zZWNvbmQ6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpIG9yIDBcXG4gICAgICAgIHJldHVybiBzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlICE9IG9mZnNldFxcblxcbl90aW1lX2NsYXNzID0gdGltZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwidGltZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG50aW1lLm1pbiA9IHRpbWUoMCwgMCwgMClcXG50aW1lLm1heCA9IHRpbWUoMjMsIDU5LCA1OSwgOTk5OTk5KVxcbnRpbWUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5jbGFzcyBkYXRldGltZShkYXRlKTpcXG4gICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheVssIGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssdHppbmZvXV1dXV0pXFxuXFxuICAgIFRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW5cXG4gICAgaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gZGF0ZS5fX3Nsb3RzX18gKyB0aW1lLl9fc2xvdHNfX1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCxcXG4gICAgICAgICAgICAgICAgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl95ZWFyID0geWVhclxcbiAgICAgICAgc2VsZi5fbW9udGggPSBtb250aFxcbiAgICAgICAgc2VsZi5fZGF5ID0gZGF5XFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0aW1lc3RhbXAsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxuXFxuICAgICAgICBBIHRpbWV6b25lIGluZm8gb2JqZWN0IG1heSBiZSBwYXNzZWQgaW4gYXMgd2VsbC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHopXFxuICAgICAgICBjb252ZXJ0ZXIgPSBfdGltZS5sb2NhbHRpbWUgaWYgdHogaXMgTm9uZSBlbHNlIF90aW1lLmdtdGltZVxcbiAgICAgICAgc2VsZiA9IGNscy5fZnJvbV90aW1lc3RhbXAoY29udmVydGVyLCB0aW1lc3RhbXAsIHR6KVxcbiAgICAgICAgaWYgdHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgc2VsZiA9IHR6LmZyb211dGMoc2VsZilcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjZnJvbXRpbWVzdGFtcChjbHMsIHQpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX3RpbWVzdGFtcChfdGltZS5nbXRpbWUsIHQsIE5vbmUpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2Zyb21fdGltZXN0YW1wKGNscywgY29udmVydGVyLCB0aW1lc3RhbXAsIHR6aW5mbyk6XFxuICAgICAgICB0X2Z1bGwgPSB0aW1lc3RhbXBcXG4gICAgICAgIHRpbWVzdGFtcCA9IGludChfbWF0aC5mbG9vcih0aW1lc3RhbXApKVxcbiAgICAgICAgZnJhYyA9IHRfZnVsbCAtIHRpbWVzdGFtcFxcbiAgICAgICAgdXMgPSBfcm91bmQoZnJhYyAqIDFlNilcXG5cXG4gICAgICAgICMgSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGFcXG4gICAgICAgICMgZnVsbCBzZWNvbmQsIHVzIGNhbiBiZSByb3VuZGVkIHVwIHRvIDEwMDAwMDAuICBJbiB0aGlzIGNhc2UsXFxuICAgICAgICAjIHJvbGwgb3ZlciB0byBzZWNvbmRzLCBvdGhlcndpc2UsIFZhbHVlRXJyb3IgaXMgcmFpc2VkXFxuICAgICAgICAjIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cXG4gICAgICAgIGlmIHVzID09IDEwMDAwMDA6XFxuICAgICAgICAgICAgdGltZXN0YW1wICs9IDFcXG4gICAgICAgICAgICB1cyA9IDBcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IGNvbnZlcnRlcih0aW1lc3RhbXApXFxuICAgICAgICBzcyA9IG1pbihzcywgNTkpICAgICMgY2xhbXAgb3V0IGxlYXAgc2Vjb25kcyBpZiB0aGUgcGxhdGZvcm0gaGFzIHRoZW1cXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBub3coY2xzLCB0ej1Ob25lKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIHRpbWUudGltZSgpIGFuZCBvcHRpb25hbCB0aW1lIHpvbmUgaW5mby5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodCwgdHopXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjbm93KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkuXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gYSBnaXZlbiBkYXRlIGFuZCBhIGdpdmVuIHRpbWUuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0ZSwgX2RhdGVfY2xhc3MpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZVxcXCIpXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lLCBfdGltZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0aW1lIGFyZ3VtZW50IG11c3QgYmUgYSB0aW1lIGluc3RhbmNlXFxcIilcXG4gICAgICAgIHJldHVybiBjbHMoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoLCBkYXRlLmRheSxcXG4gICAgICAgICAgICAgICAgICAgdGltZS5ob3VyLCB0aW1lLm1pbnV0ZSwgdGltZS5zZWNvbmQsIHRpbWUubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKVxcblxcbiAgICBkZWYgdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBsb2NhbCB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLlxcXCJcXG4gICAgICAgIGRzdCA9IHNlbGYuX2RzdCgpXFxuICAgICAgICBpZiBkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICBkc3QgPSAtMVxcbiAgICAgICAgZWxpZiBkc3Q6XFxuICAgICAgICAgICAgZHN0ID0gMVxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0KVxcblxcbiAgICBkZWYgdXRjdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBVVEMgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5nbXRpbWUoKS5cXFwiXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheVxcbiAgICAgICAgaGgsIG1tLCBzcyA9IHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2Zmc2V0OiAgIyBuZWl0aGVyIE5vbmUgbm9yIDBcXG4gICAgICAgICAgICBtbSAtPSBvZmZzZXRcXG4gICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCBfID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgMCwgaWdub3JlX292ZXJmbG93PVRydWUpXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIDApXFxuXFxuICAgIGRlZiBkYXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgZGF0ZSBwYXJ0LlxcXCJcXG4gICAgICAgIHJldHVybiBkYXRlKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiB0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHR6aW5mbyBOb25lLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKVxcblxcbiAgICBkZWYgdGltZXR6KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHNhbWUgdHppbmZvLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPU5vbmUsXFxuICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYueWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYubW9udGhcXG4gICAgICAgIGlmIGRheSBpcyBOb25lOlxcbiAgICAgICAgICAgIGRheSA9IHNlbGYuZGF5XFxuICAgICAgICBpZiBob3VyIGlzIE5vbmU6XFxuICAgICAgICAgICAgaG91ciA9IHNlbGYuaG91clxcbiAgICAgICAgaWYgbWludXRlIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWludXRlID0gc2VsZi5taW51dGVcXG4gICAgICAgIGlmIHNlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuc2Vjb25kXFxuICAgICAgICBpZiBtaWNyb3NlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZFxcbiAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6XFxuICAgICAgICAgICAgdHppbmZvID0gc2VsZi50emluZm9cXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKVxcblxcbiAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0eik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6IGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdHppbmZvXFxcIilcXG5cXG4gICAgICAgIG15dHogPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgaWYgbXl0eiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuXFxuICAgICAgICBpZiB0eiBpcyBteXR6OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAjIENvbnZlcnQgc2VsZiB0byBVVEMsIGFuZCBhdHRhY2ggdGhlIG5ldyB0aW1lIHpvbmUgb2JqZWN0LlxcbiAgICAgICAgbXlvZmZzZXQgPSBzZWxmLnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBteW9mZnNldCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eilcXG5cXG4gICAgICAgICMgQ29udmVydCBmcm9tIFVUQyB0byB0eidzIGxvY2FsIHRpbWUuXFxuICAgICAgICByZXR1cm4gdHouZnJvbXV0Yyh1dGMpXFxuXFxuICAgICMgV2F5cyB0byBwcm9kdWNlIGEgc3RyaW5nLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSxcXG4gICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG5cXG4gICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmdcXG4gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLlxcblxcbiAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmRcXG4gICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBzID0gKFxcXCIlMDRkLSUwMmQtJTAyZCVjXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICtcXG4gICAgICAgICAgICAgX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgcyArPSBcXFwiJXMlMDJkOiUwMmRcXFwiICUgKHNpZ24sIGhoLCBtbSlcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIEwgPSBbc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSwgICMgVGhlc2UgYXJlIG5ldmVyIHplcm9cXG4gICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIGlmIExbLTFdID09IDA6XFxuICAgICAgICAgICAgZGVsIExbLTFdXFxuICAgICAgICBzID0gXFxcIiwgXFxcIi5qb2luKG1hcChzdHIsIEwpKVxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZXRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcyA9IFxcXCIlcyglcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIkNvbnZlcnQgdG8gc3RyaW5nLCBmb3Igc3RyKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXNvZm9ybWF0KHNlcD0nICcpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgc3RycHRpbWUoY2xzLCBkYXRlX3N0cmluZywgZm9ybWF0KTpcXG4gICAgICAgICdzdHJpbmcsIGZvcm1hdCAtPiBuZXcgZGF0ZXRpbWUgcGFyc2VkIGZyb20gYSBzdHJpbmcgKGxpa2UgdGltZS5zdHJwdGltZSgpKS4nXFxuICAgICAgICBmcm9tIF9zdHJwdGltZSBpbXBvcnQgX3N0cnB0aW1lXFxuICAgICAgICAjIF9zdHJwdGltZS5fc3RycHRpbWUgcmV0dXJucyBhIHR3by1lbGVtZW50IHR1cGxlLiAgVGhlIGZpcnN0XFxuICAgICAgICAjIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlXFxuICAgICAgICAjIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS5cXG4gICAgICAgIHN0cnVjdCwgbWljcm9zID0gX3N0cnB0aW1lKGRhdGVfc3RyaW5nLCBmb3JtYXQpXFxuICAgICAgICByZXR1cm4gY2xzKCooc3RydWN0WzA6Nl0gKyAobWljcm9zLCkpKVxcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShzZWxmKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGV0aW1lIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbXl0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG90dHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICAjIFhYWCBXaGF0IGZvbGxvd3MgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5Li4uXFxuICAgICAgICBkaWZmID0gc2VsZiAtIG90aGVyICAgICAjIHRoaXMgd2lsbCB0YWtlIG9mZnNldHMgaW50byBhY2NvdW50XFxuICAgICAgICBpZiBkaWZmLmRheXMgPCAwOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgcmV0dXJuIGRpZmYgYW5kIDEgb3IgMFxcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cyA9IF9ub3JtYWxpemVfZGF0ZXRpbWUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsXFxuICAgICAgICAgICAgc2VsZi5fbWludXRlLFxcbiAgICAgICAgICAgIHNlbGYuX3NlY29uZCArIG90aGVyLnNlY29uZHMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgKyBvdGhlci5taWNyb3NlY29uZHMgKiBmYWN0b3IpXFxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbz1zZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRldGltZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJTdWJ0cmFjdCB0d28gZGF0ZXRpbWVzLCBvciBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgICAgIGRlbHRhX2QgPSBzZWxmLnRvb3JkaW5hbCgpIC0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgIGRlbHRhX3MgPSAoc2VsZi5faG91ciAtIG90aGVyLl9ob3VyKSAqIDM2MDAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX21pbnV0ZSAtIG90aGVyLl9taW51dGUpICogNjAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX3NlY29uZCAtIG90aGVyLl9zZWNvbmQpXFxuICAgICAgICBkZWx0YV91cyA9IHNlbGYuX21pY3Jvc2Vjb25kIC0gb3RoZXIuX21pY3Jvc2Vjb25kXFxuICAgICAgICBiYXNlID0gdGltZWRlbHRhLl9jcmVhdGUoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIFRydWUpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgb3RoZXIuX3R6aW5mbzpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZVxcbiAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2ZmID09IG90b2ZmOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSBkYXRldGltZXNcXFwiKVxcbiAgICAgICAgcmV0dXJuIGJhc2UgKyB0aW1lZGVsdGEobWludXRlcyA9IG90b2ZmLW15b2ZmKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgdHpvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgZGF5cyA9IF95bWQyb3JkKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXkpXFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWxmLmhvdXIgKiAzNjAwICsgKHNlbGYubWludXRlIC0gdHpvZmYpICogNjAgKyBzZWxmLnNlY29uZFxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZWRlbHRhKGRheXMsIHNlY29uZHMsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuXFxuXFxuZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSlcXG5kYXRldGltZS5tYXggPSBkYXRldGltZSg5OTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSlcXG5kYXRldGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcblxcbmRlZiBfaXNvd2VlazFtb25kYXkoeWVhcik6XFxuICAgICMgSGVscGVyIHRvIGNhbGN1bGF0ZSB0aGUgZGF5IG51bWJlciBvZiB0aGUgTW9uZGF5IHN0YXJ0aW5nIHdlZWsgMVxcbiAgICAjIFhYWCBUaGlzIGNvdWxkIGJlIGRvbmUgbW9yZSBlZmZpY2llbnRseVxcbiAgICBUSFVSU0RBWSA9IDNcXG4gICAgZmlyc3RkYXkgPSBfeW1kMm9yZCh5ZWFyLCAxLCAxKVxcbiAgICBmaXJzdHdlZWtkYXkgPSAoZmlyc3RkYXkgKyA2KSAlIDcgICMgU2VlIHdlZWtkYXkoKSBhYm92ZVxcbiAgICB3ZWVrMW1vbmRheSA9IGZpcnN0ZGF5IC0gZmlyc3R3ZWVrZGF5XFxuICAgIGlmIGZpcnN0d2Vla2RheSA+IFRIVVJTREFZOlxcbiAgICAgICAgd2VlazFtb25kYXkgKz0gN1xcbiAgICByZXR1cm4gd2VlazFtb25kYXlcXG5cXG5cXFwiXFxcIlxcXCJcXG5Tb21lIHRpbWUgem9uZSBhbGdlYnJhLiAgRm9yIGEgZGF0ZXRpbWUgeCwgbGV0XFxuICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLlxcbiAgICB4Lm8gPSB4LnV0Y29mZnNldCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LmQgPSB4LmRzdCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmRcXG5cXG5Ob3cgc29tZSBkZXJpdmVkIHJ1bGVzLCB3aGVyZSBrIGlzIGEgZHVyYXRpb24gKHRpbWVkZWx0YSkuXFxuXFxuMS4geC5vID0geC5zICsgeC5kXFxuICAgVGhpcyBmb2xsb3dzIGZyb20gdGhlIGRlZmluaXRpb24gb2YgeC5zLlxcblxcbjIuIElmIHggYW5kIHkgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLCB4LnMgPSB5LnMuXFxuICAgVGhpcyBpcyBhY3R1YWxseSBhIHJlcXVpcmVtZW50LCBhbiBhc3N1bXB0aW9uIHdlIG5lZWQgdG8gbWFrZSBhYm91dFxcbiAgIHNhbmUgdHppbmZvIGNsYXNzZXMuXFxuXFxuMy4gVGhlIG5haXZlIFVUQyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8geCBpcyB4Lm4gLSB4Lm8uXFxuICAgVGhpcyBpcyBhZ2FpbiBhIHJlcXVpcmVtZW50IGZvciBhIHNhbmUgdHppbmZvIGNsYXNzLlxcblxcbjQuICh4K2spLnMgPSB4LnNcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSAjMiwgYW5kIHRoYXQgZGF0aW1ldGltZXR6K3RpbWVkZWx0YSBwcmVzZXJ2ZXMgdHppbmZvLlxcblxcbjUuICh4K2spLm4gPSB4Lm4gKyBrXFxuICAgQWdhaW4gZm9sbG93cyBmcm9tIGhvdyBhcml0aG1ldGljIGlzIGRlZmluZWQuXFxuXFxuTm93IHdlIGNhbiBleHBsYWluIHR6LmZyb211dGMoeCkuICBMZXQncyBhc3N1bWUgaXQncyBhbiBpbnRlcmVzdGluZyBjYXNlXFxuKG1lYW5pbmcgdGhhdCB0aGUgdmFyaW91cyB0emluZm8gbWV0aG9kcyBleGlzdCwgYW5kIGRvbid0IGJsb3cgdXAgb3IgcmV0dXJuXFxuTm9uZSB3aGVuIGNhbGxlZCkuXFxuXFxuVGhlIGZ1bmN0aW9uIHdhbnRzIHRvIHJldHVybiBhIGRhdGV0aW1lIHkgd2l0aCB0aW1lem9uZSB0eiwgZXF1aXZhbGVudCB0byB4LlxcbnggaXMgYWxyZWFkeSBpbiBVVEMuXFxuXFxuQnkgIzMsIHdlIHdhbnRcXG5cXG4gICAgeS5uIC0geS5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV1cXG5cXG5UaGUgYWxnb3JpdGhtIHN0YXJ0cyBieSBhdHRhY2hpbmcgdHogdG8geC5uLCBhbmQgY2FsbGluZyB0aGF0IHkuICBTb1xcbngubiA9IHkubiBhdCB0aGUgc3RhcnQuICBUaGVuIGl0IHdhbnRzIHRvIGFkZCBhIGR1cmF0aW9uIGsgdG8geSwgc28gdGhhdCBbMV1cXG5iZWNvbWVzIHRydWU7IGluIGVmZmVjdCwgd2Ugd2FudCB0byBzb2x2ZSBbMl0gZm9yIGs6XFxuXFxuICAgKHkraykubiAtICh5K2spLm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgWzJdXFxuXFxuQnkgIzEsIHRoaXMgaXMgdGhlIHNhbWUgYXNcXG5cXG4gICAoeStrKS5uIC0gKCh5K2spLnMgKyAoeStrKS5kKSA9IHgubiAgICAgICAgICBbM11cXG5cXG5CeSAjNSwgKHkraykubiA9IHkubiArIGssIHdoaWNoIGVxdWFscyB4Lm4gKyBrIGJlY2F1c2UgeC5uPXkubiBhdCB0aGUgc3RhcnQuXFxuU3Vic3RpdHV0aW5nIHRoYXQgaW50byBbM10sXFxuXFxuICAgeC5uICsgayAtICh5K2spLnMgLSAoeStrKS5kID0geC5uOyB0aGUgeC5uIHRlcm1zIGNhbmNlbCwgbGVhdmluZ1xcbiAgIGsgLSAoeStrKS5zIC0gKHkraykuZCA9IDA7IHJlYXJyYW5naW5nLFxcbiAgIGsgPSAoeStrKS5zIC0gKHkraykuZDsgYnkgIzQsICh5K2spLnMgPT0geS5zLCBzb1xcbiAgIGsgPSB5LnMgLSAoeStrKS5kXFxuXFxuT24gdGhlIFJIUywgKHkraykuZCBjYW4ndCBiZSBjb21wdXRlZCBkaXJlY3RseSwgYnV0IHkucyBjYW4gYmUsIGFuZCB3ZVxcbmFwcHJveGltYXRlIGsgYnkgaWdub3JpbmcgdGhlICh5K2spLmQgdGVybSBhdCBmaXJzdC4gIE5vdGUgdGhhdCBrIGNhbid0IGJlXFxudmVyeSBsYXJnZSwgc2luY2UgYWxsIG9mZnNldC1yZXR1cm5pbmcgbWV0aG9kcyByZXR1cm4gYSBkdXJhdGlvbiBvZiBtYWduaXR1ZGVcXG5sZXNzIHRoYW4gMjQgaG91cnMuICBGb3IgdGhhdCByZWFzb24sIGlmIHkgaXMgZmlybWx5IGluIHN0ZCB0aW1lLCAoeStrKS5kIG11c3RcXG5iZSAwLCBzbyBpZ25vcmluZyBpdCBoYXMgbm8gY29uc2VxdWVuY2UgdGhlbi5cXG5cXG5JbiBhbnkgY2FzZSwgdGhlIG5ldyB2YWx1ZSBpc1xcblxcbiAgICB6ID0geSArIHkucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XVxcblxcbkl0J3MgaGVscGZ1bCB0byBzdGVwIGJhY2sgYXQgbG9vayBhdCBbNF0gZnJvbSBhIGhpZ2hlciBsZXZlbDogIGl0J3Mgc2ltcGx5XFxubWFwcGluZyBmcm9tIFVUQyB0byB0eidzIHN0YW5kYXJkIHRpbWUuXFxuXFxuQXQgdGhpcyBwb2ludCwgaWZcXG5cXG4gICAgei5uIC0gei5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV1cXG5cXG53ZSBoYXZlIGFuIGVxdWl2YWxlbnQgdGltZSwgYW5kIGFyZSBhbG1vc3QgZG9uZS4gIFRoZSBpbnNlY3VyaXR5IGhlcmUgaXNcXG5hdCB0aGUgc3RhcnQgb2YgZGF5bGlnaHQgdGltZS4gIFBpY3R1cmUgVVMgRWFzdGVybiBmb3IgY29uY3JldGVuZXNzLiAgVGhlIHdhbGxcXG50aW1lIGp1bXBzIGZyb20gMTo1OSB0byAzOjAwLCBhbmQgd2FsbCBob3VycyBvZiB0aGUgZm9ybSAyOk1NIGRvbid0IG1ha2UgZ29vZFxcbnNlbnNlIHRoZW4uICBUaGUgZG9jcyBhc2sgdGhhdCBhbiBFYXN0ZXJuIHR6aW5mbyBjbGFzcyBjb25zaWRlciBzdWNoIGEgdGltZSB0b1xcbmJlIEVEVCAoYmVjYXVzZSBpdCdzIFxcXCJhZnRlciAyXFxcIiksIHdoaWNoIGlzIGEgcmVkdW5kYW50IHNwZWxsaW5nIG9mIDE6TU0gRVNUXFxub24gdGhlIGRheSBEU1Qgc3RhcnRzLiAgV2Ugd2FudCB0byByZXR1cm4gdGhlIDE6TU0gRVNUIHNwZWxsaW5nIGJlY2F1c2UgdGhhdCdzXFxudGhlIG9ubHkgc3BlbGxpbmcgdGhhdCBtYWtlcyBzZW5zZSBvbiB0aGUgbG9jYWwgd2FsbCBjbG9jay5cXG5cXG5JbiBmYWN0LCBpZiBbNV0gaG9sZHMgYXQgdGhpcyBwb2ludCwgd2UgZG8gaGF2ZSB0aGUgc3RhbmRhcmQtdGltZSBzcGVsbGluZyxcXG5idXQgdGhhdCB0YWtlcyBhIGJpdCBvZiBwcm9vZi4gIFdlIGZpcnN0IHByb3ZlIGEgc3Ryb25nZXIgcmVzdWx0LiAgV2hhdCdzIHRoZVxcbmRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTEhTIGFuZCBSSFMgb2YgWzVdPyAgTGV0XFxuXFxuICAgIGRpZmYgPSB4Lm4gLSAoei5uIC0gei5vKSAgICAgICAgICAgICAgICAgICAgWzZdXFxuXFxuTm93XFxuICAgIHoubiA9ICAgICAgICAgICAgICAgICAgICAgICBieSBbNF1cXG4gICAgKHkgKyB5LnMpLm4gPSAgICAgICAgICAgICAgIGJ5ICM1XFxuICAgIHkubiArIHkucyA9ICAgICAgICAgICAgICAgICBzaW5jZSB5Lm4gPSB4Lm5cXG4gICAgeC5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHogYW5kIHkgYXJlIGhhdmUgdGhlIHNhbWUgdHppbmZvIG1lbWJlcixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnMgPSB6LnMgYnkgIzJcXG4gICAgeC5uICsgei5zXFxuXFxuUGx1Z2dpbmcgdGhhdCBiYWNrIGludG8gWzZdIGdpdmVzXFxuXFxuICAgIGRpZmYgPVxcbiAgICB4Lm4gLSAoKHgubiArIHoucykgLSB6Lm8pID0gICAgIGV4cGFuZGluZ1xcbiAgICB4Lm4gLSB4Lm4gLSB6LnMgKyB6Lm8gPSAgICAgICAgIGNhbmNlbGxpbmdcXG4gICAgLSB6LnMgKyB6Lm8gPSAgICAgICAgICAgICAgICAgICBieSAjMlxcbiAgICB6LmRcXG5cXG5TbyBkaWZmID0gei5kLlxcblxcbklmIFs1XSBpcyB0cnVlIG5vdywgZGlmZiA9IDAsIHNvIHouZCA9IDAgdG9vLCBhbmQgd2UgaGF2ZSB0aGUgc3RhbmRhcmQtdGltZVxcbnNwZWxsaW5nIHdlIHdhbnRlZCBpbiB0aGUgZW5kY2FzZSBkZXNjcmliZWQgYWJvdmUuICBXZSdyZSBkb25lLiAgQ29udHJhcmlseSxcXG5pZiB6LmQgPSAwLCB0aGVuIHdlIGhhdmUgYSBVVEMgZXF1aXZhbGVudCwgYW5kIGFyZSBhbHNvIGRvbmUuXFxuXFxuSWYgWzVdIGlzIG5vdCB0cnVlIG5vdywgZGlmZiA9IHouZCAhPSAwLCBhbmQgei5kIGlzIHRoZSBvZmZzZXQgd2UgbmVlZCB0b1xcbmFkZCB0byB6IChpbiBlZmZlY3QsIHogaXMgaW4gdHoncyBzdGFuZGFyZCB0aW1lLCBhbmQgd2UgbmVlZCB0byBzaGlmdCB0aGVcXG5sb2NhbCBjbG9jayBpbnRvIHR6J3MgZGF5bGlnaHQgdGltZSkuXFxuXFxuTGV0XFxuXFxuICAgIHonID0geiArIHouZCA9IHogKyBkaWZmICAgICAgICAgICAgICAgICAgICAgWzddXFxuXFxuYW5kIHdlIGNhbiBhZ2FpbiBhc2sgd2hldGhlclxcblxcbiAgICB6Jy5uIC0geicubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4XVxcblxcbklmIHNvLCB3ZSdyZSBkb25lLiAgSWYgbm90LCB0aGUgdHppbmZvIGNsYXNzIGlzIGluc2FuZSwgYWNjb3JkaW5nIHRvIHRoZVxcbmFzc3VtcHRpb25zIHdlJ3ZlIG1hZGUuICBUaGlzIGFsc28gcmVxdWlyZXMgYSBiaXQgb2YgcHJvb2YuICBBcyBiZWZvcmUsIGxldCdzXFxuY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbOF0gKGFuZCBza2lwcGluZyBzb21lIG9mXFxudGhlIGp1c3RpZmljYXRpb25zIGZvciB0aGUga2luZHMgb2Ygc3Vic3RpdHV0aW9ucyB3ZSd2ZSBkb25lIHNldmVyYWwgdGltZXNcXG5hbHJlYWR5KTpcXG5cXG4gICAgZGlmZicgPSB4Lm4gLSAoeicubiAtIHonLm8pID0gICAgICAgICAgIHJlcGxhY2luZyB6Jy5uIHZpYSBbN11cXG4gICAgICAgICAgICB4Lm4gIC0gKHoubiArIGRpZmYgLSB6Jy5vKSA9ICAgIHJlcGxhY2luZyBkaWZmIHZpYSBbNl1cXG4gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9XFxuICAgICAgICAgICAgeC5uIC0gei5uIC0geC5uICsgei5uIC0gei5vICsgeicubyA9ICAgIGNhbmNlbCB4Lm5cXG4gICAgICAgICAgICAtIHoubiArIHoubiAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgY2FuY2VsIHoublxcbiAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlXFxuICAgICAgICAgICAgLXoucyAtIHouZCArIHonLnMgKyB6Jy5kID0gICAgICAgICAgeiBhbmQgeicgaGF2ZSBzYW1lIHR6aW5mb1xcbiAgICAgICAgICAgIHonLmQgLSB6LmRcXG5cXG5TbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCxcXG53ZSd2ZSBmb3VuZCB0aGUgVVRDLWVxdWl2YWxlbnQgc28gYXJlIGRvbmUuICBJbiBmYWN0LCB3ZSBzdG9wIHdpdGggWzddIGFuZFxcbnJldHVybiB6Jywgbm90IGJvdGhlcmluZyB0byBjb21wdXRlIHonLmQuXFxuXFxuSG93IGNvdWxkIHouZCBhbmQgeidkIGRpZmZlcj8gIHonID0geiArIHouZCBbN10sIHNvIG1lcmVseSBtb3ZpbmcgeicgYnlcXG5hIGRzdCgpIG9mZnNldCwgYW5kIHN0YXJ0aW5nICpmcm9tKiBhIHRpbWUgYWxyZWFkeSBpbiBEU1QgKHdlIGtub3cgei5kICE9IDApLFxcbndvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSByZXN1bHQgZHN0KCkgcmV0dXJuczogIHdlIHN0YXJ0IGluIERTVCwgYW5kIG1vdmluZ1xcbmEgbGl0dGxlIGZ1cnRoZXIgaW50byBpdCB0YWtlcyB1cyBvdXQgb2YgRFNULlxcblxcblRoZXJlIGlzbid0IGEgc2FuZSBjYXNlIHdoZXJlIHRoaXMgY2FuIGhhcHBlbi4gIFRoZSBjbG9zZXN0IGl0IGdldHMgaXMgYXRcXG50aGUgZW5kIG9mIERTVCwgd2hlcmUgdGhlcmUncyBhbiBob3VyIGluIFVUQyB3aXRoIG5vIHNwZWxsaW5nIGluIGEgaHlicmlkXFxudHppbmZvIGNsYXNzLiAgSW4gVVMgRWFzdGVybiwgdGhhdCdzIDU6TU0gVVRDID0gMDpNTSBFU1QgPSAxOk1NIEVEVC4gIER1cmluZ1xcbnRoYXQgaG91ciwgb24gYW4gRWFzdGVybiBjbG9jayAxOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgKDY6TU1cXG5VVEMpIGJlY2F1c2UgdGhlIGRvY3MgaW5zaXN0IG9uIHRoYXQsIGJ1dCAwOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIGRheWxpZ2h0XFxudGltZSAoNDpNTSBVVEMpLiAgVGhlcmUgaXMgbm8gbG9jYWwgdGltZSBtYXBwaW5nIHRvIDU6TU0gVVRDLiAgVGhlIGxvY2FsXFxuY2xvY2sganVtcHMgZnJvbSAxOjU5IGJhY2sgdG8gMTowMCBhZ2FpbiwgYW5kIHJlcGVhdHMgdGhlIDE6TU0gaG91ciBpblxcbnN0YW5kYXJkIHRpbWUuICBTaW5jZSB0aGF0J3Mgd2hhdCB0aGUgbG9jYWwgY2xvY2sgKmRvZXMqLCB3ZSB3YW50IHRvIG1hcCBib3RoXFxuVVRDIGhvdXJzIDU6TU0gYW5kIDY6TU0gdG8gMTpNTSBFYXN0ZXJuLiAgVGhlIHJlc3VsdCBpcyBhbWJpZ3VvdXNcXG5pbiBsb2NhbCB0aW1lLCBidXQgc28gaXQgZ29lcyAtLSBpdCdzIHRoZSB3YXkgdGhlIGxvY2FsIGNsb2NrIHdvcmtzLlxcblxcbldoZW4geCA9IDU6TU0gVVRDIGlzIHRoZSBpbnB1dCB0byB0aGlzIGFsZ29yaXRobSwgeC5vPTAsIHkubz0tNSBhbmQgeS5kPTAsXFxuc28gej0wOk1NLiAgei5kPTYwIChtaW51dGVzKSB0aGVuLCBzbyBbNV0gZG9lc24ndCBob2xkIGFuZCB3ZSBrZWVwIGdvaW5nLlxcbnonID0geiArIHouZCA9IDE6TU0gdGhlbiwgYW5kIHonLmQ9MCwgYW5kIHonLmQgLSB6LmQgPSAtNjAgIT0gMCBzbyBbOF1cXG4oY29ycmVjdGx5KSBjb25jbHVkZXMgdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgdG8geC5cXG5cXG5CZWNhdXNlIHdlIGtub3cgei5kIHNhaWQgeiB3YXMgaW4gZGF5bGlnaHQgdGltZSAoZWxzZSBbNV0gd291bGQgaGF2ZSBoZWxkIGFuZFxcbndlIHdvdWxkIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHdlIGtub3cgei5kICE9IHonLmQgKGVsc2UgWzhdIHdvdWxkIGhhdmUgaGVsZFxcbmFuZCB3ZSBoYXZlIHN0b3BwZWQgdGhlbiksIGFuZCB0aGVyZSBhcmUgb25seSAyIHBvc3NpYmxlIHZhbHVlcyBkc3QoKSBjYW5cXG5yZXR1cm4gaW4gRWFzdGVybiwgaXQgZm9sbG93cyB0aGF0IHonLmQgbXVzdCBiZSAwICh3aGljaCBpdCBpcyBpbiB0aGUgZXhhbXBsZSxcXG5idXQgdGhlIHJlYXNvbmluZyBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgZXhhbXBsZSAtLSBpdCBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nXFxudHdvIHBvc3NpYmxlIGRzdCgpIG91dGNvbWVzLCBvbmUgemVybyBhbmQgdGhlIG90aGVyIG5vbi16ZXJvKS4gIFRoZXJlZm9yZVxcbnonIG11c3QgYmUgaW4gc3RhbmRhcmQgdGltZSwgYW5kIGlzIHRoZSBzcGVsbGluZyB3ZSB3YW50IGluIHRoaXMgY2FzZS5cXG5cXG5Ob3RlIGFnYWluIHRoYXQgeicgaXMgbm90IFVUQy1lcXVpdmFsZW50IGFzIGZhciBhcyB0aGUgaHlicmlkIHR6aW5mbyBjbGFzcyBpc1xcbmNvbmNlcm5lZCAoYmVjYXVzZSBpdCB0YWtlcyB6JyBhcyBiZWluZyBpbiBzdGFuZGFyZCB0aW1lIHJhdGhlciB0aGFuIHRoZVxcbmRheWxpZ2h0IHRpbWUgd2UgaW50ZW5kIGhlcmUpLCBidXQgcmV0dXJuaW5nIGl0IGdpdmVzIHRoZSByZWFsLWxpZmUgXFxcImxvY2FsXFxuY2xvY2sgcmVwZWF0cyBhbiBob3VyXFxcIiBiZWhhdmlvciB3aGVuIG1hcHBpbmcgdGhlIFxcXCJ1bnNwZWxsYWJsZVxcXCIgVVRDIGhvdXIgaW50b1xcbnR6LlxcblxcbldoZW4gdGhlIGlucHV0IGlzIDY6TU0sIHo9MTpNTSBhbmQgei5kPTAsIGFuZCB3ZSBzdG9wIGF0IG9uY2UsIGFnYWluIHdpdGhcXG50aGUgMTpNTSBzdGFuZGFyZCB0aW1lIHNwZWxsaW5nIHdlIHdhbnQuXFxuXFxuU28gaG93IGNhbiB0aGlzIGJyZWFrPyAgT25lIG9mIHRoZSBhc3N1bXB0aW9ucyBtdXN0IGJlIHZpb2xhdGVkLiAgVHdvXFxucG9zc2liaWxpdGllczpcXG5cXG4xKSBbMl0gZWZmZWN0aXZlbHkgc2F5cyB0aGF0IHkucyBpcyBpbnZhcmlhbnQgYWNyb3NzIGFsbCB5IGJlbG9uZyB0byBhIGdpdmVuXFxuICAgdGltZSB6b25lLiAgVGhpcyBpc24ndCB0cnVlIGlmLCBmb3IgcG9saXRpY2FsIHJlYXNvbnMgb3IgY29udGluZW50YWwgZHJpZnQsXFxuICAgYSByZWdpb24gZGVjaWRlcyB0byBjaGFuZ2UgaXRzIGJhc2Ugb2Zmc2V0IGZyb20gVVRDLlxcblxcbjIpIFRoZXJlIG1heSBiZSB2ZXJzaW9ucyBvZiBcXFwiZG91YmxlIGRheWxpZ2h0XFxcIiB0aW1lIHdoZXJlIHRoZSB0YWlsIGVuZCBvZlxcbiAgIHRoZSBhbmFseXNpcyBnaXZlcyB1cCBhIHN0ZXAgdG9vIGVhcmx5LiAgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgdGhhdFxcbiAgIGVub3VnaCB0byBzYXkuXFxuXFxuSW4gYW55IGNhc2UsIGl0J3MgY2xlYXIgdGhhdCB0aGUgZGVmYXVsdCBmcm9tdXRjKCkgaXMgc3Ryb25nIGVub3VnaCB0byBoYW5kbGVcXG5cXFwiYWxtb3N0IGFsbFxcXCIgdGltZSB6b25lczogIHNvIGxvbmcgYXMgdGhlIHN0YW5kYXJkIG9mZnNldCBpcyBpbnZhcmlhbnQsIGl0XFxuZG9lc24ndCBtYXR0ZXIgaWYgZGF5bGlnaHQgdGltZSB0cmFuc2l0aW9uIHBvaW50cyBjaGFuZ2UgZnJvbSB5ZWFyIHRvIHllYXIsIG9yXFxuaWYgZGF5bGlnaHQgdGltZSBpcyBza2lwcGVkIGluIHNvbWUgeWVhcnM7IGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBsYXJnZSBvclxcbnNtYWxsIGRzdCgpIG1heSBnZXQgd2l0aGluIGl0cyBib3VuZHM7IGFuZCBpdCBkb2Vzbid0IGV2ZW4gbWF0dGVyIGlmIHNvbWVcXG5wZXJ2ZXJzZSB0aW1lIHpvbmUgcmV0dXJucyBhIG5lZ2F0aXZlIGRzdCgpKS4gIFNvIGEgYnJlYWtpbmcgY2FzZSBtdXN0IGJlXFxucHJldHR5IGJpemFycmUsIGFuZCBhIHR6aW5mbyBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgZnJvbXV0YygpIGlmIGl0IGlzLlxcblxcXCJcXFwiXFxcIlxcblwiLFwic3JjL2xpYi9kYmhhc2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRiaGFzaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RlY2ltYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRlY2ltYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaWZmbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaWZmbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlyY2FjaGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcmNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpc3R1dGlscyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3Rlc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvY3Rlc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kb2N1bWVudC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGEsYj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkb2N1bWVudFxcXCIpfTtyZXR1cm4gYi5nZXRFbGVtZW50QnlJZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuY3JlYXRlRWxlbWVudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS52KTtpZihjKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSl9KSxiLmdldEVsZW1lbnRzQnlUYWdOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGEudiksZD1bXSxlPWMubGVuZ3RoLTE7MDw9ZTtlLS0pZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRFbGVtZW50c0J5TmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5xdWVyeVNlbGVjdG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhLnYpO3JldHVybiBjP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLnF1ZXJ5U2VsZWN0b3JBbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRDdXJyZW50RWRpdG9yVmFsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmRpdmlkJiZ2b2lkIDAhPT13aW5kb3cuZWRMaXN0KXtpZihTay5ncmFkZUNvbnRhaW5lciE9U2suZGl2aWQpe3ZhciBhPVNrLmdyYWRlQ29udGFpbmVyK1xcXCIgXFxcIitTay5kaXZpZDtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHdpbmRvdy5lZExpc3RbYV0uZWRpdG9yLmdldFZhbHVlKCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFtTay5kaXZpZF0uZWRpdG9yLmdldFZhbHVlKCkpfXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJDYW4ndCBmaW5kIGVkaXRvciBmb3IgdGhpcyBkaXZcXFwiKX0pLGIuY3VycmVudERpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZGl2aWRcXFwiKX0pLGIuY3VycmVudENvdXJzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09ZUJvb2tDb25maWcpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlQm9va0NvbmZpZy5jb3Vyc2UpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyBjb3Vyc2VcXFwiKX0pLGIuY3VycmVudEdyYWRpbmdDb250YWluZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmdyYWRlQ29udGFpbmVyKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZ3JhZGVDb250YWluZXIpO2lmKG51bGwhPVNrLmRpdmlkKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZGl2aWQpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyB2YWx1ZSBzZXQgZm9yIGdyYWRpbmdcXFwiKX0pLGE9ZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9YixhLmlubmVySFRNTD1iLmlubmVySFRNTCxhLmlubmVyVGV4dD1iLmlubmVyVGV4dCx2b2lkIDAhPT1iLnZhbHVlJiYoYS52YWx1ZT1iLnZhbHVlLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInZhbHVlXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKSksdm9pZCAwIT09Yi5jaGVja2VkJiYoYS5jaGVja2VkPWIuY2hlY2tlZCxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjaGVja2VkXFxcIiksU2suYnVpbHRpbi5ib29sKGEuY2hlY2tlZCkpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lckhUTUwpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lclRleHQpKX0pLGMudHAkZ2V0YXR0cj1Tay5nZW5lcmljLmdldEF0dHIsYy5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImlubmVySFRNTFxcXCI9PT1iJiYoYS5pbm5lckhUTUw9YyxhLnYuaW5uZXJIVE1MPWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxjKSksXFxcImlubmVyVGV4dFxcXCI9PT1iJiYoYS5pbm5lclRleHQ9YyxhLnYuaW5uZXJUZXh0PWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxjKSl9KSxjLmFwcGVuZENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuYXBwZW5kQ2hpbGQoYi52KX0pLGMucmVtb3ZlQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yZW1vdmVDaGlsZChiLnYpfSksYy5jbG9zZXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnYuY2xvc2VzdChjLnYpO3JldHVybiBkP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2RdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmdldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3R5bGVbYi52XSl9KSxjLnNldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc3R5bGVbYi52XT1jLnZ9KSxjLmdldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldEF0dHJpYnV0ZShiLnYpO3JldHVybiBjP25ldyBTay5idWlsdGluLnN0cihjKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLnNldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc2V0QXR0cmlidXRlKGIudixjLnYpfSksYy5nZXRQcm9wZXJ0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52W2Iudl07cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBjb25zb2xlLmxvZyhhLnYudGFnTmFtZSksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi50YWdOYW1lKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltET00gRWxlbWVudF1cXFwiKX0pfSxiLkVsZW1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhiLGEsXFxcIkVsZW1lbnRcXFwiLFtdKSxifTtcIixcInNyYy9saWIvZHVtYmRibS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtYmRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2R1bW15X3RocmVhZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXlfdGhyZWFkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZW1haWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1lIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvdGVzdC9kYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW5jb2RpbmdzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbmNvZGluZ3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlY21wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlY21wIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZmlsZWlucHV0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlaW5wdXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mbm1hdGNoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmbm1hdGNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZm9ybWF0dGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmb3JtYXR0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcGZvcm1hdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnBmb3JtYXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcmFjdGlvbnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZyYWN0aW9ucyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Z0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnVuY3Rvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdW5jdG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZW5lcmljcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2VuZXJpY3BhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXRvcHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldG9wdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHBhc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHBhc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXR0ZXh0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXR0ZXh0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2xvYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2xvYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2d6aXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImd6aXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oYXNobGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJoYXNobGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaGVhcHEucHlcIjpcIlxcXCJcXFwiXFxcIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblVzYWdlOlxcblxcbmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXFxuaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcFxcbml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxcbmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWVcXG5pdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXFxuXFxuT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XFxuXFxuLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZVxcbiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXFxuICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxcblxcbi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxcblxcblRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0XFxud2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxcbm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBPcmlnaW5hbCBjb2RlIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycyBhbmQgUmF5bW9uZCBIZXR0aW5nZXJcXG5cXG5fX2Fib3V0X18gPSBcXFwiXFxcIlxcXCJIZWFwIHF1ZXVlc1xcblxcbltleHBsYW5hdGlvbiBieSBGcmFuw6dvaXMgUGluYXJkXVxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XFxucmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxcblxcbiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXFxuXFxuICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XFxuXFxuICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxcblxcbiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXFxuXFxuXFxuSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cXG5hIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXFxub3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlXFxudG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uc1xcbm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxcblRvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvXFxucmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lc1xcbnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXFxuYnV0IHRoZSB0b3AgY2VsbCBcXFwid2luc1xcXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cXG5cXG5JZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XFxudGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kXFxuZmluZCB0aGUgXFxcIm5leHRcXFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxcbmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd25cXG50aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXFxuVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXFxuQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LlxcblxcbkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ld1xcbml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcXG5ub3QgXFxcImJldHRlclxcXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcXG5lc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcXG5pbmNvbWluZyBldmVudHMsIGFuZCB0aGUgXFxcIndpblxcXCIgY29uZGl0aW9uIG1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWRcXG50aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcXG5zY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXFxuaGVhcCBpcyBhIGdvb2Qgc3RydWN0dXJlIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyAodGhpcyBpcyB3aGF0IElcXG51c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXFxuXFxuVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHlcXG5zdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxcbnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcXG50aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoXFxuYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXFxuXFxuSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcXG5rbm93IHRoYXQgYSBiaWcgc29ydCBpbXBsaWVzIHByb2R1Y2luZyBcXFwicnVuc1xcXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXFxuc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxcbmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW5cXG52ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcXG5zb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxcbnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3VcXG5yZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXFxucHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXFxuYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuXFxuXFxuTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2hcXG5tYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcXFwid2luc1xcXCIgb3ZlclxcbnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxcbmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcXG5mb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZVxcbnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XFxudmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcXG5lZmZlY3RpdmUhXFxuXFxuSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXFxuYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlXFxuYXJvdW5kLiA6LSlcXG5cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblsxXSBUaGUgZGlzayBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3aGljaCBhcmUgY3VycmVudCwgbm93YWRheXMsIGFyZVxcbm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmdcXG5jYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcXG50YXBlIGRyaXZlcywgdGhlIHN0b3J5IHdhcyBxdWl0ZSBkaWZmZXJlbnQsIGFuZCBvbmUgaGFkIHRvIGJlIHZlcnlcXG5jbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGVcXG5tb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XFxuXFxcInByb2dyZXNzaW5nXFxcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXFxuYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cXG5CZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIVxcbkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsnaGVhcHB1c2gnLCAnaGVhcHBvcCcsICdoZWFwaWZ5JywgJ2hlYXByZXBsYWNlJyxcXG4gICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXVxcblxcbmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBoZWFwLmFwcGVuZChpdGVtKVxcbiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpXFxuXFxuZGVmIGhlYXBwb3AoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgICAgIHJldHVybiByZXR1cm5pdGVtXFxuICAgIHJldHVybiBsYXN0ZWx0XFxuXFxuZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXFxuXFxuICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxcbiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXFxuICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxcbiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxcblxcbiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06XFxuICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxcXCJcXFwiXFxcIlxcbiAgICBpZiBoZWFwIGFuZCBoZWFwWzBdIDwgaXRlbTpcXG4gICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtXFxuICAgICAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiBpdGVtXFxuXFxuZGVmIGhlYXBpZnkoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgIyBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8gbG9va2luZyBhdFxcbiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLFxcbiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvXFxuICAgICMgai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXNcXG4gICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS5cXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cCh4LCBpKVxcblxcbmRlZiBfaGVhcHBvcF9tYXgoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBpZiBoZWFwOlxcbiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF1cXG4gICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0XFxuICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgX2hlYXByZXBsYWNlX21heChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcCBmb2xsb3dlZCBieSBhIGhlYXBwdXNoLlxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cF9tYXgoaGVhcCwgMClcXG4gICAgcmV0dXJuIHJldHVybml0ZW1cXG5cXG5kZWYgX2hlYXBpZnlfbWF4KHgpOlxcbiAgICBcXFwiXFxcIlxcXCJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgbWF4aGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLlxcXCJcXFwiXFxcIlxcbiAgICBuID0gbGVuKHgpXFxuICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKTpcXG4gICAgICAgIF9zaWZ0dXBfbWF4KHgsIGkpXFxuXFxuIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvc1xcbiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGVcXG4jIGhlYXAgaW52YXJpYW50LlxcbmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIG5ld2l0ZW0gPCBwYXJlbnQ6XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG4jIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlXFxuIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2ZcXG4jIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLFxcbiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLlxcbiNcXG4jIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9XFxuIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0XFxuIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXlcXG4jIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXRcXG4jIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3RcXG4jIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpc1xcbiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLlxcbiNcXG4jIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vXFxuIyB3YXkgdG8gZXh0cmFjdCBcXFwidGhlIHByaW9yaXR5XFxcIiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlXFxuIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBjb21wYXJpc29uIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzXFxuIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseVxcbiMgZXhwZW5zaXZlLlxcbiNcXG4jIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZlxcbiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmVcXG4jIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gM1xcbiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOlxcbiNcXG4jIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODBcXG4jIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OFxcbiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzXFxuI1xcbiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWRcXG4jIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuXFxuIyB5b3UgY2FuIHVzZSBpdC5cXG4jXFxuIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNyxcXG4jIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmRcXG4jIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudFxcbiMgZm9yIHNvcnRpbmcuXFxuXFxuZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKTpcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuXFxuICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb25cXG4gICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6XFxuICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtjaGlsZHBvc10gPCBoZWFwW3JpZ2h0cG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnRkb3duJ1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZVxcbiAgICAjIG5ld2l0ZW0gZml0cy5cXG4gICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6XFxuICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMVxcbiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdXFxuICAgICAgICBpZiBwYXJlbnQgPCBuZXdpdGVtOlxcbiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudFxcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvc1xcbiAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICBicmVha1xcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuXFxuZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnR1cCdcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC5cXG4gICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxXFxuICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGhlYXBbcmlnaHRwb3NdIDwgaGVhcFtjaGlsZHBvc106XFxuICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvc1xcbiAgICAgICAgIyBNb3ZlIHRoZSBsYXJnZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKVxcblxcblxcbiMgQWxnb3JpdGhtIG5vdGVzIGZvciBubGFyZ2VzdCgpIGFuZCBuc21hbGxlc3QoKVxcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiNcXG4jIE1ha2UgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBkYXRhIHdoaWxlIGtlZXBpbmcgdGhlIGsgbW9zdCBleHRyZW1lIHZhbHVlc1xcbiMgaW4gYSBoZWFwLiAgTWVtb3J5IGNvbnN1bXB0aW9uIGlzIGxpbWl0ZWQgdG8ga2VlcGluZyBrIHZhbHVlcyBpbiBhIGxpc3QuXFxuI1xcbiMgTWVhc3VyZWQgcGVyZm9ybWFuY2UgZm9yIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjb21wYXJpc29uc1xcbiMgICAgbiBpbnB1dHMgICAgIGstZXh0cmVtZSB2YWx1ZXMgIChhdmVyYWdlIG9mIDUgdHJpYWxzKSAgICUgbW9yZSB0aGFuIG1pbigpXFxuIyAtLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAgICAgMSwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDMsMzE3ICAgICAgICAgICAgICAgMjMxLjclXFxuIyAgICAgMTAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgIDE0LDA0NiAgICAgICAgICAgICAgICA0MC41JVxcbiMgICAgMTAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgIDEwNSw3NDkgICAgICAgICAgICAgICAgIDUuNyVcXG4jICAxLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgMSwwMDcsNzUxICAgICAgICAgICAgICAgICAwLjglXFxuIyAxMCwwMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgMTAsMDA5LDQwMSAgICAgICAgICAgICAgICAgMC4xJVxcbiNcXG4jIFRoZW9yZXRpY2FsIG51bWJlciBvZiBjb21wYXJpc29ucyBmb3IgayBzbWFsbGVzdCBvZiBuIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgU3RlcCAgIENvbXBhcmlzb25zICAgICAgICAgICAgICAgICAgQWN0aW9uXFxuIyAtLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAxICAgICAxLjY2ICogayAgICAgICAgICAgICAgICAgICAgIGhlYXBpZnkgdGhlIGZpcnN0IGstaW5wdXRzXFxuIyAgMiAgICAgbiAtIGsgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlIHJlbWFpbmluZyBlbGVtZW50cyB0byB0b3Agb2YgaGVhcFxcbiMgIDMgICAgIGsgKiAoMSArIGxnMihrKSkgKiBsbihuL2spICAgcmVwbGFjZSB0aGUgdG9wbW9zdCB2YWx1ZSBvbiB0aGUgaGVhcFxcbiMgIDQgICAgIGsgKiBsZzIoaykgLSAoay8yKSAgICAgICAgICAgZmluYWwgc29ydCBvZiB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuI1xcbiMgQ29tYmluaW5nIGFuZCBzaW1wbGlmeWluZyBmb3IgYSByb3VnaCBlc3RpbWF0ZSBnaXZlczpcXG4jXFxuIyAgICAgICAgY29tcGFyaXNvbnMgPSBuICsgayAqIChsb2coaywgMikgKiBsb2cobi9rKSArIGxvZyhrLCAyKSArIGxvZyhuL2spKVxcbiNcXG4jIENvbXB1dGluZyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgKiBGb3IgdGhlIGktdGggbmV3IHZhbHVlIGZyb20gdGhlIGl0ZXJhYmxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgaW4gdGhlXFxuIyAgIGsgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyBrL2kuICBGb3IgZXhhbXBsZSwgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSAxMDFzdFxcbiMgICB2YWx1ZSBzZWVuIGJlaW5nIGluIHRoZSAxMDAgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyAxMDAvMTAxLlxcbiMgKiBJZiB0aGUgdmFsdWUgaXMgYSBuZXcgZXh0cmVtZSB2YWx1ZSwgdGhlIGNvc3Qgb2YgaW5zZXJ0aW5nIGl0IGludG8gdGhlXFxuIyAgIGhlYXAgaXMgMSArIGxvZyhrLCAyKS5cXG4jICogVGhlIHByb2JhYmlsaXR5IHRpbWVzIHRoZSBjb3N0IGdpdmVzOlxcbiMgICAgICAgICAgICAoay9pKSAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBTdW1taW5nIGFjcm9zcyB0aGUgcmVtYWluaW5nIG4tayBlbGVtZW50cyBnaXZlczpcXG4jICAgICAgICAgICAgc3VtKChrL2kpICogKDEgKyBsb2coaywgMikpIGZvciBpIGluIHJhbmdlKGsrMSwgbisxKSlcXG4jICogVGhpcyByZWR1Y2VzIHRvOlxcbiMgICAgICAgICAgICAoSChuKSAtIEgoaykpICogayAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBXaGVyZSBIKG4pIGlzIHRoZSBuLXRoIGhhcm1vbmljIG51bWJlciBlc3RpbWF0ZWQgYnk6XFxuIyAgICAgICAgICAgIGdhbW1hID0gMC41NzcyMTU2NjQ5XFxuIyAgICAgICAgICAgIEgobikgPSBsb2cobiwgZSkgKyBnYW1tYSArIDEgLyAoMiAqIG4pXFxuIyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFybW9uaWNfc2VyaWVzXyhtYXRoZW1hdGljcykjUmF0ZV9vZl9kaXZlcmdlbmNlXFxuIyAqIFN1YnN0aXR1dGluZyB0aGUgSChuKSBmb3JtdWxhOlxcbiMgICAgICAgICAgICBjb21wYXJpc29ucyA9IGsgKiAoMSArIGxvZyhrLCAyKSkgKiAobG9nKG4vaywgZSkgKyAoMS9uIC0gMS9rKSAvIDIpXFxuI1xcbiMgV29yc3QtY2FzZSBmb3Igc3RlcCAzOlxcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBpbnB1dCBkYXRhIGlzIHJldmVyc2VkIHNvcnRlZCBzbyB0aGF0IGV2ZXJ5IG5ldyBlbGVtZW50XFxuIyBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBoZWFwOlxcbiNcXG4jICAgICAgICAgICAgIGNvbXBhcmlzb25zID0gMS42NiAqIGsgKyBsb2coaywgMikgKiAobiAtIGspXFxuI1xcbiMgQWx0ZXJuYXRpdmUgQWxnb3JpdGhtc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgT3RoZXIgYWxnb3JpdGhtcyB3ZXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleTpcXG4jIDEpIFRvb2sgbXVjaCBtb3JlIGF1eGlsaWFyeSBtZW1vcnksXFxuIyAyKSBNYWRlIG11bHRpcGxlIHBhc3NlcyBvdmVyIHRoZSBkYXRhLlxcbiMgMykgTWFkZSBtb3JlIGNvbXBhcmlzb25zIGluIGNvbW1vbiBjYXNlcyAoc21hbGwgaywgbGFyZ2Ugbiwgc2VtaS1yYW5kb20gaW5wdXQpLlxcbiMgU2VlIHRoZSBtb3JlIGRldGFpbGVkIGNvbXBhcmlzb24gb2YgYXBwcm9hY2ggYXQ6XFxuIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81Nzc1NzMtY29tcGFyZS1hbGdvcml0aG1zLWZvci1oZWFwcXNtYWxsZXN0XFxuXFxuZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKClcXG4gICAgaWYgbiA9PSAxOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKVxcbiAgICAgICAgcmVzdWx0ID0gbWluKGl0LCBkZWZhdWx0PXNlbnRpbmVsLCBrZXk9a2V5KVxcbiAgICAgICAgcmV0dXJuIFtdIGlmIHJlc3VsdCBpcyBzZW50aW5lbCBlbHNlIFtyZXN1bHRdXFxuXFxuICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKClcXG4gICAgdHJ5OlxcbiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSlcXG4gICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKTpcXG4gICAgICAgIHBhc3NcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIG4gPj0gc2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgIyBwdXQgdGhlIHJhbmdlKG4pIGZpcnN0IHNvIHRoYXQgemlwKCkgZG9lc24ndFxcbiAgICAgICAgIyBjb25zdW1lIG9uZSB0b28gbWFueSBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvclxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSBuXFxuICAgICAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiBlbGVtIDwgdG9wOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciArPSAxXFxuICAgICAgICByZXN1bHQuc29ydCgpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKG4pLCBpdCldXFxuICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgIF9oZWFwaWZ5X21heChyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IG5cXG4gICAgX2hlYXByZXBsYWNlID0gX2hlYXByZXBsYWNlX21heFxcbiAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgIGsgPSBrZXkoZWxlbSlcXG4gICAgICAgIGlmIGsgPCB0b3A6XFxuICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGssIG9yZGVyLCBlbGVtKSlcXG4gICAgICAgICAgICB0b3AsIF9vcmRlciwgX2VsZW0gPSByZXN1bHRbMF1cXG4gICAgICAgICAgICBvcmRlciArPSAxXFxuICAgIHJlc3VsdC5zb3J0KClcXG4gICAgcmV0dXJuIFtlbGVtIGZvciAoaywgb3JkZXIsIGVsZW0pIGluIHJlc3VsdF1cXG5cXG5kZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtYXgoaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dXFxuXFxuICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvblxcbiAgICBpZiBrZXkgaXMgTm9uZTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHJlc3VsdCA9IFsoZWxlbSwgaSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgaGVhcGlmeShyZXN1bHQpXFxuICAgICAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgICAgIG9yZGVyID0gLW5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiB0b3AgPCBlbGVtOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciAtPSAxXFxuICAgICAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgaGVhcGlmeShyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IC1uXFxuICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgdG9wIDwgazpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHJlcGxhY2VfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBpZnlfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBwb3BfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG5cXG4gICAgaW1wb3J0IGRvY3Rlc3QgIyBwcmFnbWE6IG5vIGNvdmVyXFxuICAgIHByaW50KGRvY3Rlc3QudGVzdG1vZCgpKSAjIHByYWdtYTogbm8gY292ZXJcXG5cIixcInNyYy9saWIvaG1hYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG1hYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hvdHNob3QvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhvdHNob3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sZW50aXR5ZGVmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHRtbGVudGl0eWRlZnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHR0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHR0cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lkbGVsaWIvSWNvbnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkljb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWRsZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lob29rcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWhvb2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1hZ2UuanNcIjpcInZhciBJbWFnZU1vZCwkYnVpbHRpbm1vZHVsZTtJbWFnZU1vZHx8KEltYWdlTW9kPXt9LEltYWdlTW9kLmNhbnZhc0xpYj1bXSksJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImltYWdlXFxcIil9O3JldHVybiBoLkltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxmdW5jdGlvbihhLGIpe3ZhciBjPU1hdGguZmxvb3I7ZT1mdW5jdGlvbihhKXthLndpZHRoPWEuaW1hZ2Uud2lkdGgsYS5oZWlnaHQ9YS5pbWFnZS5oZWlnaHQsYS5kZWxheT0wLGEudXBkYXRlQ291bnQ9MCxhLnVwZGF0ZUludGVydmFsPTEsYS5sYXN0eD0wLGEubGFzdHk9MCxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY3R4LmRyYXdJbWFnZShhLmltYWdlLDAsMCksYS5pbWFnZWRhdGE9YS5jdHguZ2V0SW1hZ2VEYXRhKDAsMCxhLndpZHRoLGEuaGVpZ2h0KX0sYi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKTt0cnl7YS5pbWFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5mZmkucmVtYXBUb0pzKGIpKSxlKGEpfWNhdGNoKGIpe2EuaW1hZ2U9bnVsbH1pZihudWxsPT1hLmltYWdlKXJldHVybiBjPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGMucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYy5kYXRhLmVycm9yKXRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoYy5kYXRhLmVycm9yLm1lc3NhZ2UpfSxjLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oYyxkKXt2YXIgZj1uZXcgSW1hZ2U7Zi5jcm9zc09yaWdpbj1cXFwiXFxcIixmLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKEVycm9yKFxcXCJGYWlsZWQgdG8gbG9hZCBVUkw6IFxcXCIrZi5zcmMpKX0sZi5vbmxvYWQ9ZnVuY3Rpb24oKXthLmltYWdlPXRoaXMsZShhKSxjKCl9LGYuc3JjPWcoYil9KX0sY30pLGc9ZnVuY3Rpb24oYSl7bGV0IGI9U2suZmZpLnJlbWFwVG9KcyhhKTt0cnl7bGV0IGE9U2sucmVhZChiKSxjPWIuc3Vic3RyaW5nKGIubGFzdEluZGV4T2YoXFxcIi5cXFwiKSsxKTtyZXR1cm5gZGF0YTppbWFnZS8ke2N9O2Jhc2U2NCwgJHthfWB9Y2F0Y2goYSl7Y29uc29sZS5sb2coYCR7Yn0gaXMgbm90IGluIHRoZSBkYXRhYmFzZSAke2F9YCl9dmFyIGMsZCxlPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBTay5pbWFnZVByb3h5P1NrLmltYWdlUHJveHk6ZnVuY3Rpb24oYSl7cmV0dXJuIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiYVxcXCIpLGMuaHJlZj1kLHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Yy5ob3N0P2E6U2suaW1hZ2VQcm94eStcXFwiL1xcXCIrYX07cmV0dXJuIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxkPWUoZCksZH0sZj1mdW5jdGlvbihhLGIsYyl7aWYoMD5ifHwwPmN8fGI+PWEud2lkdGh8fGM+PWEuaGVpZ2h0KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlBpeGVsIGluZGV4IG91dCBvZiByYW5nZS5cXFwiKX07dmFyIGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGRlbGF5XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksYS5kZWxheT1Tay5mZmkucmVtYXBUb0pzKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoYyksYS51cGRhdGVJbnRlcnZhbD1kP2Q6MX07Yi5zZXRfZGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldERlbGF5PW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYj0wO2I8YS5pbWFnZS5oZWlnaHQqYS5pbWFnZS53aWR0aDtiKyspZFtiXT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5nZXRQaXhlbCxbYSxiJWEuaW1hZ2Uud2lkdGgsYyhiL2EuaW1hZ2Uud2lkdGgpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfTtiLmdldF9waXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLmdldFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0RGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxnLGgsaixrLGw9W107Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldERhdGFcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkPWIlYS5pbWFnZS53aWR0aCxlPWMoYi9hLmltYWdlLndpZHRoKSxmKGEsZCxlKSxrPTQqZSphLndpZHRoKzQqZCxnPWEuaW1hZ2VkYXRhLmRhdGFba10saD1hLmltYWdlZGF0YS5kYXRhW2srMV0saj1hLmltYWdlZGF0YS5kYXRhW2srMl0sbFtiXT1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhnKSxuZXcgU2suYnVpbHRpbi5pbnRfKGgpLG5ldyBTay5idWlsdGluLmludF8oaildKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGcsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksaT00KmMqYS53aWR0aCs0KmIsZD1hLmltYWdlZGF0YS5kYXRhW2ldLGc9YS5pbWFnZWRhdGEuZGF0YVtpKzFdLGU9YS5pbWFnZWRhdGEuZGF0YVtpKzJdLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShoLlBpeGVsLFtkLGcsZSxiLGNdKX07Yi5nZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLmdldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMoayksZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGQucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZC5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGQpe3ZhciBlPU1hdGgubWF4LGY9TWF0aC5hYnMsZz1NYXRoLm1pbjthLnVwZGF0ZUNvdW50KyssMD09YS51cGRhdGVDb3VudCVhLnVwZGF0ZUludGVydmFsPyhhLmxhc3R4K2EudXBkYXRlSW50ZXJ2YWw+PWEud2lkdGg/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LDAsYS5sYXN0eSxhLndpZHRoLDIpOmEubGFzdHkrYS51cGRhdGVJbnRlcnZhbD49YS5oZWlnaHQ/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LGEubGFzdHgsMCwyLGEuaGVpZ2h0KTphLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksZyhiLGEubGFzdHgpLGcoYyxhLmxhc3R5KSxlKGYoYi1hLmxhc3R4KSwxKSxlKGYoYy1hLmxhc3R5KSwxKSksYS5sYXN0eD1iLGEubGFzdHk9YywwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZCxhLmRlbGF5KTpkKCkpOmQoKX0pfSxkfTt2YXIgbD1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsNCw0KSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksZz00KmMqYS53aWR0aCs0KmIsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGIsYyl9O2Iuc2V0X3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5zZXRQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGwpO3ZhciBtPWZ1bmN0aW9uKGEsYixlKXt2YXIgZyxoLGk7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHBpeGVsYXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGc9YiVhLmltYWdlLndpZHRoLGg9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxnLGgpLGk9NCpoKmEud2lkdGgrNCpnLGEuaW1hZ2VkYXRhLmRhdGFbaV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0UmVkLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRHcmVlbixbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0Qmx1ZSxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krM109MjU1LGQoYSxnLGgpfTtiLnNldF9waXhlbF9hdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pLGIuc2V0UGl4ZWxBdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pO3ZhciBuPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1cGRhdGVwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGM9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WCxbYl0pKSxlPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFksW2JdKSksZihhLGMsZSksZz00KmUqYS53aWR0aCs0KmMsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRSZWQsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEdyZWVuLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRCbHVlLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGMsZSl9O2IudXBkYXRlX3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobiksYi51cGRhdGVQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKG4pO3ZhciBvPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRoZWlnaHRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEuaGVpZ2h0KX07Yi5nZXRfaGVpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMobyksYi5nZXRIZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKTt2YXIgcD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0d2lkdGhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEud2lkdGgpfTtiLmdldF93aWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuZ2V0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhwKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLndpZHRoKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1ifHxcXFwid2lkdGhcXFwiPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIkNhbm5vdCBjaGFuZ2UgaGVpZ2h0IG9yIHdpZHRoIHRoZXkgY2FuIG9ubHkgYmUgc2V0IG9uIGNyZWF0aW9uXFxcIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIlVua25vd24gYXR0cmlidXRlOiBcXFwiK2IpfSksYi5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImRyYXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxlPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3ZhciBmLGc7Yj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRXaW4sW2JdKSxnPWYuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSx2b2lkIDA9PT1jJiYoYz0wLGQ9MCksYS5sYXN0VWx4PWMsYS5sYXN0VWx5PWQsYS5sYXN0Q3R4PWcsZy5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYyxkKSwwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZSxhLmRlbGF5KTp3aW5kb3cuc2V0VGltZW91dChlLDIwMCl9KX0sZX0pfSxcXFwiSW1hZ2VcXFwiLFtdKSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGEud2lkdGg9U2suYnVpbHRpbi5hc251bSQoYiksYS5oZWlnaHQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYS5jdHg9YS5jYW52YXMuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSl9LGguRW1wdHlJbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYyxcXFwiRW1wdHlJbWFnZVxcXCIsW2guSW1hZ2VdKSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUsYixmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDYpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEuZ3JlZW49U2suYnVpbHRpbi5hc251bSQoZCksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKSxhLnk9U2suYnVpbHRpbi5hc251bSQoZil9KTt2YXIgYz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cmVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnJlZCl9O2IuZ2V0X3JlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGIuZ2V0UmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyk7dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKX07Yi5nZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKSxiLmdldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZCk7dmFyIGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuYmx1ZSl9O2IuZ2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxiLmdldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKTt2YXIgZj1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS54KX07Yi5nZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpLGIuZ2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR5XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnkpfTtiLmdldF95PW5ldyBTay5idWlsdGluLmZ1bmMoZyksYi5nZXRZPW5ldyBTay5idWlsdGluLmZ1bmMoZyk7dmFyIGg9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnJlZD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoaCksYi5zZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKTt2YXIgaT1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSxjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRibHVlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGMpfTtiLnNldF9ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5zZXRCbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwicmVkXFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS5yZWQpOlxcXCJncmVlblxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ncmVlbik6XFxcImJsdWVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEuYmx1ZSk6dm9pZCAwfSksYi5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksKFxcXCJyZWRcXFwiPT09Ynx8XFxcImdyZWVuXFxcIj09PWJ8fFxcXCJibHVlXFxcIj09PWIpJiYoYVtiXT1Tay5idWlsdGluLmFzbnVtJChjKSl9KTt2YXIgaz1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLng9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLnNldFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKTt2YXIgbD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnk9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLl9fZ2V0aXRlbV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5idWlsdGluLmFzbnVtJChiKSwwPT09Yik/YS5yZWQ6MT09Yj9hLmdyZWVuOjI9PWI/YS5ibHVlOnZvaWQgMH0pLGIuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCJbXFxcIithLnJlZCtcXFwiLFxcXCIrYS5ncmVlbitcXFwiLFxcXCIrYS5ibHVlK1xcXCJdXFxcIil9KSxiLmdldENvbG9yVHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLGIuc2V0UmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2EubWF4PVNrLmJ1aWx0aW4uYXNudW0kKGIpfSl9LGguUGl4ZWw9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGIsXFxcIlBpeGVsXFxcIixbXSksYT1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksZD1JbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXSx2b2lkIDA9PT1kPyhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKSxhLnRoZVNjcmVlbj1lLGYuYXBwZW5kQ2hpbGQoZSksSW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc109ZSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1hLnRoZVNjcmVlbik6KGEudGhlU2NyZWVuPWQsYS50aGVTY3JlZW4uaGVpZ2h0PWEudGhlU2NyZWVuLmhlaWdodCksdm9pZCAwPT09Yj8oU2suYXZhaWxhYmxlSGVpZ2h0JiYoYS50aGVTY3JlZW4uaGVpZ2h0PVNrLmF2YWlsYWJsZUhlaWdodCksU2suYXZhaWxhYmxlV2lkdGgmJihhLnRoZVNjcmVlbi53aWR0aD1Tay5hdmFpbGFibGVXaWR0aCkpOihhLnRoZVNjcmVlbi5oZWlnaHQ9Yy52LGEudGhlU2NyZWVuLndpZHRoPWIudiksYS50aGVTY3JlZW4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwifSksYi5nZXRXaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYS50aGVTY3JlZW59KSxiLmV4aXRvbmNsaWNrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVTY3JlZW4uaWQ7YS50aGVTY3JlZW4ub25jbGljaz1mdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLm9uY2xpY2s9bnVsbCxkZWxldGUgSW1hZ2VNb2QuY2FudmFzTGliW2JdfX0pfSxoLkltYWdlV2luPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxhLFxcXCJJbWFnZVdpblxcXCIsW10pLGh9O1wiLFwic3JjL2xpYi9pbWFwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWFwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1naGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWdoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbXB1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbXB1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaXRlcnRvb2xzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjb21iaW5hdGlvbnNOZXcoYSxiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoYS50cCRuYW1lLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hKXJldHVybiBuZXcgYS5jb25zdHJ1Y3RvcihmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb25zdHJ1Y3Rvci5jYWxsKGIsZixlKSxifX12YXIgYT17fTtyZXR1cm4gYS5hY2N1bXVsYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmFjY3VtdWxhdGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhY2N1bXVsYXRlKGEsYixjKXt0aGlzLml0ZXI9YSx0aGlzLmZ1bmM9Yix0aGlzLnRvdGFsPWMsdGhpcy50cCRpdGVybmV4dD0oKT0+KHRoaXMudG90YWw9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy50b3RhbCk/dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk6dGhpcy50b3RhbCx0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMudG90YWwpfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIHRoaXMudG90YWw9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxbdGhpcy50b3RhbCxhXSksdGhpcy50b3RhbH0sc2xvdHM6e3RwJGRvYzpcXFwiYWNjdW11bGF0ZShpdGVyYWJsZVssIGZ1bmMsIGluaXRpYWxdKSAtLT4gYWNjdW11bGF0ZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHNlcmllcyBvZiBhY2N1bXVsYXRlZCBzdW1zIChvciBvdGhlciBiaW5hcnkgZnVuY3Rpb24gcmVzdWx0cykuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImFjY3VtdWxhdGVcXFwiLGIsMCwyKTtsZXRbZCxlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJhY2N1bXVsYXRlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwiZnVuY1xcXCIsXFxcImluaXRpYWxcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZihkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9uZXcgU2suYnVpbHRpbi5mdW5jKChjLGEpPT5Tay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpKTplLHRoaXM9PT1hLmFjY3VtdWxhdGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5hY2N1bXVsYXRlKGQsZSxmKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuYWNjdW11bGF0ZS5jYWxsKGIsZCxlLGYpLGJ9fX19KSxhLmNoYWluPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNoYWluXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY2hhaW4oYSl7dGhpcy5pdGVyYWJsZXM9YSx0aGlzLmN1cnJlbnRfaXQ9bnVsbCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLmN1cnJlbnRfaXQ9dGhpcy5pdGVyYWJsZXMudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJlbnRfaXQpP3ZvaWQodGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwKToodGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KSx0aGlzLnRwJGl0ZXJuZXh0KCkpfSxpdGVybmV4dCgpe2ZvcihsZXQgYTt2b2lkIDA9PT1hOylpZihhPXRoaXMuY3VycmVudF9pdC50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpe2lmKHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdClyZXR1cm4gdm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApO3RoaXMuY3VycmVudF9pdD1Tay5hYnN0ci5pdGVyKHRoaXMuY3VycmVudF9pdCl9ZWxzZSByZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiY2hhaW4oKml0ZXJhYmxlcykgLS0+IGNoYWluIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjaGFpbiBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGVcXFxcbmZpcnN0IGl0ZXJhYmxlIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgdGhlbiBlbGVtZW50cyBmcm9tIHRoZSBuZXh0XFxcXG5pdGVyYWJsZSwgdW50aWwgYWxsIG9mIHRoZSBpdGVyYWJsZXMgYXJlIGV4aGF1c3RlZC5cXFwiLHRwJG5ldyhiLGMpe2lmKFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImNoYWluXFxcIixjKSxiPW5ldyBTay5idWlsdGluLnR1cGxlKGIuc2xpY2UoMCkpLnRwJGl0ZXIoKSx0aGlzPT09YS5jaGFpbi5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNoYWluKGIpO2Vsc2V7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jaGFpbi5jYWxsKGMsYiksY319fSxjbGFzc21ldGhvZHM6e2Zyb21faXRlcmFibGU6eyRtZXRoKGIpe2NvbnN0IGM9U2suYWJzdHIuaXRlcihiKTtyZXR1cm4gbmV3IGEuY2hhaW4oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlxcXCJjaGFpbi5mcm9tX2l0ZXJhYmxlKGl0ZXJhYmxlKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcbkFsdGVybmF0ZSBjaGFpbigpIGNvbnN0cnVjdG9yIHRha2luZyBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudFxcXFxudGhhdCBldmFsdWF0ZXMgbGF6aWx5LlxcXCIsJHRleHRzaWc6bnVsbH19fSksYS5jb21iaW5hdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWIsdGhpcy5pbmRpY2VzPUFycmF5KGIpLmZpbGwoKS5tYXAoKGEsYik9PmIpLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7bGV0IGEsYj0hMTtmb3IoYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmluZGljZXNbYV0hPWErdGhpcy5uLXRoaXMucil7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7dGhpcy5pbmRpY2VzW2FdKys7Zm9yKGxldCBiPWErMTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPXRoaXMuaW5kaWNlc1tiLTFdKzE7Y29uc3QgYz10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnMoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbmNvbWJpbmF0aW9ucyhyYW5nZSg0KSwgMykgLS0+ICgwLDEsMiksICgwLDEsMyksICgwLDIsMyksICgxLDIsMylcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zLnByb3RvdHlwZSxiLGMpfX19KSxhLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgwKSx0aGlzLm49YS5sZW5ndGgsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCF0aGlzLnJ8fHRoaXMubil7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9dGhpcy5uLTEpe2I9ITA7YnJlYWt9aWYoIWIpcmV0dXJuIHZvaWQodGhpcy5yPTApO2NvbnN0IGM9dGhpcy5pbmRpY2VzW2FdKzE7Zm9yKGxldCBiPWE7Yjx0aGlzLnI7YisrKXRoaXMuaW5kaWNlc1tiXT1jO2NvbnN0IGQ9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZVxcXFxuYWxsb3dpbmcgaW5kaXZpZHVhbCBlbGVtZW50cyB0byBoYXZlIHN1Y2Nlc3NpdmUgcmVwZWF0cy5cXFxcbmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSAtLT4gQUEgQUIgQUMgQkIgQkMgQ0NcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tcHJlc3M9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tcHJlc3NcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21wcmVzcyhhLGIpe3RoaXMuZGF0YT1hLHRoaXMuc2VsZWN0b3JzPWJ9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwIT09Yjspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gYTthPXRoaXMuZGF0YS50cCRpdGVybmV4dCgpLGI9dGhpcy5zZWxlY3RvcnMudHAkaXRlcm5leHQoKX19LHNsb3RzOnt0cCRkb2M6XFxcImNvbXByZXNzKGRhdGEsIHNlbGVjdG9ycykgLS0+IGl0ZXJhdG9yIG92ZXIgc2VsZWN0ZWQgZGF0YVxcXFxuXFxcXG5SZXR1cm4gZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRydWUgc2VsZWN0b3IgZWxlbWVudHMuXFxcXG5Gb3JtcyBhIHNob3J0ZXIgaXRlcmF0b3IgZnJvbSBzZWxlY3RlZCBkYXRhIGVsZW1lbnRzIHVzaW5nIHRoZVxcXFxuc2VsZWN0b3JzIHRvIGNob29zZSB0aGUgZGF0YSBlbGVtZW50cy5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvbXByZXNzXFxcIixbXFxcImRhdGFcXFwiLFxcXCJzZWxlY3RvcnNcXFwiXSxiLGMsW10pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmFic3RyLml0ZXIoZSksdGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb21wcmVzcyhkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb21wcmVzcy5jYWxsKGIsZCxlKSxifX19fSksYS5jb3VudD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb3VudFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvdW50KGEsYil7dGhpcy5zdGFydD1hLHRoaXMuc3RlcD1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5zdGFydDtyZXR1cm4gdGhpcy5zdGFydD1Tay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLnN0YXJ0LHRoaXMuc3RlcCxcXFwiQWRkXFxcIiksYX0sc2xvdHM6e3RwJGRvYzpcXFwiY291bnQoc3RhcnQ9MCwgc3RlcD0xKSAtLT4gY291bnQgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNvdW50IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBjb25zZWN1dGl2ZSB2YWx1ZXMuXFxcXG5FcXVpdmFsZW50IHRvOlxcXFxuXFxcXG4gICAgZGVmIGNvdW50KGZpcnN0dmFsPTAsIHN0ZXA9MSk6XFxcXG4gICAgICAgIHggPSBmaXJzdHZhbFxcXFxuICAgICAgICB3aGlsZSAxOlxcXFxuICAgICAgICAgICAgeWllbGQgeFxcXFxuICAgICAgICAgICAgeCArPSBzdGVwXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvdW50XFxcIixbXFxcInN0YXJ0XFxcIixcXFwic3RlcFxcXCJdLGIsYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYodGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb3VudChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb3VudC5jYWxsKGIsZCxlKSxifX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCk7bGV0IGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBiPVxcXCIxXFxcIj09PWI/XFxcIlxcXCI6XFxcIiwgXFxcIitiLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStiK1xcXCIpXFxcIil9fX0pLGEuY3ljbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY3ljbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjeWNsZShhKXt0aGlzLml0ZXI9YSx0aGlzLnNhdmVkPVtdLHRoaXMuY29uc3VtZWQ9ITEsdGhpcy5pPTAsdGhpcy5sZW5ndGh9LGl0ZXJuZXh0KCl7bGV0IGE7aWYoIXRoaXMuY29uc3VtZWQpe2lmKGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09YSlyZXR1cm4gdGhpcy5zYXZlZC5wdXNoKGEpLGE7aWYodGhpcy5jb25zdW1lZD0hMCx0aGlzLmxlbmd0aD10aGlzLnNhdmVkLmxlbmd0aCwhdGhpcy5sZW5ndGgpcmV0dXJufXJldHVybiBhPXRoaXMuc2F2ZWRbdGhpcy5pXSx0aGlzLmk9KHRoaXMuaSsxKSV0aGlzLmxlbmd0aCxhfSxzbG90czp7dHAkZG9jOlxcXCJjeWNsZShpdGVyYWJsZSkgLS0+IGN5Y2xlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLlxcXFxuVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKFxcXCJjeWNsZVxcXCIsYixjKTtjb25zdCBkPVNrLmFic3RyLml0ZXIoYlswXSk7aWYodGhpcz09PWEuY3ljbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5jeWNsZShkKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY3ljbGUuY2FsbChiLGQpLGJ9fX19KSxhLmRyb3B3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5kcm9wd2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkcm9wd2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1iLHRoaXMucGFzc2VkfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwPT09dGhpcy5wYXNzZWQmJnZvaWQgMCE9PWE7KXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO2lmKCFTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIHRoaXMucGFzc2VkPSEwLGE7YT10aGlzLml0ZXIudHAkaXRlcm5leHQoKX1yZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiZHJvcHdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiBkcm9wd2hpbGUgb2JqZWN0XFxcXG5cXFxcbkRyb3AgaXRlbXMgZnJvbSB0aGUgaXRlcmFibGUgd2hpbGUgcHJlZGljYXRlKGl0ZW0pIGlzIHRydWUuXFxcXG5BZnRlcndhcmRzLCByZXR1cm4gZXZlcnkgZWxlbWVudCB1bnRpbCB0aGUgaXRlcmFibGUgaXMgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiZHJvcHdoaWxlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImRyb3B3aGlsZVxcXCIsYiwyLDIpO2NvbnN0IGQ9YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZHJvcHdoaWxlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZHJvcHdoaWxlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmRyb3B3aGlsZS5jYWxsKGIsZCxlKSxifX19fSksYS5maWx0ZXJmYWxzZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5maWx0ZXJmYWxzZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGZpbHRlcmZhbHNlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXtmb3IobGV0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7U2subWlzY2V2YWwuaXNUcnVlKGIpOyl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDA9PT1hKXJldHVybjtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pfXJldHVybiBhfX0sc2xvdHM6e3RwJGRvYzpcXFwiZmlsdGVyZmFsc2UoZnVuY3Rpb24gb3IgTm9uZSwgc2VxdWVuY2UpIC0tPiBmaWx0ZXJmYWxzZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHRob3NlIGl0ZW1zIG9mIHNlcXVlbmNlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKSBpcyBmYWxzZS5cXFxcbklmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgZmFsc2UuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYiwyLDIpO2NvbnN0IGQ9U2suYnVpbHRpbi5jaGVja05vbmUoYlswXSk/U2suYnVpbHRpbi5ib29sOmJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLmZpbHRlcmZhbHNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZmlsdGVyZmFsc2UoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZmlsdGVyZmFsc2UuY2FsbChiLGQsZSksYn19fX0pLGEuX2dyb3VwZXI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuX2dyb3VwZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZ3JvdXBlcihhKXt0aGlzLmdyb3VwYnk9YSx0aGlzLnRndGtleT1hLnRndGtleSx0aGlzLmlkPWEuaWR9LGl0ZXJuZXh0KCl7Y29uc3QgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5ncm91cGJ5LmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIik7aWYodGhpcy5ncm91cGJ5LmlkPT09dGhpcy5pZCYmYSl7bGV0IGE9dGhpcy5ncm91cGJ5LmN1cnJ2YWw7cmV0dXJuIHRoaXMuZ3JvdXBieS5jdXJydmFsPXRoaXMuZ3JvdXBieS5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09dGhpcy5ncm91cGJ5LmN1cnJ2YWwmJih0aGlzLmdyb3VwYnkuY3VycmtleT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5ncm91cGJ5LmtleWYsW3RoaXMuZ3JvdXBieS5jdXJydmFsXSkpLGF9fX0pLGEuZ3JvdXBieT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5ncm91cGJ5XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZ3JvdXBieShhLGIpe3RoaXMuaXRlcj1hLHRoaXMua2V5Zj1iLHRoaXMuY3VycnZhbCx0aGlzLmN1cnJrZXk9dGhpcy50Z3RrZXk9bmV3IFNrLmJ1aWx0aW4ub2JqZWN0LHRoaXMuaWR9LGl0ZXJuZXh0KCl7dGhpcy5pZD17fTtmb3IobGV0IGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTthOyl7aWYodGhpcy5jdXJydmFsPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycnZhbClyZXR1cm47dGhpcy5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmtleWYsW3RoaXMuY3VycnZhbF0pLGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKX10aGlzLnRndGtleT10aGlzLmN1cnJrZXk7Y29uc3QgYj1uZXcgYS5fZ3JvdXBlcih0aGlzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuY3VycmtleSxiXSl9LHNsb3RzOnt0cCRkb2M6XFxcImdyb3VwYnkoaXRlcmFibGUsIGtleT1Ob25lKSAtPiBtYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBjb25zZWN1dGl2ZVxcXFxua2V5cyBhbmQgZ3JvdXBzIGZyb20gdGhlIGl0ZXJhYmxlLiAgSWYgdGhlIGtleSBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yXFxcXG5pcyBOb25lLCB0aGUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBmb3IgZ3JvdXBpbmcuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImdyb3VwYnlcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJrZXlcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoYT0+YSk6ZSx0aGlzPT09YS5ncm91cGJ5LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZ3JvdXBieShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5ncm91cGJ5LmNhbGwoYixkLGUpLGJ9fX19KSxhLmlzbGljZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5pc2xpY2VcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBpc2xpY2UoYSxiLGMsZCl7dGhpcy5pdGVyPWEsdGhpcy5wcmV2aXQ9Yix0aGlzLnN0b3A9Yyx0aGlzLnN0ZXA9ZCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYodGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLnByZXZpdD49dGhpcy5zdG9wKXtmb3IobGV0IGE9MDthPHRoaXMuc3RvcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT0wO2E8dGhpcy5wcmV2aXQ7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybiB0aGlzLml0ZXIudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0KCl7aWYodGhpcy5wcmV2aXQrdGhpcy5zdGVwPj10aGlzLnN0b3Ape2ZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5zdG9wO2ErKyl0aGlzLnByZXZpdCs9dGhpcy5zdGVwLHRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybn1mb3IobGV0IGE9dGhpcy5wcmV2aXQrMTthPHRoaXMucHJldml0K3RoaXMuc3RlcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9LHNsb3RzOnt0cCRkb2M6XFxcImlzbGljZShpdGVyYWJsZSwgc3RvcCkgLS0+IGlzbGljZSBvYmplY3RcXFxcbmlzbGljZShpdGVyYWJsZSwgc3RhcnQsIHN0b3BbLCBzdGVwXSkgLS0+IGlzbGljZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGFuIGl0ZXJhdG9yIHdob3NlIG5leHQoKSBtZXRob2QgcmV0dXJucyBzZWxlY3RlZCB2YWx1ZXMgZnJvbSBhblxcXFxuaXRlcmFibGUuICBJZiBzdGFydCBpcyBzcGVjaWZpZWQsIHdpbGwgc2tpcCBhbGwgcHJlY2VkaW5nIGVsZW1lbnRzO1xcXFxub3RoZXJ3aXNlLCBzdGFydCBkZWZhdWx0cyB0byB6ZXJvLiAgU3RlcCBkZWZhdWx0cyB0byBvbmUuICBJZlxcXFxuc3BlY2lmaWVkIGFzIGFub3RoZXIgdmFsdWUsIHN0ZXAgZGV0ZXJtaW5lcyBob3cgbWFueSB2YWx1ZXMgYXJlIFxcXFxuc2tpcHBlZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMuICBXb3JrcyBsaWtlIGEgc2xpY2UoKSBvbiBhIGxpc3RcXFxcbmJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLlxcXCIsdHAkbmV3KGIsYyl7dmFyIGQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXNsaWNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzbGljZVxcXCIsYiwyLDQpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihiWzBdKTtsZXQgZj1iWzFdLGc9YlsyXSxoPWJbM107aWYodm9pZCAwPT09Zz8oZz1mLGY9U2suYnVpbHRpbi5ub25lLm5vbmUkLGg9U2suYnVpbHRpbi5ub25lLm5vbmUkKTp2b2lkIDA9PT1oJiYoaD1Tay5idWlsdGluLm5vbmUubm9uZSQpLCEoU2suYnVpbHRpbi5jaGVja05vbmUoZyl8fFNrLm1pc2NldmFsLmlzSW5kZXgoZykpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7ZWxzZSBpZihnPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGcpP2Q6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGcpLDA+Z3x8Zz5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7aWYoIShTay5idWlsdGluLmNoZWNrTm9uZShmKXx8U2subWlzY2V2YWwuaXNJbmRleChmKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGY9U2suYnVpbHRpbi5jaGVja05vbmUoZik/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZiksMD5mfHxmPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpfHxTay5taXNjZXZhbC5pc0luZGV4KGgpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lXFxcIik7ZWxzZSBpZihoPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGgpLDA+PWh8fGg+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lLlxcXCIpO2lmKHRoaXM9PT1hLmlzbGljZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmlzbGljZShlLGYsZyxoKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuaXNsaWNlLmNhbGwoYixlLGYsZyxoKSxifX19fSksYS5wZXJtdXRhdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucGVybXV0YXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcGVybXV0YXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWI7Y29uc3QgYz1hLmxlbmd0aDt0aGlzLmluZGljZXM9QXJyYXkoYykuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5jeWNsZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+Yy1iKSx0aGlzLm49Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7Zm9yKGxldCBhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuY3ljbGVzW2FdLS0sMD09dGhpcy5jeWNsZXNbYV0pdGhpcy5pbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLnNwbGljZShhLDEpWzBdKSx0aGlzLmN5Y2xlc1thXT10aGlzLm4tYTtlbHNle2o9dGhpcy5jeWNsZXNbYV0sW3RoaXMuaW5kaWNlc1thXSx0aGlzLmluZGljZXNbdGhpcy5uLWpdXT1bdGhpcy5pbmRpY2VzW3RoaXMubi1qXSx0aGlzLmluZGljZXNbYV1dO2NvbnN0IGI9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pLnNsaWNlKDAsdGhpcy5yKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhpcy5yPTB9LHNsb3RzOnt0cCRkb2M6XFxcInBlcm11dGF0aW9ucyhpdGVyYWJsZVssIHJdKSAtLT4gcGVybXV0YXRpb25zIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBwZXJtdXRhdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxcXFxuXFxcXG5wZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSwgKDAsMiksICgxLDApLCAoMSwyKSwgKDIsMCksICgyLDEpXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO1tkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwZXJtdXRhdGlvbnNcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/Zi5sZW5ndGg6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hLnBlcm11dGF0aW9ucy5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnBlcm11dGF0aW9ucyhmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wZXJtdXRhdGlvbnMuY2FsbChiLGYsZSksYn19fX0pLGEucHJvZHVjdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wcm9kdWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcHJvZHVjdChhKXt0aGlzLnBvb2xzPWEsdGhpcy5uPWEubGVuZ3RoLHRoaXMuaW5kaWNlcz1BcnJheShhLmxlbmd0aCkuZmlsbCgwKSx0aGlzLnBvb2xfc2l6ZXM9YS5tYXAoYT0+YS5sZW5ndGgpLHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcCgoYSxiKT0+dGhpcy5wb29sc1tiXVt0aGlzLmluZGljZXNbYl1dKTtyZXR1cm4gYS5zb21lKGE9PnZvaWQgMD09PWEpP3ZvaWQodGhpcy5uPTApOm5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5uLTE7MDw9YSYmYTx0aGlzLm47KXRoaXMuaW5kaWNlc1thXSsrLHRoaXMuaW5kaWNlc1thXT49dGhpcy5wb29sX3NpemVzW2FdPyh0aGlzLmluZGljZXNbYV09LTEsYS0tKTphKys7aWYoIXRoaXMubnx8dGhpcy5pbmRpY2VzLmV2ZXJ5KGE9Pi0xPT09YSkpcmV0dXJuIHZvaWQodGhpcy5uPTApO2Vsc2V7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19LHNsb3RzOnt0cCRkb2M6XFxcInByb2R1Y3QoKml0ZXJhYmxlcywgcmVwZWF0PTEpIC0tPiBwcm9kdWN0IG9iamVjdFxcXFxuXFxcXG5DYXJ0ZXNpYW4gcHJvZHVjdCBvZiBpbnB1dCBpdGVyYWJsZXMuICBFcXVpdmFsZW50IHRvIG5lc3RlZCBmb3ItbG9vcHMuXFxcXG5cXFxcbkZvciBleGFtcGxlLCBwcm9kdWN0KEEsIEIpIHJldHVybnMgdGhlIHNhbWUgYXM6ICAoKHgseSkgZm9yIHggaW4gQSBmb3IgeSBpbiBCKS5cXFxcblRoZSBsZWZ0bW9zdCBpdGVyYXRvcnMgYXJlIGluIHRoZSBvdXRlcm1vc3QgZm9yLWxvb3AsIHNvIHRoZSBvdXRwdXQgdHVwbGVzXFxcXG5jeWNsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGFuIG9kb21ldGVyICh3aXRoIHRoZSByaWdodG1vc3QgZWxlbWVudCBjaGFuZ2luZ1xcXFxub24gZXZlcnkgaXRlcmF0aW9uKS5cXFxcblxcXFxuVG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiBhbiBpdGVyYWJsZSB3aXRoIGl0c2VsZiwgc3BlY2lmeSB0aGUgbnVtYmVyXFxcXG5vZiByZXBldGl0aW9ucyB3aXRoIHRoZSBvcHRpb25hbCByZXBlYXQga2V5d29yZCBhcmd1bWVudC4gRm9yIGV4YW1wbGUsXFxcXG5wcm9kdWN0KEEsIHJlcGVhdD00KSBtZWFucyB0aGUgc2FtZSBhcyBwcm9kdWN0KEEsIEEsIEEsIEEpLlxcXFxuXFxcXG5wcm9kdWN0KCdhYicsIHJhbmdlKDMpKSAtLT4gKCdhJywwKSAoJ2EnLDEpICgnYScsMikgKCdiJywwKSAoJ2InLDEpICgnYicsMilcXFxcbnByb2R1Y3QoKDAsMSksICgwLDEpLCAoMCwxKSkgLS0+ICgwLDAsMCkgKDAsMCwxKSAoMCwxLDApICgwLDEsMSkgKDEsMCwwKSAuLi5cXFwiLHRwJG5ldyhiLGMpe2xldFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicHJvZHVjdFxcXCIsW1xcXCJyZXBlYXRcXFwiXSxbXSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlXFxcIik7Y29uc3QgZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYlthXSkpO2NvbnN0IGY9W10uY29uY2F0KC4uLkFycmF5KGQpLmZpbGwoZSkpO2lmKHRoaXM9PT1hLnByb2R1Y3QucHJvdG90eXBlKXJldHVybiBuZXcgYS5wcm9kdWN0KGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wcm9kdWN0LmNhbGwoYixmKSxifX19fSksYS5yZXBlYXQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucmVwZWF0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcmVwZWF0KGEsYil7dGhpcy5vYmplY3Q9YSx0aGlzLnRpbWVzPWIsdm9pZCAwPT09YiYmKHRoaXMudHAkaXRlcm5leHQ9KCk9PnRoaXMub2JqZWN0KX0saXRlcm5leHQoKXtyZXR1cm4gMDx0aGlzLnRpbWVzLS0/dGhpcy5vYmplY3Q6dm9pZCAwfSxzbG90czp7dHAkZG9jOlxcXCJyZXBlYXQob2JqZWN0IFssdGltZXNdKSAtPiBjcmVhdGUgYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgb2JqZWN0XFxcXG5mb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuICBJZiBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmVuZGxlc3NseS5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInJlcGVhdFxcXCIsW1xcXCJvYmplY3RcXFwiLFxcXCJ0aW1lc1xcXCJdLGIsYyxbbnVsbF0pLGU9bnVsbD09PWU/dm9pZCAwOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksdGhpcz09PWEucmVwZWF0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucmVwZWF0KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnJlcGVhdC5jYWxsKGIsZCxlKSxifX0sJHIoKXtyZXR1cm4gb2JqZWN0X3JlcHI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm9iamVjdCksdGltZXNfcmVwcj12b2lkIDA9PT10aGlzLnRpbWVzP1xcXCJcXFwiOlxcXCIsIFxcXCIrKDA8PXRoaXMudGltZXM/dGhpcy50aW1lczowKSxuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK29iamVjdF9yZXByK3RpbWVzX3JlcHIrXFxcIilcXFwiKX19LG1ldGhvZHM6e19fbGVuZ2h0X2hpbnRfXzp7JG1ldGgoKXtpZih2b2lkIDA9PT10aGlzLnRpbWVzKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibGVuKCkgb2YgdW5zaXplZCBvYmplY3RcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnRpbWVzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGx9fX0pLGEuc3Rhcm1hcD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5zdGFybWFwXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gc3Rhcm1hcChhLGIpe3RoaXMuZnVuYz1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09YSlyZXR1cm47Y29uc3QgYj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSxjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmZ1bmMsYik7cmV0dXJuIGN9LHNsb3RzOnt0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJzdGFybWFwXFxcIixbXFxcImZ1bmNcXFwiLFxcXCJpdGVyYWJsZVxcXCJdLGIsYyxbXSksZT1Tay5hYnN0ci5pdGVyKGUpLGQ9U2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2suYnVpbHRpbi5ib29sOmQsdGhpcz09PWEuc3Rhcm1hcC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnN0YXJtYXAoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuc3Rhcm1hcC5jYWxsKGIsZCxlKSxifX19fSksYS50YWtld2hpbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMudGFrZXdoaWxlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gdGFrZXdoaWxlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO3RoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMH19LHNsb3RzOnt0cCRkb2M6XFxcInRha2V3aGlsZShwcmVkaWNhdGUsIGl0ZXJhYmxlKSAtLT4gdGFrZXdoaWxlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGZyb20gYW4gaXRlcmFibGUgYXMgbG9uZyBhcyB0aGUgXFxcXG5wcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgZm9yIGVhY2ggZW50cnkuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJ0YWtld2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidGFrZXdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS50YWtld2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS50YWtld2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEudGFrZXdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRlZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9KSxhLnppcF9sb25nZXN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnppcF9sb25nZXN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gemlwX2xvbmdlc3QoYSxiKXt0aGlzLml0ZXJzPWEsdGhpcy5maWxsdmFsdWU9Yix0aGlzLmFjdGl2ZT10aGlzLml0ZXJzLmxlbmd0aH0saXRlcm5leHQoKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuO2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDx0aGlzLml0ZXJzLmxlbmd0aDtkKyspe2lmKGI9dGhpcy5pdGVyc1tkXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PWIpe2lmKHRoaXMuYWN0aXZlLS0sIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLml0ZXJzW2RdPW5ldyBhLnJlcGVhdCh0aGlzLmZpbGx2YWx1ZSksYj10aGlzLmZpbGx2YWx1ZX1jLnB1c2goYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJ6aXBfbG9uZ2VzdChpdGVyMSBbLGl0ZXIyIFsuLi5dXSwgW2ZpbGx2YWx1ZT1Ob25lXSkgLS0+IHppcF9sb25nZXN0IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSB6aXBfbG9uZ2VzdCBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgYSB0dXBsZSB3aGVyZVxcXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBsb25nZXN0IGl0ZXJhYmxlIGluIHRoZSBhcmd1bWVudCBzZXF1ZW5jZVxcXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLiAgV2hlbiB0aGUgc2hvcnRlciBpdGVyYWJsZXNcXFxcbmFyZSBleGhhdXN0ZWQsIHRoZSBmaWxsdmFsdWUgaXMgc3Vic3RpdHV0ZWQgaW4gdGhlaXIgcGxhY2UuICBUaGUgZmlsbHZhbHVlXFxcXG5kZWZhdWx0cyB0byBOb25lIG9yIGNhbiBiZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkIGFyZ3VtZW50LlxcXFxuXFxcIix0cCRuZXcoYixjKXtjb25zdFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiemlwX2xvbmdlc3RcXFwiLFtcXFwiZmlsbHZhbHVlXFxcIl0sW10sYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2suYWJzdHIuaXRlcihiW2FdKSk7aWYodGhpcz09PWEuemlwX2xvbmdlc3QucHJvdG90eXBlKXJldHVybiBuZXcgYS56aXBfbG9uZ2VzdChlLGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS56aXBfbG9uZ2VzdC5jYWxsKGIsZSxkKSxifX19fSksYS5fX2RvY19fPW5ldyBTay5idWlsdGluLnN0cihcXFwiQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHB5dGhvbiBpdGVydG9vbHMgbW9kdWxlIGluIFNrdWxwdFxcXCIpLGEuX19wYWNrYWdlX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKSxhfTtcIixcInNyYy9saWIvanNvbi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiZHVtcHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGY9bmV3IFNrLmJ1aWx0aW5zLmRpY3QoYSksZz0hMTtyZXR1cm4gYj17YXNjaWk6ITAsc2VwYXJhdG9yczp7aXRlbV9zZXBhcmF0b3I6XFxcIiwgXFxcIixrZXlfc2VwYXJhdG9yOlxcXCI6IFxcXCJ9fSxmPVNrLmZmaS5yZW1hcFRvSnMoZiksYz1Tay5mZmkucmVtYXBUb0pzKGVbMF0pLFxcXCJib29sZWFuXFxcIj09dHlwZW9mIGYuZW5zdXJlX2FzY2lpJiYhMT09PWYuZW5zdXJlX2FzY2lpJiYoYi5hc2NpaT0hMSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5zb3J0X2tleXMmJmYuc29ydF9rZXlzJiYoZz0hMCksZ3x8KGIuY21wPWZ1bmN0aW9uKCl7cmV0dXJuIDB9KSxcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYuc2VwYXJhdG9ycyYmMj09Zi5zZXBhcmF0b3JzLmxlbmd0aCYmKGIuc2VwYXJhdG9ycy5pdGVtX3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMF0sYi5zZXBhcmF0b3JzLmtleV9zZXBhcmF0b3I9Zi5zZXBhcmF0b3JzWzFdKSxmLmluZGVudCYmKGIuc3BhY2U9Zi5pbmRlbnQpLGYuZGVmYXVsdCxkPXN0cmluZ2lmeShjLGIpLG5ldyBTay5idWlsdGluLnN0cihkKX07Yi5jb19rd2FyZ3M9ITAsYS5kdW1wcz1uZXcgU2suYnVpbHRpbi5mdW5jKGIpO3ZhciBjPWZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcImxvYWRzXFxcIixhcmd1bWVudHMsMSwxLzAsITAsITEpO3ZhciBiLGMsZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZT1uZXcgU2suYnVpbHRpbnMuZGljdChhKTtyZXR1cm4gZT1Tay5mZmkucmVtYXBUb0pzKGUpLGI9ZFswXS52LGM9SlNPTi5wYXJzZShiKSxTay5mZmkucmVtYXBUb1B5KGMpfTtyZXR1cm4gYy5jb19rd2FyZ3M9ITAsYS5sb2Fkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGF9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi9zdHJpbmdpZnkuanNcIjpcIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9rZXl3b3JkLnB5XCI6XCJcXG5fX2FsbF9fID0gW1xcXCJpc2tleXdvcmRcXFwiLCBcXFwia3dsaXN0XFxcIl1cXG5cXG5rd2xpc3QgPSBbXFxuIy0tc3RhcnQga2V5d29yZHMtLVxcbiAgICAgICAgJ2FuZCcsXFxuICAgICAgICAnYXMnLFxcbiAgICAgICAgJ2Fzc2VydCcsXFxuICAgICAgICAnYnJlYWsnLFxcbiAgICAgICAgJ2NsYXNzJyxcXG4gICAgICAgICdjb250aW51ZScsXFxuICAgICAgICAnZGVmJyxcXG4gICAgICAgICdkZWwnLFxcbiAgICAgICAgJ2VsaWYnLFxcbiAgICAgICAgJ2Vsc2UnLFxcbiAgICAgICAgJ2V4Y2VwdCcsXFxuICAgICAgICAnZXhlYycsXFxuICAgICAgICAnZmluYWxseScsXFxuICAgICAgICAnZm9yJyxcXG4gICAgICAgICdmcm9tJyxcXG4gICAgICAgICdnbG9iYWwnLFxcbiAgICAgICAgJ2lmJyxcXG4gICAgICAgICdpbXBvcnQnLFxcbiAgICAgICAgJ2luJyxcXG4gICAgICAgICdpcycsXFxuICAgICAgICAnbGFtYmRhJyxcXG4gICAgICAgICdub3QnLFxcbiAgICAgICAgJ29yJyxcXG4gICAgICAgICdwYXNzJyxcXG4gICAgICAgICdwcmludCcsXFxuICAgICAgICAncmFpc2UnLFxcbiAgICAgICAgJ3JldHVybicsXFxuICAgICAgICAndHJ5JyxcXG4gICAgICAgICd3aGlsZScsXFxuICAgICAgICAnd2l0aCcsXFxuICAgICAgICAneWllbGQnLFxcbiMtLWVuZCBrZXl3b3Jkcy0tXFxuICAgICAgICBdXFxuXFxuaXNrZXl3b3JkID0gZnJvemVuc2V0KGt3bGlzdCkuX19jb250YWluc19fXFxuXFxuXCIsXCJzcmMvbGliL2xpYi1keW5sb2FkL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItZHlubG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYi10ay9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliLXRrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliMnRvMyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpeGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGdlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpbmVjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGluZWNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbG9jYWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2NhbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2dnaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2dnaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hY3VybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWN1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxib3gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxib3ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWlsY2FwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWlsY2FwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFya3VwYmFzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFya3VwYmFzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hdGguanNcIjpcImNvbnN0ICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPU1hdGguc3FydCxjPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGQ9TWF0aC5FLGU9TWF0aC5sb2csZj1NYXRoLmV4cCxnPU1hdGgucG93LGg9TWF0aC5sb2cyLGk9TnVtYmVyLmlzRmluaXRlLGo9TWF0aC5mbG9vcixrPU1hdGguYWJzO2NvbnN0IGw9e3BpOm5ldyBTay5idWlsdGluLmZsb2F0XyhhKSxlOm5ldyBTay5idWlsdGluLmZsb2F0XyhkKSx0YXU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksbmFuOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pLGluZjpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMS8wKX0sbj1mdW5jdGlvbihhKXtyZXR1cm4gYT1hPzA+YT8tMToxOjA+MS9hPy0xOjEsYX0sbz0xODtyZXR1cm4gU2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzKFxcXCJtYXRoXFxcIixsLHthY29zOnskbWV0aDpmdW5jdGlvbiBhY29zKGEpe3ZhciBiPU1hdGguYWNvcztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgY29zaW5lIChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGFjb3NoOnskbWV0aDpmdW5jdGlvbiBhY29zaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGM9YStiKGEqYS0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sYXNpbjp7JG1ldGg6ZnVuY3Rpb24gYXNpbihhKXt2YXIgYj1NYXRoLmFzaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHNpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXNpbmg6eyRtZXRoOmZ1bmN0aW9uIGFzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphKzEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sYXRhbjp7JG1ldGg6ZnVuY3Rpb24gYXRhbihhKXt2YXIgYj1NYXRoLmF0YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXRhbjI6eyRtZXRoOmZ1bmN0aW9uIGF0YW4yKGEsYil7dmFyIGM9TWF0aC5hdGFuMjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMoU2suYnVpbHRpbi5hc251bSQoYSksU2suYnVpbHRpbi5hc251bSQoYikpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHksIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyB0YW5nZW50IChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB5L3guXFxcXG5cXFxcblVubGlrZSBhdGFuKHkveCksIHRoZSBzaWducyBvZiBib3RoIHggYW5kIHkgYXJlIGNvbnNpZGVyZWQuXFxcIn0sYXRhbmg6eyRtZXRoOmZ1bmN0aW9uIGF0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj0oMSthKS8oMS1hKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sY2VpbDp7JG1ldGg6ZnVuY3Rpb24gY2VpbChhKXt2YXIgYj1NYXRoLmNlaWw7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQ/bmV3IFNrLmJ1aWx0aW4uaW50XyhiKGMpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNlaWxpbmcgb2YgeCBhcyBhbiBJbnRlZ3JhbC5cXFxcblxcXFxuVGhpcyBpcyB0aGUgc21hbGxlc3QgaW50ZWdlciA+PSB4LlxcXCJ9LGNvcHlzaWduOnskbWV0aDpmdW5jdGlvbiBjb3B5c2lnbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYiksZD1Tay5idWlsdGluLmFzbnVtJChhKSxlPW4oZCksZj1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCooZSpmKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGEgZmxvYXQgd2l0aCB0aGUgbWFnbml0dWRlIChhYnNvbHV0ZSB2YWx1ZSkgb2YgeCBidXQgdGhlIHNpZ24gb2YgeS5cXFxcblxcXFxuT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBzaWduZWQgemVyb3MsIGNvcHlzaWduKDEuMCwgLTAuMClcXFxcbnJldHVybnMgLTEuMC5cXFxcblxcXCJ9LGNvczp7JG1ldGg6ZnVuY3Rpb24gY29zKGEpe3ZhciBiPU1hdGguY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNvc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxjb3NoOnskbWV0aDpmdW5jdGlvbiBjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYisxL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiB4LlxcXCJ9LGRlZ3JlZXM6eyRtZXRoOmZ1bmN0aW9uIGRlZ3JlZXMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPTE4MC9hKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSByYWRpYW5zIHRvIGRlZ3JlZXMuXFxcIn0sZXJmOnskbWV0aDpmdW5jdGlvbiBlcmYoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZigpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJFcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGVyZmM6eyRtZXRoOmZ1bmN0aW9uIGVyZmMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZmMoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGV4cDp7JG1ldGg6ZnVuY3Rpb24gZXhwKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGImJihiPWEubmIkZmxvYXQoKS52KSxiPT0xLzB8fGI9PS1JbmZpbml0eXx8aXNOYU4oYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKGIpKTtjb25zdCBjPWYoYik7aWYoIWlzRmluaXRlKGMpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB4LlxcXCJ9LGV4cG0xOnskbWV0aDpmdW5jdGlvbiBleHBtMShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKC43PmsoYikpe2NvbnN0IGE9ZihiKTtpZigxPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYik7ZWxzZXtjb25zdCBjPShhLTEpKmIvZShhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfX1lbHNle2NvbnN0IGE9ZihiKS0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGV4cCh4KS0xLlxcXFxuXFxcXG5UaGlzIGZ1bmN0aW9uIGF2b2lkcyB0aGUgbG9zcyBvZiBwcmVjaXNpb24gaW52b2x2ZWQgaW4gdGhlIGRpcmVjdCBldmFsdWF0aW9uIG9mIGV4cCh4KS0xIGZvciBzbWFsbCB4LlxcXCJ9LGZhYnM6eyRtZXRoOmZ1bmN0aW9uIGZhYnMoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O3JldHVybiBKU0JJLl9faXNCaWdJbnQoYikmJihiPWEubmIkZmxvYXQoKS52KSxiPWsoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZmxvYXQgeC5cXFwifSxmYWN0b3JpYWw6eyRtZXRoOmZ1bmN0aW9uIGZhY3RvcmlhbChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZihhPWooYiksYSE9Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJmYWN0b3JpYWwoKSBvbmx5IGFjY2VwdHMgaW50ZWdyYWwgdmFsdWVzXFxcIik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzXFxcIik7bGV0IGM9MTtmb3IobGV0IGI9MjtiPD1hJiZiPD1vO2IrKyljKj1iO2lmKGE8PW8pcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyk7Yz1KU0JJLkJpZ0ludChjKTtmb3IobGV0IGI9MTk7Yjw9YTtiKyspYz1KU0JJLm11bHRpcGx5KGMsSlNCSS5CaWdJbnQoYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiRmluZCB4IS5cXFxcblxcXFxuUmFpc2UgYSBWYWx1ZUVycm9yIGlmIHggaXMgbmVnYXRpdmUgb3Igbm9uLWludGVncmFsLlxcXCJ9LGZsb29yOnskbWV0aDpmdW5jdGlvbiBmbG9vcihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGooU2suYnVpbHRpbi5hc251bSQoYSkpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmbG9vciBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgPD0geC5cXFwifSxmbW9kOnskbWV0aDpmdW5jdGlvbiBmbW9kKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGM9YS52LGQ9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9Yi5uYiRmbG9hdCgpLnYpLChkPT0xLzB8fGQ9PS1JbmZpbml0eSkmJmlzRmluaXRlKGMpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7Y29uc3QgZT1jJWQ7aWYoaXNOYU4oZSkmJiFpc05hTihjKSYmIWlzTmFOKGQpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZm1vZCh4LCB5KSwgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIEMuXFxcXG5cXFxcbnggJSB5IG1heSBkaWZmZXIuXFxcIn0sZnJleHA6eyRtZXRoOmZ1bmN0aW9uIGZyZXhwKGEpe3ZhciBiPU1hdGgubWF4O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSksZD1bYywwXTtpZigwIT09YyYmaShjKSl7Y29uc3QgYT1rKGMpO2xldCBlPWIoLTEwMjMsaihoKGEpKSsxKSxmPWEqZygyLC1lKTtmb3IoOy41PmY7KWYqPTIsZS0tO2Zvcig7MTw9ZjspZio9LjUsZSsrOzA+YyYmKGY9LWYpLGRbMF09ZixkWzFdPWV9cmV0dXJuIGRbMF09bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGRbMF0pLGRbMV09bmV3IFNrLmJ1aWx0aW4uaW50XyhkWzFdKSxuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50IG9mIHgsIGFzIHBhaXIgKG0sIGUpLlxcXFxuXFxcXG5tIGlzIGEgZmxvYXQgYW5kIGUgaXMgYW4gaW50LCBzdWNoIHRoYXQgeCA9IG0gKiAyLioqZS5cXFxcbklmIHggaXMgMCwgbSBhbmQgZSBhcmUgYm90aCAwLiAgRWxzZSAwLjUgPD0gYWJzKG0pIDwgMS4wLlxcXCJ9LGZzdW06eyRtZXRoOmZ1bmN0aW9uIGZzdW0oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1xcXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcXFwiKTtsZXQgYj1bXTthPVNrLmFic3RyLml0ZXIoYSk7bGV0IGMsZCxlO2ZvcihsZXQgZj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGM9MDtsZXQgYT1mLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBhJiYoYT1mLm5iJGZsb2F0KCkudiksZj1hO2ZvcihsZXQgYSxnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKXtpZihhPWJbZ10sayhmKTxrKGEpKXtsZXQgYj1mO2Y9YSxhPWJ9ZD1mK2EsZT1hLShkLWYpLGUmJihiW2NdPWUsYysrKSxmPWR9Yj1iLnNsaWNlKDAsYykuY29uY2F0KFtmXSl9Y29uc3QgZj1iLnJlZHVjZShmdW5jdGlvbihjLGEpe3JldHVybiBjK2F9LDApO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHNlcSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhbiBhY2N1cmF0ZSBmbG9hdGluZyBwb2ludCBzdW0gb2YgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBzZXEuXFxcXG5cXFxcbkFzc3VtZXMgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy5cXFwifSxnYW1tYTp7JG1ldGg6ZnVuY3Rpb24gZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sZ2NkOnskbWV0aDpmdW5jdGlvbiBnY2QoYyxhKXtmdW5jdGlvbiBfZ2NkKGMsYSl7cmV0dXJuIDA9PWE/YzpfZ2NkKGEsYyVhKX1mdW5jdGlvbiBfYmlnZ2NkKGMsYSl7cmV0dXJuIEpTQkkuZXF1YWwoYSxKU0JJLl9fWkVSTyk/YzpfYmlnZ2NkKGEsSlNCSS5yZW1haW5kZXIoYyxhKSl9U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYVxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/KGQ9ayhkKSxlPWsoZSksYj1fZ2NkKGQsZSksYj0wPmI/LWI6YixuZXcgU2suYnVpbHRpbi5pbnRfKGIpKTooZD1KU0JJLkJpZ0ludChkKSxlPUpTQkkuQmlnSW50KGUpLGI9X2JpZ2djZChkLGUpLEpTQkkubGVzc1RoYW4oYixKU0JJLl9fWkVSTykmJihiPUpTQkkubXVsdGlwbHkoYixKU0JJLkJpZ0ludCgtMSkpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIudG9TdHJpbmcoKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcImdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHggYW5kIHlcXFwifSxoeXBvdDp7JG1ldGg6ZnVuY3Rpb24gaHlwb3QoYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihjKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGEqYStjKmMpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSwgc3FydCh4KnggKyB5KnkpLlxcXCJ9LGlzY2xvc2U6eyRtZXRoOmZ1bmN0aW9uIGlzY2xvc2UoYyxkKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzY2xvc2VcXFwiLGMsMiwyKSxyZWxfYWJzX3ZhbHM9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImlzY2xvc2VcXFwiLFtcXFwicmVsX3RvbFxcXCIsXFxcImFic190b2xcXFwiXSxbXSxkLFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtOSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApXSk7Y29uc3QgZT1jWzBdLGE9Y1sxXSxiPXJlbF9hYnNfdmFsc1swXSxmPXJlbF9hYnNfdmFsc1sxXTtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGUpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyZWxfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhYnNfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKTtjb25zdCBnPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGg9U2suYnVpbHRpbi5hc251bSQoYSksaT1Tay5idWlsdGluLmFzbnVtJChiKSxqPVNrLmJ1aWx0aW4uYXNudW0kKGYpO2lmKDA+aXx8MD5qKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInRvbGVyYW5jZXMgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZihnPT1oKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoZz09MS8wfHxnPT0tSW5maW5pdHl8fGg9PTEvMHx8aD09LUluZmluaXR5KXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2NvbnN0IGw9ayhoLWcpLG09bDw9ayhpKmgpfHxsPD1rKGkqZyl8fGw8PWo7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wobSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgLywgYSwgYiwgKiwgcmVsX3RvbD0xZS0wOSwgYWJzX3RvbD0wLjApXFxcIiwkZG9jOlxcXCJEZXRlcm1pbmUgd2hldGhlciB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgY2xvc2UgaW4gdmFsdWUuXFxcXG5cXFxcbiAgcmVsX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlbGF0aXZlIHRvIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG4gIGFic190b2xcXFxcbiAgICBtYXhpbXVtIGRpZmZlcmVuY2UgZm9yIGJlaW5nIGNvbnNpZGVyZWQgXFxcXFxcXCJjbG9zZVxcXFxcXFwiLCByZWdhcmRsZXNzIG9mIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG5cXFxcblJldHVybiBUcnVlIGlmIGEgaXMgY2xvc2UgaW4gdmFsdWUgdG8gYiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFxcblxcXFxuRm9yIHRoZSB2YWx1ZXMgdG8gYmUgY29uc2lkZXJlZCBjbG9zZSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtXFxcXG5tdXN0IGJlIHNtYWxsZXIgdGhhbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRvbGVyYW5jZXMuXFxcXG5cXFxcbi1pbmYsIGluZiBhbmQgTmFOIGJlaGF2ZSBzaW1pbGFybHkgdG8gdGhlIElFRUUgNzU0IFN0YW5kYXJkLiAgVGhhdFxcXFxuaXMsIE5hTiBpcyBub3QgY2xvc2UgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLiAgaW5mIGFuZCAtaW5mIGFyZVxcXFxub25seSBjbG9zZSB0byB0aGVtc2VsdmVzLlxcXCJ9LGlzZmluaXRlOnskbWV0aDpmdW5jdGlvbiBpc2Zpbml0ZShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5idWlsdGluLmNoZWNrSW50KGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDppc0Zpbml0ZShiKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgbmVpdGhlciBhbiBpbmZpbml0eSBub3IgYSBOYU4sIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNpbmY6eyRtZXRoOmZ1bmN0aW9uIGlzaW5mKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDppc0Zpbml0ZShiKXx8aXNOYU4oYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHksIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNuYW46eyRtZXRoOmZ1bmN0aW9uIGlzbmFuKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIGlzTmFOKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBhIE5hTiAobm90IGEgbnVtYmVyKSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxsZGV4cDp7JG1ldGg6ZnVuY3Rpb24gbGRleHAoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJpXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChiKSk7bGV0IGM9YS52O1xcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpO2NvbnN0IGQ9U2suYnVpbHRpbi5hc251bSQoYik7aWYoYz09MS8wfHxjPT0tSW5maW5pdHl8fDA9PWN8fGlzTmFOKGMpKXJldHVybiBhO2NvbnN0IGU9YypnKDIsZCk7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgaSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB4ICogKDIqKmkpLlxcXFxuXFxcXG5UaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mIGZyZXhwKCkuXFxcIn0sbGdhbW1hOnskbWV0aDpmdW5jdGlvbiBsZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmxnYW1tYSgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJOYXR1cmFsIGxvZ2FyaXRobSBvZiBhYnNvbHV0ZSB2YWx1ZSBvZiBHYW1tYSBmdW5jdGlvbiBhdCB4LlxcXCJ9LGxvZzp7JG1ldGg6ZnVuY3Rpb24gbG9nKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGYsZyxoPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZih2b2lkIDA9PT1iP2Y9ZDooU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYmFzZVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksZj1Tay5idWlsdGluLmFzbnVtJChiKSksMD49Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxoPGMpZz1lKGgpL2UoZik7ZWxzZXtoPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBiPWgubGVuZ3RoLGM9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2gpO2c9KGIqZSgxMCkrZShjKSkvZShmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGcpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwibG9nKHgsIFtiYXNlPWVdKVxcXFxuUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgeCB0byB0aGUgZ2l2ZW4gYmFzZS5cXFxcblxcXFxuSWYgdGhlIGJhc2Ugbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKGJhc2UgZSkgb2YgeC5cXFwifSxsb2cxMDp7JG1ldGg6ZnVuY3Rpb24gbG9nMTAoYSl7dmFyIGI9TWF0aC5sb2cxMDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZCxlPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxlPGMpZD1iKGUpO2Vsc2V7ZT1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1lLmxlbmd0aCxmPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitlKTtkPWMrYihmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LGxvZzFwOnskbWV0aDpmdW5jdGlvbiBsb2cxcChhKXt2YXIgYj1OdW1iZXIuRVBTSUxPTjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYz1hLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksLTE+PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNle2lmKDA9PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtpZihrKGMpPGIvMilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKC0uNTw9YyYmMT49Yyl7Y29uc3QgYT0xK2MsYj1lKGEpLShhLTEtYykvYTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfWVsc2V7Y29uc3QgYT1lKDErYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxK3ggKGJhc2UgZSkuXFxcXG5cXFxcblRoZSByZXN1bHQgaXMgY29tcHV0ZWQgaW4gYSB3YXkgd2hpY2ggaXMgYWNjdXJhdGUgZm9yIHggbmVhciB6ZXJvLlxcXCJ9LGxvZzI6eyRtZXRoOmZ1bmN0aW9uIGxvZzIoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGIsZD1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8ZDxjKWI9aChkKTtlbHNle2Q9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGM9ZC5sZW5ndGgsZT1wYXJzZUZsb2F0KFxcXCIwLlxcXCIrZCk7Yj1jKmgoMTApK2goZSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LG1vZGY6eyRtZXRoOmZ1bmN0aW9uIG1vZGYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoIWlzRmluaXRlKGIpKXtpZihiPT0xLzApcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSk7aWYoYj09LUluZmluaXR5KXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0wKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKX1jb25zdCBjPW4oYik7Yj1rKGIpO2NvbnN0IGU9YypqKGIpLGY9YyooYi1qKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhmKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSldKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZnJhY3Rpb25hbCBhbmQgaW50ZWdlciBwYXJ0cyBvZiB4LlxcXFxuXFxcXG5Cb3RoIHJlc3VsdHMgY2FycnkgdGhlIHNpZ24gb2YgeCBhbmQgYXJlIGZsb2F0cy5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhhLGIpe3ZhciBjPU51bWJlci5pc0ludGVnZXI7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGQ9YS52LGU9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZSYmKGU9Yi5uYiRmbG9hdCgpLnYpLDA9PWQmJjA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpO2lmKGkoZCkmJmkoZSkmJjA+ZCYmIWMoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKC0xPT1kJiYoZT09LUluZmluaXR5fHxlPT0xLzApKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9Y29uc3QgZj1nKGQsZSk7aWYoIWkoZCl8fCFpKGUpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZik7aWYoZj09MS8wfHxmPT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHgqKnkgKHggdG8gdGhlIHBvd2VyIG9mIHkpLlxcXCJ9LHJhZGlhbnM6eyRtZXRoOmZ1bmN0aW9uIHJhZGlhbnMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVnXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPWEvMTgwKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMuXFxcIn0scmVtYWluZGVyOnskbWV0aDpmdW5jdGlvbiByZW1haW5kZXIoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksaXNGaW5pdGUoZCkmJmlzRmluaXRlKGUpKXtsZXQgYSxiLGYsYyxnO2lmKDA9PWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZihhPWsoZCksYj1rKGUpLGM9YSViLGY9Yi1jLGM8ZilnPWM7ZWxzZSBpZihjPmYpZz0tZjtlbHNle2lmKGMhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7Zz1jLTIqKC41KihhLWMpJWIpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8obihkKSpnKX1pZihpc05hTihkKSlyZXR1cm4gYTtpZihpc05hTihlKSlyZXR1cm4gYjtpZihkPT0xLzB8fGQ9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGUhPTEvMCYmZSE9LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiRGlmZmVyZW5jZSBiZXR3ZWVuIHggYW5kIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcblxcXFxuUmV0dXJuIHggLSBuKnkgd2hlcmUgbip5IGlzIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcbkluIHRoZSBjYXNlIHdoZXJlIHggaXMgZXhhY3RseSBoYWxmd2F5IGJldHdlZW4gdHdvIG11bHRpcGxlcyBvZlxcXFxueSwgdGhlIG5lYXJlc3QgZXZlbiB2YWx1ZSBvZiBuIGlzIHVzZWQuIFRoZSByZXN1bHQgaXMgYWx3YXlzIGV4YWN0LlxcXCJ9LHNpbjp7JG1ldGg6ZnVuY3Rpb24gc2luKGEpe3ZhciBiPU1hdGguc2luO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNpbmUgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sc2luaDp7JG1ldGg6ZnVuY3Rpb24gc2luaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9ZyhkLGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGItMS9iKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sc3FydDp7JG1ldGg6ZnVuY3Rpb24gc3FydChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIHguXFxcIn0sdGFuOnskbWV0aDpmdW5jdGlvbiB0YW4oYSl7dmFyIGI9TWF0aC50YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgdGFuZ2VudCBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSx0YW5oOnskbWV0aDpmdW5jdGlvbiB0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD09PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtjb25zdCBjPWcoZCxiKSxlPTEvYztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChjLWUpLzIvKChjK2UpLzIpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sdHJ1bmM6eyRtZXRoOmZ1bmN0aW9uIHRydW5jKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLmNoZWNrSW50KGEpP2E6bmV3IFNrLmJ1aWx0aW4uaW50XygwfFNrLmJ1aWx0aW4uYXNudW0kKGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlRydW5jYXRlcyB0aGUgUmVhbCB4IHRvIHRoZSBuZWFyZXN0IEludGVncmFsIHRvd2FyZCAwLlxcXFxuXFxcXG5Vc2VzIHRoZSBfX3RydW5jX18gbWFnaWMgbWV0aG9kLlxcXCJ9fSksbH07XCIsXCJzcmMvbGliL21kNS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWQ1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWhsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1obGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1ldG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldHlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0eXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWlmeS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltaWZ5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbW9kdWxlZmluZGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtb2R1bGVmaW5kZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aWZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11bHRpZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlwcm9jZXNzaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211dGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdXRleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldHJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXRyYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibmV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbm50cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibm50cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL250cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnRwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnR1cmwycGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnR1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL251bWJlcnMucHlcIjpcIk51bWJlciA9IChpbnQsIGZsb2F0LCBjb21wbGV4KVxcbkludGVncmFsID0gaW50XFxuQ29tcGxleCA9IGNvbXBsZXhcXG5cIixcInNyYy9saWIvb3Bjb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcGNvZGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcGVyYXRvci5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtyZXR1cm4gb3BlcmF0b3I9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwib3BlcmF0b3JcXFwiKSxfX2RvY19fOm5ldyBTay5idWlsdGluLnN0cihcXFwiT3BlcmF0b3IgaW50ZXJmYWNlLlxcXFxuXFxcXG5UaGlzIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBqYXZhc2NyaXB0IGNvcnJlc3BvbmRpbmdcXFxcbnRvIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3JzIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlLCBvcGVyYXRvci5hZGQoeCwgeSlcXFxcbmlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24geCt5LiAgVGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSB0aG9zZVxcXFxudXNlZCBmb3Igc3BlY2lhbCBtZXRob2RzOyB2YXJpYW50cyB3aXRob3V0IGxlYWRpbmcgYW5kIHRyYWlsaW5nXFxcXG4nX18nIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS5cXFwiKSxfX2FsbF9fOm5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJhYnNcXFwiLFxcXCJhZGRcXFwiLFxcXCJhbmRfXFxcIixcXFwiYXR0cmdldHRlclxcXCIsXFxcImNvbmNhdFxcXCIsXFxcImNvbnRhaW5zXFxcIixcXFwiY291bnRPZlxcXCIsXFxcImRlbGl0ZW1cXFwiLFxcXCJlcVxcXCIsXFxcImZsb29yZGl2XFxcIixcXFwiZ2VcXFwiLFxcXCJnZXRpdGVtXFxcIixcXFwiZ3RcXFwiLFxcXCJpYWRkXFxcIixcXFwiaWFuZFxcXCIsXFxcImljb25jYXRcXFwiLFxcXCJpZmxvb3JkaXZcXFwiLFxcXCJpbHNoaWZ0XFxcIixcXFwiaW1hdG11bFxcXCIsXFxcImltb2RcXFwiLFxcXCJpbXVsXFxcIixcXFwiaW5kZXhcXFwiLFxcXCJpbmRleE9mXFxcIixcXFwiaW52XFxcIixcXFwiaW52ZXJ0XFxcIixcXFwiaW9yXFxcIixcXFwiaXBvd1xcXCIsXFxcImlyc2hpZnRcXFwiLFxcXCJpc19cXFwiLFxcXCJpc19ub3RcXFwiLFxcXCJpc3ViXFxcIixcXFwiaXRlbWdldHRlclxcXCIsXFxcIml0cnVlZGl2XFxcIixcXFwiaXhvclxcXCIsXFxcImxlXFxcIixcXFwibGVuZ3RoX2hpbnRcXFwiLFxcXCJsc2hpZnRcXFwiLFxcXCJsdFxcXCIsXFxcIm1hdG11bFxcXCIsXFxcIm1ldGhvZGNhbGxlclxcXCIsXFxcIm1vZFxcXCIsXFxcIm11bFxcXCIsXFxcIm5lXFxcIixcXFwibmVnXFxcIixcXFwibm90X1xcXCIsXFxcIm9yX1xcXCIsXFxcInBvc1xcXCIsXFxcInBvd1xcXCIsXFxcInJzaGlmdFxcXCIsXFxcInNldGl0ZW1cXFwiLFxcXCJzdWJcXFwiLFxcXCJ0cnVlZGl2XFxcIixcXFwidHJ1dGhcXFwiLFxcXCJ4b3JcXFwiXS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSl9LG9wZXJhdG9yLml0ZW1nZXR0ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IuaXRlbWdldHRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGl0ZW1nZXR0ZXIoYSl7dGhpcy5pdGVtcz1hLHRoaXMub25laXRlbT0xPT09YS5sZW5ndGgsdGhpcy5pdGVtPWFbMF0sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxKSxuZXcgb3BlcmF0b3IuaXRlbWdldHRlcihhKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gdGhpcy5vbmVpdGVtP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYyx0aGlzLml0ZW0sITApOm5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMuaXRlbXMubWFwKGE9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKSkpfSx0cCRkb2M6XFxcIlJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGl0ZW0ocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbiAgICAgICAgICAgIEFmdGVyIGYgPSBpdGVtZ2V0dGVyKDIpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgclsyXS5cXFxcbiAgICAgICAgICAgIEFmdGVyIGcgPSBpdGVtZ2V0dGVyKDIsIDUsIDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK3RoaXMuaXRlbXMubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiO3JldHVybiB0aGlzLmluJHJlcHI9ITEsYX19fSksb3BlcmF0b3IuYXR0cmdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5hdHRyZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gYXR0cmdldHRlcihhKXt0aGlzLmF0dHJzPWEsdGhpcy5vbmVhdHRyPTE9PT1hLmxlbmd0aCx0aGlzLmF0dHI9YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJhdHRyZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImF0dHJnZXR0ZXJcXFwiLGEsMSk7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgYj1hW2RdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Iudi5pbmNsdWRlcyhcXFwiLlxcXCIpP2MucHVzaChiLiRqc3N0cigpLnNwbGl0KFxcXCIuXFxcIikubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpOmMucHVzaChbYl0pfXJldHVybiBuZXcgb3BlcmF0b3IuYXR0cmdldHRlcihjKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtpZih0aGlzLm9uZWF0dHIpcmV0dXJuIHRoaXMuYXR0ci5yZWR1Y2UoKGEsYik9PlNrLmFic3RyLmdhdHRyKGEsYiksYyk7Y29uc3QgZD10aGlzLmF0dHJzLm1hcChhPT5hLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSx0cCRkb2M6XFxcImF0dHJnZXR0ZXIoYXR0ciwgLi4uKSAtLT4gYXR0cmdldHRlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlKHMpIGZyb20gaXRzIG9wZXJhbmQuXFxcXG5BZnRlciBmID0gYXR0cmdldHRlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lLlxcXFxuQWZ0ZXIgZyA9IGF0dHJnZXR0ZXIoJ25hbWUnLCAnZGF0ZScpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHIubmFtZSwgci5kYXRlKS5cXFxcbkFmdGVyIGggPSBhdHRyZ2V0dGVyKCduYW1lLmZpcnN0JywgJ25hbWUubGFzdCcpLCB0aGUgY2FsbCBoKHIpIHJldHVybnNcXFxcbihyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5tZXRob2RjYWxsZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IubWV0aG9kY2FsbGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gbWV0aG9kY2FsbGVyKGEsYixjKXt0aGlzLiRuYW1lPWEsdGhpcy5hcmdzPWIsdGhpcy5rd2FyZ3M9Y3x8W10sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSk7Y29uc3QgYz1hWzBdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBuZXcgb3BlcmF0b3IubWV0aG9kY2FsbGVyKGMsYS5zbGljZSgxKSxiKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIm1ldGhvZGNhbGxlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLmdhdHRyKGMsdGhpcy4kbmFtZSwhMCksYT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsdGhpcy5hcmdzLHRoaXMua3dhcmdzKSl9LHRwJGRvYzpcXFwibWV0aG9kY2FsbGVyKG5hbWUsIC4uLikgLS0+IG1ldGhvZGNhbGxlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgY2FsbHMgdGhlIGdpdmVuIG1ldGhvZCBvbiBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZSgpLlxcXFxuQWZ0ZXIgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcXFxcbnIubmFtZSgnZGF0ZScsIGZvbz0xKS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1bU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLiRuYW1lKSwuLi50aGlzLmFyZ3MubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpXTtmb3IobGV0IGI9MDtiPHRoaXMua3dhcmdzLmxlbmd0aDtiKz0yKWEucHVzaCh0aGlzLmt3YXJnc1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmt3YXJnc1tiKzFdKSk7cmV0dXJuIGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRoaXMuaW4kcmVwcj0hMSxhfX19KSxTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm9wZXJhdG9yXFxcIixvcGVyYXRvcix7bHQ6eyRtZXRoOmZ1bmN0aW9uIGx0KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPCBiLlxcXCJ9LGxlOnskbWV0aDpmdW5jdGlvbiBsZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTHRFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PSBiLlxcXCJ9LGVxOnskbWV0aDpmdW5jdGlvbiBlcShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID09IGIuXFxcIn0sbmU6eyRtZXRoOmZ1bmN0aW9uIG5lKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJOb3RFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgIT0gYi5cXFwifSxnZTp7JG1ldGg6ZnVuY3Rpb24gZ2UoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0RVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj0gYi5cXFwifSxndDp7JG1ldGg6ZnVuY3Rpb24gZ3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+IGIuXFxcIn0sbm90Xzp7JG1ldGg6ZnVuY3Rpb24gbm90XyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJOb3RcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgbm90IGEuXFxcIn0sdHJ1dGg6eyRtZXRoOmZ1bmN0aW9uIHRydXRoKGEpe3JldHVybiBTay5idWlsdGluLmJvb2woYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiBhIGlzIHRydWUsIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc186eyRtZXRoOmZ1bmN0aW9uIGlzXyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIGIuXFxcIn0saXNfbm90OnskbWV0aDpmdW5jdGlvbiBpc19ub3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIklzTm90XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBpcyBub3QgYi5cXFwifSxhYnM6eyRtZXRoOmZ1bmN0aW9uIGFicyhhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFicyhhKS5cXFwifSxhZGQ6eyRtZXRoOmZ1bmN0aW9uIGFkZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArIGIuXFxcIn0sYW5kXzp7JG1ldGg6ZnVuY3Rpb24gYW5kXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdEFuZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAmIGIuXFxcIn0sZmxvb3JkaXY6eyRtZXRoOmZ1bmN0aW9uIGZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy8gYi5cXFwifSxpbmRleDp7JG1ldGg6ZnVuY3Rpb24gaW5kZXgoYil7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhLl9faW5kZXhfXygpXFxcIn0saW52OnskbWV0aDpmdW5jdGlvbiBpbnYoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIH5hLlxcXCJ9LGludmVydDp7JG1ldGg6ZnVuY3Rpb24gaW52ZXJ0KGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIkludmVydFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0sbHNoaWZ0OnskbWV0aDpmdW5jdGlvbiBsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDwgYi5cXFwifSxtb2Q6eyRtZXRoOmZ1bmN0aW9uIG1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1vZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAlIGIuXFxcIn0sbXVsOnskbWV0aDpmdW5jdGlvbiBtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICogYi5cXFwifSxtYXRtdWw6eyRtZXRoOmZ1bmN0aW9uIG1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQCBiLlxcXCJ9LG5lZzp7JG1ldGg6ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIlVTdWJcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgLWEuXFxcIn0sb3JfOnskbWV0aDpmdW5jdGlvbiBvcl8oYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8IGIuXFxcIn0scG9zOnskbWV0aDpmdW5jdGlvbiBwb3MoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVUFkZFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyArYS5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKiBiLlxcXCJ9LHJzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUlNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+IGIuXFxcIn0sc3ViOnskbWV0aDpmdW5jdGlvbiBzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJTdWJcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLSBiLlxcXCJ9LHRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvIGIuXFxcIn0seG9yOnskbWV0aDpmdW5jdGlvbiB4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXiBiLlxcXCJ9LGNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gY29uY2F0KGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlQ29uY2F0KGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGNvbnRhaW5zOnskbWV0aDpmdW5jdGlvbiBjb250YWlucyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGIgaW4gYSAobm90ZSByZXZlcnNlZCBvcGVyYW5kcykuXFxcIn0sY291bnRPZjp7JG1ldGg6ZnVuY3Rpb24gY291bnRPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBiIG9jY3VycyBpbiBhLlxcXCJ9LGRlbGl0ZW06eyRtZXRoOmZ1bmN0aW9uIGRlbGl0ZW0oYyxhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0RGVsSXRlbShjLGEsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgZGVsIGFbYl0uXFxcIn0sZ2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gZ2V0aXRlbShjLGEpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdLlxcXCJ9LGluZGV4T2Y6eyRtZXRoOmZ1bmN0aW9uIGluZGV4T2YoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VHZXRJbmRleE9mKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiBiIGluIGEuXFxcIn0sc2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gc2V0aXRlbShkLGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLm9iamVjdFNldEl0ZW0oZCxhLGIsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgYywgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYVtiXSA9IGMuXFxcIn0sbGVuZ3RoX2hpbnQ6eyRtZXRoOmZ1bmN0aW9uIGxlbmd0aF9oaW50KGEsYil7aWYodm9pZCAwPT09YiliPW5ldyBTay5idWlsdGluLmludF8oMCk7ZWxzZSBpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlclxcXCIpO3RyeXtyZXR1cm4gU2suYnVpbHRpbi5sZW4oYSl9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpKXRocm93IGF9Y29uc3QgYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50KTtpZih2b2lkIDAhPT1jKXtjb25zdCBhPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZihhPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpcmV0dXJuIGI7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiX19sZW5ndGhfaGludF9fIG11c3QgYmUgYW4gaW50ZWdlciwgbm90IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2Vsc2UgaWYoYS5uYiRpc25lZ2F0aXZlKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18oKSBzaG91bGQgcmV0dXJuID49IDBcXFwiKTtyZXR1cm4gYX1yZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIG9iaiwgZGVmYXVsdD0wLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gb2JqLlxcXFxuXFxcXG5UaGlzIGlzIHVzZWZ1bCBmb3IgcHJlc2l6aW5nIGNvbnRhaW5lcnMgd2hlbiBidWlsZGluZyBmcm9tIGFuIGl0ZXJhYmxlLlxcXFxuXFxcXG5JZiB0aGUgb2JqZWN0IHN1cHBvcnRzIGxlbigpLCB0aGUgcmVzdWx0IHdpbGwgYmUgZXhhY3QuXFxcXG5PdGhlcndpc2UsIGl0IG1heSBvdmVyLSBvciB1bmRlci1lc3RpbWF0ZSBieSBhbiBhcmJpdHJhcnkgYW1vdW50LlxcXFxuVGhlIHJlc3VsdCB3aWxsIGJlIGFuIGludGVnZXIgPj0gMC5cXFwifSxpYWRkOnskbWV0aDpmdW5jdGlvbiBpYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLlxcXCJ9LGlhbmQ6eyRtZXRoOmZ1bmN0aW9uIGlhbmQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICY9IGIuXFxcIn0saWNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gaWNvbmNhdChjLGEpe2lmKHZvaWQgMCE9PWMuc3EkaW5wbGFjZV9jb25jYXQpcmV0dXJuIGMuc3EkaW5wbGFjZV9jb25jYXQoYSk7aWYodm9pZCAwIT09Yy5zcSRjb25jYXQpcmV0dXJuIGMuc3EkY29uY2F0KGEpO2lmKCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYyl8fCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFxcXCIpO3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKz0gYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGlmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gaWZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkZsb29yRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8vPSBiLlxcXCJ9LGlsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw8PSBiLlxcXCJ9LGltb2Q6eyRtZXRoOmZ1bmN0aW9uIGltb2QoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICU9IGIuXFxcIn0saW11bDp7JG1ldGg6ZnVuY3Rpb24gaW11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICo9IGIuXFxcIn0saW1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gaW1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNYXRNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIEA9IGIuXFxcIn0saW9yOnskbWV0aDpmdW5jdGlvbiBpb3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0T3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgfD0gYi5cXFwifSxpcG93OnskbWV0aDpmdW5jdGlvbiBpcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKj0gYi5cXFwifSxpcnNoaWZ0OnskbWV0aDpmdW5jdGlvbiBpcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkxSaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+Pj0gYi5cXFwifSxpc3ViOnskbWV0aDpmdW5jdGlvbiBpc3ViKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtPSBiLlxcXCJ9LGl0cnVlZGl2OnskbWV0aDpmdW5jdGlvbiBpZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvPSBiLlxcXCJ9LGl4b3I6eyRtZXRoOmZ1bmN0aW9uIGl4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0WG9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIF49IGIuXFxcIn19KSxPYmplY3QuYXNzaWduKG9wZXJhdG9yLHtfX2Fic19fOm9wZXJhdG9yLmFicyxfX2FkZF9fOm9wZXJhdG9yLmFkZCxfX2FuZF9fOm9wZXJhdG9yLmFuZCxfX2NvbmNhdF9fOm9wZXJhdG9yLmNvbmNhdCxfX2NvbnRhaW5zX186b3BlcmF0b3IuY29udGFpbnMsX19kZWxpdGVtX186b3BlcmF0b3IuZGVsaXRlbSxfX2VxX186b3BlcmF0b3IuZXEsX19mbG9vcmRpdl9fOm9wZXJhdG9yLmZsb29yZGl2LF9fZ2VfXzpvcGVyYXRvci5nZSxfX2dldGl0ZW1fXzpvcGVyYXRvci5nZXRpdGVtLF9fZ3RfXzpvcGVyYXRvci5ndCxfX2lhZGRfXzpvcGVyYXRvci5pYWRkLF9faWFuZF9fOm9wZXJhdG9yLmlhbmQsX19pY29uY2F0X186b3BlcmF0b3IuaWNvbmNhdCxfX2lmbG9vcmRpdl9fOm9wZXJhdG9yLmlmbG9vcmRpdixfX2lsc2hpZnRfXzpvcGVyYXRvci5pbHNoaWZ0LF9faW1hdG11bF9fOm9wZXJhdG9yLmltYXRtdWwsX19pbW9kX186b3BlcmF0b3IuaW1vZCxfX2ltdWxfXzpvcGVyYXRvci5pbXVsLF9faW5kZXhfXzpvcGVyYXRvci5pbmRleCxfX2ludl9fOm9wZXJhdG9yLmludixfX2ludmVydF9fOm9wZXJhdG9yLmludmVydCxfX2lvcl9fOm9wZXJhdG9yLmlvcixfX2lwb3dfXzpvcGVyYXRvci5pcG93LF9faXJzaGlmdF9fOm9wZXJhdG9yLmlyc2hpZnQsX19pc3ViX186b3BlcmF0b3IuaXN1YixfX2l0cnVlZGl2X186b3BlcmF0b3IuaXRydWVkaXYsX19peG9yX186b3BlcmF0b3IuaXhvcixfX2xlX186b3BlcmF0b3IubGUsX19sc2hpZnRfXzpvcGVyYXRvci5sc2hpZnQsX19sdF9fOm9wZXJhdG9yLmx0LF9fbWF0bXVsX186b3BlcmF0b3IubWF0bXVsLF9fbW9kX186b3BlcmF0b3IubW9kLF9fbXVsX186b3BlcmF0b3IubXVsLF9fbmVfXzpvcGVyYXRvci5uZSxfX25lZ19fOm9wZXJhdG9yLm5lZyxfX25vdF9fOm9wZXJhdG9yLm5vdCxfX29yX186b3BlcmF0b3Iub3IsX19wb3NfXzpvcGVyYXRvci5wb3MsX19wb3dfXzpvcGVyYXRvci5wb3csX19yc2hpZnRfXzpvcGVyYXRvci5yc2hpZnQsX19zZXRpdGVtX186b3BlcmF0b3Iuc2V0aXRlbSxfX3N1Yl9fOm9wZXJhdG9yLnN1YixfX3RydWVkaXZfXzpvcGVyYXRvci50cnVlZGl2LF9feG9yX186b3BlcmF0b3IueG9yLF9hYnM6U2suYnVpbHRpbnMuYWJzLGRpdjpvcGVyYXRvci50cnVlZGl2LF9fZGl2X186b3BlcmF0b3IudHJ1ZWRpdn0pLG9wZXJhdG9yfVwiLFwic3JjL2xpYi9vcHRwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3B0cGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vczJlbXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvczJlbXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waWNrbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaWNrbGV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpcGVzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BrZ3V0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBrZ3V0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wbGF0Zm9ybS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLnB5dGhvbl9pbXBsZW1lbnRhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl9pbXBsZW1lbnRhdGlvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiU2t1bHB0XFxcIil9KSxhLm5vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJub2RlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGEudmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS5weXRob25fdmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl92ZXJzaW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1Tay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uP1xcXCIzLjIuMFxcXCI6XFxcIjIuNy4wXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnN5c3RlbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN5c3RlbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLmFwcENvZGVOYW1lOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEubWFjaGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hY2hpbmVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnJlbGVhc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyZWxlYXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbjpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLmFyY2hpdGVjdHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFyY2hpdGVjdHVyZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcIjY0Yml0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKV0pfSksYS5wcm9jZXNzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwcm9jZXNzb3JcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYX07XCIsXCJzcmMvbGliL3BsYXRmb3JtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGF0Zm9ybSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsaXN0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGlzdGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BvcGVuMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9wZW4yIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3NpeGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvc2l4ZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHByaW50LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcHJpbnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcm9jZXNzaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaCxhPU1hdGguUEksaj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwcm9jZXNzaW5nXFxcIil9LGs9W10sbD0hMCxtPW51bGw7cmV0dXJuIGoucHJvY2Vzc2luZz1udWxsLGoucD1udWxsLGouWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouVT1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouVj1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouTlg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLk5ZPW5ldyBTay5idWlsdGluLmludF8oMTApLGouTlo9bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5FREdFPW5ldyBTay5idWlsdGluLmludF8oMTIpLGouU1I9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5TRz1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlNCPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouU0E9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5TVz1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLlRYPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouVFk9bmV3IFNrLmJ1aWx0aW4uaW50XygxOSksai5UWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlZYPW5ldyBTay5idWlsdGluLmludF8oMjEpLGouVlk9bmV3IFNrLmJ1aWx0aW4uaW50XygyMiksai5WWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxqLlZXPW5ldyBTay5idWlsdGluLmludF8oMjQpLGouQVI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNSksai5BRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI2KSxqLkFCPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouRFI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRHPW5ldyBTay5idWlsdGluLmludF8oNCksai5EQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouREE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLlNQUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI4KSxqLlNQRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI5KSxqLlNQQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMwKSxqLlNISU5FPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FRz1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLkVCPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouQkVFTl9MSVQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5WRVJURVhfRklFTERfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNiksai5DRU5URVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlJBRElVUz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQ09STkVSUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ09STkVSPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESUFNRVRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQkFTRUxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRPUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMSksai5CT1RUT009bmV3IFNrLmJ1aWx0aW4uaW50XygxMDIpLGouTk9STUFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxJWkVEPW5ldyBTay5idWlsdGluLmludF8oMSksai5JTUFHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTU9ERUw9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlNIQVBFPW5ldyBTay5idWlsdGluLmludF8oNSksai5BTUJJRU5UPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESVJFQ1RJT05BTD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouU1BPVD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkdCPW5ldyBTay5idWlsdGluLmludF8oMSksai5BUkdCPW5ldyBTay5idWlsdGluLmludF8oMiksai5IU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkFMUEhBPW5ldyBTay5idWlsdGluLmludF8oNCksai5DTVlLPW5ldyBTay5idWlsdGluLmludF8oNSksai5USUZGPW5ldyBTay5idWlsdGluLmludF8oMCksai5UQVJHQT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSlBFRz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouR0lGPW5ldyBTay5idWlsdGluLmludF8oMyksai5NSVRFUj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1pdGVyXFxcIiksai5CRVZFTD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJldmVsXFxcIiksai5ST1VORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInJvdW5kXFxcIiksai5TUVVBUkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJidXR0XFxcIiksai5QUk9KRUNUPW5ldyBTay5idWlsdGluLnN0cihcXFwic3F1YXJlXFxcIiksai5QMkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkpBVkEyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouV0VCR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlAzRD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouT1BFTkdMPW5ldyBTay5idWlsdGluLmludF8oMiksai5QREY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRYRj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1RIRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLldJTkRPV1M9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk1BWE9TWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTElOVVg9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkVQU0lMT049bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDFlLTQpLGouTUFYX0ZMT0FUPW5ldyBTay5idWlsdGluLmZsb2F0XygzNDAyODIzNWUzMSksai5NSU5fRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0zNDAyODIzNWUzMSksai5NQVhfSU5UPW5ldyBTay5idWlsdGluLmludF8oMjE0NzQ4MzY0Nyksai5NSU5fSU5UPW5ldyBTay5idWlsdGluLmludF8oLTIxNDc0ODM2NDgpLGouSEFMRl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8yKSxqLlRISVJEX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzMpLGouUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGouVFdPX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouVEFVPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouUVVBUlRFUl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS80KSxqLkRFR19UT19SQUQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMTgwKSxqLlJBRF9UT19ERUc9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDE4MC9hKSxqLldISVRFU1BBQ0U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcXHRcXFxcblxcXFxyXFxcXGZcXFxceEEwXFxcIiksai5QT0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUE9JTlRTPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5FPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSU5FUz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouVFJJQU5HTEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLlRSSUFOR0xFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouVFJJQU5HTEVfRkFOPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouVFJJQU5HTEVfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5RVUFEPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouUVVBRFM9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEX1NUUklQPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouUE9MWUdPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBBVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5SRUNUPW5ldyBTay5idWlsdGluLmludF8oMzApLGouRUxMSVBTRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMxKSxqLkFSQz1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLlNQSEVSRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkJPWD1uZXcgU2suYnVpbHRpbi5pbnRfKDQxKSxqLkdST1VQPW5ldyBTay5idWlsdGluLmludF8oMCksai5QUklNSVRJVkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkdFT01FVFJZPW5ldyBTay5idWlsdGluLmludF8oMyksai5WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJFWklFUl9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNVUlZFX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQlJFQUs9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkNMT1NFU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlJFUExBQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJMRU5EPW5ldyBTay5idWlsdGluLmludF8oMSksai5BREQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlNVQlRSQUNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSUdIVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouREFSS0VTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkRJRkZFUkVOQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FWENMVVNJT049bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NCksai5NVUxUSVBMWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyOCksai5TQ1JFRU49bmV3IFNrLmJ1aWx0aW4uaW50XygyNTYpLGouT1ZFUkxBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDUxMiksai5IQVJEX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMTAyNCksai5TT0ZUX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMjA0OCksai5ET0RHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwOTYpLGouQlVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDgxOTIpLGouQUxQSEFfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDQyNzgxOTAwODApLGouUkVEX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygxNjcxMTY4MCksai5HUkVFTl9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNjUyODApLGouQkxVRV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oMjU1KSxqLkNVU1RPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1JUSE9HUkFQSElDPW5ldyBTay5idWlsdGluLmludF8oMiksai5QRVJTUEVDVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQVJST1c9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0XFxcIiksai5DUk9TUz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImNyb3NzaGFpclxcXCIpLGouSEFORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInBvaW50ZXJcXFwiKSxqLk1PVkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJtb3ZlXFxcIiksai5URVhUPW5ldyBTay5idWlsdGluLnN0cihcXFwidGV4dFxcXCIpLGouV0FJVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndhaXRcXFwiKSxqLk5PQ1VSU09SPVNrLmJ1aWx0aW4uYXNzayQoXFxcInVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PScpLCBhdXRvXFxcIiksai5ESVNBQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkVOQUJMRV9PUEVOR0xfMlhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oLTEpLGouRU5BQkxFX09QRU5HTF80WF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkVOQUJMRV9OQVRJVkVfRk9OVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRJU0FCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouRU5BQkxFX0RFUFRIX1RFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygtNCksai5FTkFCTEVfREVQVEhfU09SVD1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouRElTQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oLTUpLGouRElTQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oNiksai5FTkFCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVD1uZXcgU2suYnVpbHRpbi5pbnRfKC02KSxqLkVOQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouRElTQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKC03KSxqLkhJTlRfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5PUEVOPW5ldyBTay5idWlsdGluLmludF8oMSksai5DTE9TRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQkxVUj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkdSQVk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5JTlZFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5PUEFRVUU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNCksai5QT1NURVJJWkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5USFJFU0hPTEQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5FUk9ERT1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkRJTEFURT1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkJBQ0tTUEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVEFCPW5ldyBTay5idWlsdGluLmludF8oOSksai5FTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlJFVFVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLkVTQz1uZXcgU2suYnVpbHRpbi5pbnRfKDI3KSxqLkRFTEVURT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyNyksai5DT0RFRD1uZXcgU2suYnVpbHRpbi5pbnRfKDY1NTM1KSxqLlNISUZUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouQ09OVFJPTD1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkFMVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkNBUFNMSz1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBHVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygzMyksai5QR0ROPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouRU5EPW5ldyBTay5idWlsdGluLmludF8oMzUpLGouSE9NRT1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkxFRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNyksai5VUD1uZXcgU2suYnVpbHRpbi5pbnRfKDM4KSxqLlJJR0hUPW5ldyBTay5idWlsdGluLmludF8oMzkpLGouRE9XTj1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkYxPW5ldyBTay5idWlsdGluLmludF8oMTEyKSxqLkYyPW5ldyBTay5idWlsdGluLmludF8oMTEzKSxqLkYzPW5ldyBTay5idWlsdGluLmludF8oMTE0KSxqLkY0PW5ldyBTay5idWlsdGluLmludF8oMTE1KSxqLkY1PW5ldyBTay5idWlsdGluLmludF8oMTE2KSxqLkY2PW5ldyBTay5idWlsdGluLmludF8oMTE3KSxqLkY3PW5ldyBTay5idWlsdGluLmludF8oMTE4KSxqLkY4PW5ldyBTay5idWlsdGluLmludF8oMTE5KSxqLkY5PW5ldyBTay5idWlsdGluLmludF8oMTIwKSxqLkYxMD1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMSksai5GMTE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjIpLGouRjEyPW5ldyBTay5idWlsdGluLmludF8oMTIzKSxqLk5VTUxLPW5ldyBTay5idWlsdGluLmludF8oMTQ0KSxqLk1FVEE9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTcpLGouSU5TRVJUPW5ldyBTay5idWlsdGluLmludF8oMTU1KSxqLlNJTkNPU19MRU5HVEg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3MjApLGouUFJFQ0lTSU9OQj1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlBSRUNJU0lPTkY9bmV3IFNrLmJ1aWx0aW4uaW50XygzMjc2OCksai5QUkVDX01BWFZBTD1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY3KSxqLlBSRUNfQUxQSEFfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLlBSRUNfUkVEX1NISUZUPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9BVVRPPW5ldyBTay5idWlsdGluLmludF8oMCksai5OT1JNQUxfTU9ERV9TSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMX01PREVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5NQVhfTElHSFRTPW5ldyBTay5idWlsdGluLmludF8oOCksai5saW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmxpbmUoYS52LGIudixjLnYsZC52KX0pLGouZWxsaXBzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2oucHJvY2Vzc2luZy5lbGxpcHNlKGEudixiLnYsYy52LGQudil9KSxqLnRleHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLnRleHQoYS52LGIudixjLnYpfSksai5wb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnBvaW50KGEudixiLnYpfSksai5hcmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmFyYyhhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnF1YWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe2oucHJvY2Vzc2luZy5xdWFkKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5yZWN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnJlY3QoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYsZS52KX0pLGoudHJpYW5nbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnRyaWFuZ2xlKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmV6aWVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayxsLG0pe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5hbHBoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52LGQudikpfSksai5hbWJpZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52KTpqLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52LGQudil9KSxqLmFtYmllbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52KTpqLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmVnaW5DYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5iZWdpbkNhbWVyYSgpfSksai5iZWdpblNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhJiYoYT1qLlBPTFlHT04pLGoucHJvY2Vzc2luZy5iZWdpblNoYXBlKGEudil9KSxqLmJlemllckRldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2E9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhPzIwOmEudixqLnByb2Nlc3NpbmcuYmV6aWVyRGV0YWlsKGEpfSksai5iZXppZXJQb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmJlemllclBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyVGFuZ2VudChlLnYsYS52LGIudixjLnYsZC52KX0pLGouYmV6aWVyVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZz9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGg/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5ibGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGspe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5ibGVuZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudik6ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudil9KSxqLmJsZW5kQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7cmV0dXJuIGUudj1qLnByb2Nlc3NpbmcuYmxlbmRDb2xvcihhLnYsYi52LGQudiksZX0pLGouYnJpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52LGMudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52LGQudikpfSksai5jYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jYW1lcmEoKTpqLnByb2Nlc3NpbmcuY2FtZXJhKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY29uc3RyYWluPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmNvbnN0cmFpbihhLnYsYi52LGMudikpfSksai5jb3B5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY3JlYXRlRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gZS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlR3JhcGhpY3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QR3JhcGhpY3MpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5jcmVhdGVHcmFwaGljcyhhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gZC52PWoucHJvY2Vzc2luZy5jcmVhdGVJbWFnZShhLnYsYi52LGMudiksZH0pLGouY3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuY3Vyc29yKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5jdXJzb3IoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYsYi52KTpqLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYsYy52KX0pLGouY3VydmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGs/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGw/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBtP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52KTpqLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5jdXJ2ZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZURldGFpbChhLnYpfSksai5jdXJ2ZVBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVQb2ludChlLnYsYS52LGIudixjLnYsZC52KX0pLGouY3VydmVUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZVRpZ2h0bmVzcyhhLnYpfSksai5jdXJ2ZVZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZVZlcnRleChhLnYsYi52LGMudil9KSxqLmRheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmRheSgpKX0pLGouZGVncmVlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRlZ3JlZXMoYS52KSl9KSxqLmRpcmVjdGlvbmFsTGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmRpcmVjdGlvbmFsTGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5kaXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBmP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYsZS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYsZi52KSl9KSxqLmVtaXNzaXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYpOmoucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYsYi52LGMudil9KSxqLmVuZENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmVuZENhbWVyYSgpfSksai5lbmRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuZW5kU2hhcGUoKTpqLnByb2Nlc3NpbmcuZW5kU2hhcGUoYS52KX0pLGouZmlsdGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYpOmoucHJvY2Vzc2luZy5maWx0ZXIoYS52LGIudil9KSxqLmZydXN0dW09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmZydXN0dW0oYSxiLGMsZCxlLGYpfSksai5oaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmhpbnQoYSl9KSxqLmhvdXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ob3VyKCkpfSksai5odWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5odWUoYS52KSl9KSxqLmltYWdlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5pbWFnZU1vZGUoYS52KX0pLGoubGVycD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5sZXJwKGEudixiLnYsYy52KSl9KSxqLmxlcnBDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5sZXJwQ29sb3IoYS52LGIudixkLnYpLGV9KSxqLmxpZ2h0RmFsbG9mZj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRGYWxsb2ZmKGEudixiLnYsYy52KX0pLGoubGlnaHRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcubGlnaHRzKCl9KSxqLmxpZ2h0U3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLmxpZ2h0U3BlY3VsYXIoYS52LGIudixjLnYpfSksai5sb2FkQnl0ZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZEJ5dGVzKGEudikpfSksai5sb2FkRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gYi52PWoucHJvY2Vzc2luZy5sb2FkRm9udChhLnYpLGJ9KSxqLmxvYWRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBTaGFwZVNWRyxbbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzdHJpbmdcXFwiKSxhXSk7cmV0dXJuIGJ9KSxqLmxvYWRTdHJpbmdzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLmxvYWRTdHJpbmdzKGEudikpfSksai5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hZyhkLnYsYS52LGIudikpfSksai5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hcChhLnYsYi52LGMudixkLnYsZS52KSl9KSxqLm1pbGxpcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1pbGxpcygpKX0pLGoubWludXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWludXRlKCkpfSksai5tb2RlbFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxYKGEudixiLnYsYy52KSl9KSxqLm1vZGVsWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFkoYS52LGIudixjLnYpKX0pLGoubW9kZWxaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWihhLnYsYi52LGMudikpfSksai5tb250aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vbnRoKCkpfSksai5ub0N1cnNvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vQ3Vyc29yKCl9KSxqLm5vaXNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYsYy52KSl9KSxqLm5vaXNlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3Npbmcubm9pc2VEZXRhaWwoYS52LGIudil9KSxqLm5vaXNlU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlU2VlZChhLnYpKX0pLGoubm9MaWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0xpZ2h0cygpfSksai5ub3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vcm0oYS52LGIudixjLnYpKX0pLGoubm9ybWFsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5ub3JtYWwoYS52LGIudixjLnYpfSksai5ub1RpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1RpbnQoKX0pLGoub3J0aG89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLm9ydGhvKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52LGQudil9KSxqLnBvaW50TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnBvaW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wcmludENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50Q2FtZXJhKCl9KSxqLnByaW50bG49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucHJpbnRsbihhLnYpfSksai5wcmludFByb2plY3Rpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wcmludFByb2plY3Rpb24oKX0pLGoucmFkaWFucz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhZGlhbnMoYS52KSl9KSxqLnJhbmRvbVNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb21TZWVkKGEudikpfSksai5yYW5kb209bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbSgpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52LGIudikpfSksai5yZXF1ZXN0SW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYpOmoucHJvY2Vzc2luZy5yZXF1ZXN0SW1hZ2UoYS52LGIudiksY30pLGouc2F0dXJhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNhdHVyYXRpb24oYS52KSl9KSxqLnNhdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2F2ZShhLnYpfSksai5zYXZlRnJhbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnNhdmVGcmFtZSgpOmoucHJvY2Vzc2luZy5zYXZlRnJhbWUoYS52KX0pLGouc2F2ZVN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5zYXZlU3RyaW5ncyhhLnYsYi52KX0pLGouc2NyZWVuWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5YKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWShhLnYsYi52LGMudikpfSksai5zY3JlZW5aPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblooYS52LGIudixjLnYpKX0pLGouc2Vjb25kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcuc2Vjb25kKCkpfSksai5zaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zaGFwZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouc2hhcGVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNoYXBlTW9kZShhLnYpfSksai5zaGluaW5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hpbmluZXNzKGEudil9KSxqLnNwZWN1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYpOmoucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYsYi52LGMudil9KSxqLnNwb3RMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnNwb3RMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KX0pLGouc3E9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zcShhKSl9KSxqLnN0YXR1cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdGF0dXMoYS52KX0pLGoudGV4dEFsaWduPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYpOmoucHJvY2Vzc2luZy50ZXh0QWxpZ24oYS52LGIudil9KSxqLnRleHRBc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRBc2NlbnQoKSl9KSxqLnRleHREZXNjZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0RGVzY2VudCgpKX0pLGoudGV4dEZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52KTpqLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52LGIudil9KSxqLnRleHRMZWFkaW5nPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRMZWFkaW5nKGEudil9KSxqLnRleHRNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRNb2RlKGEudil9KSxqLnRleHRTaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRTaXplKGEudil9KSxqLnRleHR1cmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dHVyZShhLnYpfSksai50ZXh0dXJlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlTW9kZShhLnYpfSksai50ZXh0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0V2lkdGgoYS52KSl9KSxqLnRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRpbnQoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcudGludChhLnYsYi52LGMudixkLnYpfSksai51cGRhdGVQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy51cGRhdGVQaXhlbHMoKX0pLGoudmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52LGQudixlLnYpfSksai55ZWFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcueWVhcigpKX0pLGouYm94PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmJveChhLnYpfSksai5zcGhlcmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3BoZXJlKGEudil9KSxqLnNwaGVyZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52KTpqLnByb2Nlc3Npbmcuc3BoZXJlRGV0YWlsKGEudixiLnYpfSksai5iYWNrZ3JvdW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksai5wcm9jZXNzaW5nLmJhY2tncm91bmQoYS52LGMsZCl9KSxqLmZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3NpbmcuZmlsbChhLnYsYyxkLGUpfSksai5zdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3Npbmcuc3Ryb2tlKGEudixjLGQsZSl9KSxqLm5vU3Ryb2tlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9TdHJva2UoKX0pLGouY29sb3JNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8yNTU6Yi52LFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5jb2xvck1vZGUoYS52LGIsYyxkLGUpfSksai5ub0ZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0ZpbGwoKX0pLGoubG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcImxvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMCxqLnByb2Nlc3NpbmcubG9vcCgpfSksai5ub0xvb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKG51bGw9PT1qLnByb2Nlc3NpbmcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJub0xvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMSxqLnByb2Nlc3Npbmcubm9Mb29wKCl9KSxqLmZyYW1lUmF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5mcmFtZVJhdGUoYS52KX0pLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLmhlaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGoucmVuZGVyTW9kZT1qLlAyRCxqLnNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjJiYoYz1qLlAyRCksai5wcm9jZXNzaW5nLnNpemUoYS52LGIudixjLnYpLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcud2lkdGgpLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhlaWdodCksai5yZW5kZXJNb2RlPWN9KSxqLmV4aXRwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZXhpdCgpfSksai5tb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVgpfSksai5tb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVkpfSksai5wbW91c2VYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucG1vdXNlWCl9KSxqLnBtb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VZKX0pLGoucmVjdE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucmVjdE1vZGUoYS52KX0pLGouc3Ryb2tlV2VpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZVdlaWdodChhLnYpfSksai5zbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5zbW9vdGgoKX0pLGoubm9TbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1Ntb290aCgpfSksai5lbGxpcHNlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5lbGxpcHNlTW9kZShhLnYpfSksai5zdHJva2VDYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlQ2FwKGEudil9KSxqLnN0cm9rZUpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlSm9pbihhLnYpfSksai5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlKGEudil9KSxqLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWChhLnYpfSksai5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVkoYS52KX0pLGoucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVaKGEudil9KSxqLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy5zY2FsZShhLnYsYixjKX0pLGoudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy50cmFuc2xhdGUoYS52LGIsYyl9KSxqLnBvcE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnBvcE1hdHJpeCgpfSksai5wdXNoTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHVzaE1hdHJpeCgpfSksai5hcHBseU1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGEsYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwxNik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYlthXT8wOmJbYV0udjtqLnByb2Nlc3NpbmcuYXBwbHlNYXRyaXguYXBwbHkoai5wcm9jZXNzaW5nLGIpfSksai5yZXNldE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnJlc2V0TWF0cml4KCl9KSxqLnByaW50TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShqLnByb2Nlc3NpbmcucHJpbnRNYXRyaXgoKSl9KSxqLnJ1bj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXFxcIlByb2Nlc3NpbmcgbW9kdWxlOiBDYW52YXMgZWxlbWVudCBub3Qgc3BlY2lmaWVkXFxcIik7aWYod2luZG93LlByb2Nlc3NpbmcubG9nZ2VyPXtsb2c6ZnVuY3Rpb24oYSl7U2subWlzY2V2YWwucHJpbnRfKGEpfX0sbT13aW5kb3cuUHJvY2Vzc2luZy5nZXRJbnN0YW5jZUJ5SWQoU2suY2FudmFzKSxtJiZtLmV4aXQoKSxqLnA9bmV3IHdpbmRvdy5Qcm9jZXNzaW5nKGEsZnVuY3Rpb24gc2tldGNoUHJvYyhhKXtqLnByb2Nlc3Npbmc9YSxhLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYj0hMTtmb3IodmFyIGMgaW4gaykwPT09a1tjXS53aWR0aCYmKGI9ITApO2lmKCEwPT1iKXJldHVybiEwPT09bD92b2lkIDA6dm9pZCBhLmxvb3AoKTtpZighMT09PWwmJmEubm9Mb29wKCksai5mcmFtZUNvdW50PWEuZnJhbWVDb3VudCxTay5nbG9iYWxzLmRyYXcpdHJ5e1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5nbG9iYWxzLmRyYXcpfWNhdGNoKGEpe1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGEpfX07dmFyIGI9W1xcXCJzZXR1cFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZUNsaWNrZWRcXFwiLFxcXCJtb3VzZURyYWdnZWRcXFwiLFxcXCJtb3VzZU1vdmVkXFxcIixcXFwibW91c2VPdXRcXFwiLFxcXCJtb3VzZU92ZXJcXFwiLFxcXCJtb3VzZVByZXNzZWRcXFwiLFxcXCJtb3VzZVJlbGVhc2VkXFxcIixcXFwia2V5UHJlc3NlZFxcXCIsXFxcImtleVJlbGVhc2VkXFxcIixcXFwia2V5VHlwZWRcXFwiXTtmb3IodmFyIGMgaW4gYilTay5nbG9iYWxzW2JbY11dJiYoYVtiW2NdXT1uZXcgRnVuY3Rpb24oXFxcInRyeSB7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHNbJ1xcXCIrYltjXStcXFwiJ10pO30gY2F0Y2goZSkge1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGUpO31cXFwiKSl9KSwwPT09ai53aWR0aC52JiYwPT09ai5oZWlnaHQudil7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLnNpemUsW25ldyBTay5idWlsdGluLmludF8oYiksbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxqLnJlbmRlck1vZGVdKX19KSxnPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVgpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VZKTpcXFwicHhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VYKTpcXFwicHlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VZKTpcXFwicHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLl9fbW91c2VQcmVzc2VkKTpcXFwiYnV0dG9uXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VCdXR0b24pOnZvaWQgMH0pfSxqLk1vdXNlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixnLFxcXCJNb3VzZVxcXCIsW10pLGoubW91c2U9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouTW91c2UpLGY9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJrZXlcXFwiPT09Yik/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXkudG9TdHJpbmcoKSk6XFxcImtleUNvZGVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5rZXlDb2RlKTpcXFwia2V5UHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLnN0cihqLnByb2Nlc3Npbmcua2V5UHJlc3NlZCk6dm9pZCAwfSl9LGouS2V5Ym9hcmQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGYsXFxcIktleWJvYXJkXFxcIixbXSksai5rZXlib2FyZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5LZXlib2FyZCksZT1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImZyYW1lQ291bnRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVDb3VudCk6XFxcImZyYW1lUmF0ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmZyYW1lUmF0ZSk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOlxcXCJvbmxpbmVcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5vbmxpbmUpOlxcXCJmb2N1c2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuZm9jdXNlZCk6dm9pZCAwfSl9LGouRW52aXJvbm1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGUsXFxcIkVudmlyb25tZW50XFxcIixbXSksai5lbnZpcm9ubWVudD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5FbnZpcm9ubWVudCksZD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnBpeGVscz1udWxsfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOihcXFwicGl4ZWxzXFxcIj09PWImJm51bGw9PWEucGl4ZWxzJiYoYS5waXhlbHM9bmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcucGl4ZWxzLnRvQXJyYXkoKSkpLGEucGl4ZWxzKX0pfSxqLlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZCxcXFwiU2NyZWVuXFxcIixbXSksai5zY3JlZW49U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouU2NyZWVuKSxqLmxvYWRQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5sb2FkUGl4ZWxzKCl9KSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksYS52PWoucHJvY2Vzc2luZy5jb2xvcihiLnYsYyxkLGUpfSl9LGouY29sb3I9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGMsXFxcImNvbG9yXFxcIixbXSksai5yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGEudikpfSksai5ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihhLnYpKX0pLGouYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ibHVlKGEudikpfSksYj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LndpZHRoKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYuaGVpZ2h0KTp2b2lkIDB9KX0sai5sb2FkSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1qLnByb2Nlc3NpbmcubG9hZEltYWdlKGEudik7ay5wdXNoKGIpO3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1iLGN9KSxqLmltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmltYWdlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYsZC52LGUudil9KSxqLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ai5wcm9jZXNzaW5nLmdldChhLnYsYi52KTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnJlZChjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZ3JlZW4oYykpLG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYykpXSl9KSxqLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3Npbmcuc2V0KGEudixiLnYsYy52KX0pLGg9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi54KTpcXFwieVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LnkpOlxcXCJ6XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueik6dm9pZCAwfSksYi5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYi52PWEudi5nZXQoKSxifSksYi5zZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNldChiLnYsYy52KTphLnYuc2V0KGIudixjLnYsZC52KX0pLGIubWFnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52Lm1hZygpKX0pLGIuYWRkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5hZGQoYi52KSxjfSksYi5zdWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LnN1YihiLnYpLGN9KSxiLm11bHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52Lm11bHQoYi52KSxjfSksYi5kaXY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmRpdihiLnYpLGN9KSxiLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5kaXN0KGIudikpfSksYi5kb3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudikpOlNrLmJ1aWx0aW4uYXNzayQoYS52LmRvdChiLnYsYy52LGQudikpfSksYi5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuY3Jvc3MoYi52KSxjfSksYi5ub3JtYWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYubm9ybWFsaXplKCl9KSxiLmxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYubGltaXQoYi52KX0pLGIuYW5nbGVCZXR3ZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYuYW5nbGVCZXR3ZWVuKGIudikpfSksYi5hcnJheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5hcnJheSgpKX0pfSxmb250Q2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEZvbnQ6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudil9KSxiLmxpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYubGlzdCgpKX0pfSxncmFwaGljc0NsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYsZC52KX0pLGIuYmVnaW5EcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmJlZ2luRHJhdygpfSksYi5lbmREcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuZERyYXcoKX0pfSxzaGFwZUNsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bnVsbDpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwid2lkdGhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pLGIuaXNWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYS52LmlzVmlzaWJsZSgpKX0pLGIuc2V0VmlzaWJsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnNldFZpc2libGUoYi52KX0pLGIuZGlzYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmRpc2FibGVTdHlsZSgpfSksYi5lbmFibGVTdHlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5lbmFibGVTdHlsZSgpfSksYi5nZXRDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldENoaWxkKGIudik7aWYobnVsbCE9Yyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHKTtyZXR1cm4gZC52PWMsZH1yZXR1cm4gbnVsbH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi50cmFuc2xhdGUoYi52LGMudik6YS52LnRyYW5zbGF0ZShiLnYsYy52LGQudil9KSxiLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJvdGF0ZShiLnYpfSksYi5yb3RhdGVYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlWChiLnYpfSksYi5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LnJvdGF0ZVkoYW5nbGUudil9KSxiLnJvdGF0ZVo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWihhbmdsZS52KX0pLGIuc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/YS52LnNjYWxlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi5zY2FsZShiLnYsYy52KTphLnYuc2NhbGUoYi52LGMudixkLnYpfSl9LGouUEZvbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGZvbnRDbGFzcyxcXFwiUEZvbnRcXFwiLFtdKSxqLlBHcmFwaGljcz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZ3JhcGhpY3NDbGFzcyxcXFwiUEdyYXBoaWNzXFxcIixbXSksai5QU2hhcGVTVkc9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLHNoYXBlQ2xhc3MsXFxcIlBTaGFwZVNWR1xcXCIsW10pLGouUFZlY3Rvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosaCxcXFwiUFZlY3RvclxcXCIsW10pLGouUEltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixiLFxcXCJQSW1hZ2VcXFwiLFtdKSxqfTtcIixcInNyYy9saWIvcHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BzdGF0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHN0YXRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwdHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweV9jb21waWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHljbGJyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWNsYnIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvY190b3BpY3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5ZG9jX3RvcGljcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJzdGFja1xcXCJdXFxuXFxuXFxuZnJvbSAuc3RhY2sgaW1wb3J0IFN0YWNrXFxuZnJvbSAucXVldWUgaW1wb3J0IFF1ZXVlXFxuZnJvbSAuZGVxdWUgaW1wb3J0IERlcXVlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL2RlcXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgZGVxdWUucHlcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFkZEZyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZFJlYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlRnJvbnQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlUmVhcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvcXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBxdWV1ZS5weVxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgZW5xdWV1ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiBkZXF1ZXVlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL3N0YWNrLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgc3RhY2sucHlcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIHB1c2goc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgcG9wKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcykgLSAxXVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgVmVydGV4XFxuZnJvbSAucHJpb3JpdHlRdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvYWRqR3JhcGgucHlcIjpcIiNcXG4jICBhZGpHcmFwaFxcbiNcXG4jICBDcmVhdGVkIGJ5IEJyYWQgTWlsbGVyIG9uIDIwMDUtMDItMjQuXFxuIyAgQ29weXJpZ2h0IChjKSAyMDA1IEJyYWQgTWlsbGVyLCBEYXZpZCBSYW51bSwgTHV0aGVyIENvbGxlZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFxuI1xcblxcbmltcG9ydCBzeXNcXG5pbXBvcnQgb3NcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi52ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZGRWZXJ0ZXgoc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IHNlbGYubnVtVmVydGljZXMgKyAxXFxuICAgICAgICBuZXdWZXJ0ZXggPSBWZXJ0ZXgoa2V5KVxcbiAgICAgICAgc2VsZi52ZXJ0aWNlc1trZXldID0gbmV3VmVydGV4XFxuICAgICAgICByZXR1cm4gbmV3VmVydGV4XFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGV4KHNlbGYsbik6XFxuICAgICAgICBpZiBuIGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYudmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi52ZXJ0aWNlc1xcbiAgICBcXG4gICAgZGVmIGFkZEVkZ2Uoc2VsZixmLHQsY29zdD0wKTpcXG4gICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KGYpXFxuICAgICAgICAgICAgaWYgdCBub3QgaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFkZFZlcnRleCh0KVxcbiAgICAgICAgICAgIHNlbGYudmVydGljZXNbZl0uYWRkTmVpZ2hib3Ioc2VsZi52ZXJ0aWNlc1t0XSxjb3N0KVxcbiAgICBcXG4gICAgZGVmIGdldFZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi52ZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi52ZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGV4OlxcbiAgICBkZWYgX19pbml0X18oc2VsZixudW0pOlxcbiAgICAgICAgc2VsZi5pZCA9IG51bVxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUbyA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ3doaXRlJ1xcbiAgICAgICAgc2VsZi5kaXN0ID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYucHJlZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuZGlzYyA9IDBcXG4gICAgICAgIHNlbGYuZmluID0gMFxcblxcbiAgICAjIGRlZiBfX2x0X18oc2VsZixvKTpcXG4gICAgIyAgICAgcmV0dXJuIHNlbGYuaWQgPCBvLmlkXFxuICAgIFxcbiAgICBkZWYgYWRkTmVpZ2hib3Ioc2VsZixuYnIsd2VpZ2h0PTApOlxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUb1tuYnJdID0gd2VpZ2h0XFxuICAgICAgICBcXG4gICAgZGVmIHNldENvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIHNldERpc3RhbmNlKHNlbGYsZCk6XFxuICAgICAgICBzZWxmLmRpc3QgPSBkXFxuXFxuICAgIGRlZiBzZXRQcmVkKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWQgPSBwXFxuXFxuICAgIGRlZiBzZXREaXNjb3Zlcnkoc2VsZixkdGltZSk6XFxuICAgICAgICBzZWxmLmRpc2MgPSBkdGltZVxcbiAgICAgICAgXFxuICAgIGRlZiBzZXRGaW5pc2goc2VsZixmdGltZSk6XFxuICAgICAgICBzZWxmLmZpbiA9IGZ0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIGdldEZpbmlzaChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBnZXREaXNjb3Zlcnkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXNjXFxuICAgICAgICBcXG4gICAgZGVmIGdldFByZWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wcmVkXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRDb2xvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbG9yXFxuICAgIFxcbiAgICBkZWYgZ2V0Q29ubmVjdGlvbnMoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRUby5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0V2VpZ2h0KHNlbGYsbmJyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvW25icl1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRpc2MgXFxcIiArIHN0cihzZWxmLmRpc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3QgXFxcIiArIHN0cihzZWxmLmRpc3QpICsgXFxcIjpwcmVkIFxcXFxuXFxcXHRbXFxcIiArIHN0cihzZWxmLnByZWQpKyBcXFwiXVxcXFxuXFxcIlxcbiAgICBcXG4gICAgZGVmIGdldElkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cXG5jbGFzcyBhZGpHcmFwaFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50R3JhcGggPSBHcmFwaCgpXFxuICAgICAgICBcXG4gICAgZGVmIHRlc3RNYWtlR3JhcGgoc2VsZik6XFxuICAgICAgICBnRmlsZSA9IG9wZW4oXFxcInRlc3QuZGF0XFxcIilcXG4gICAgICAgIGZvciBsaW5lIGluIGdGaWxlOlxcbiAgICAgICAgICAgIGZWZXJ0ZXgsIHRWZXJ0ZXggPSBsaW5lLnNwbGl0KCd8JylcXG4gICAgICAgICAgICBmVmVydGV4ID0gaW50KGZWZXJ0ZXgpXFxuICAgICAgICAgICAgdFZlcnRleCA9IGludCh0VmVydGV4KVxcbiAgICAgICAgICAgIHNlbGYudEdyYXBoLmFkZEVkZ2UoZlZlcnRleCx0VmVydGV4KVxcbiAgICAgICAgZm9yIGkgaW4gc2VsZi50R3JhcGg6XFxuICAgICAgICAgICAgYWRqID0gaS5nZXRBZGooKVxcbiAgICAgICAgICAgIGZvciBrIGluIGFkajpcXG4gICAgICAgICAgICAgICAgcHJpbnQoaSwgaylcXG5cXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcbiAgICAgICAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9wcmlvcml0eVF1ZXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG4jIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLFxcbiMgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGVcXG5cXG5jbGFzcyBQcmlvcml0eVF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkgPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiBhbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4oYWxpc3QpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVswXSA+IHNlbGYuaGVhcEFycmF5W21jXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSBzZWxmLmhlYXBBcnJheVttY11cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaSoyXVswXSA8IHNlbGYuaGVhcEFycmF5W2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdIDwgc2VsZi5oZWFwQXJyYXlbaS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpLy8yXSA9IHNlbGYuaGVhcEFycmF5W2ldXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGFkZChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkuYXBwZW5kKGspXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSArIDFcXG4gICAgICAgIHNlbGYucGVyY1VwKHNlbGYuY3VycmVudFNpemUpXFxuXFxuICAgIGRlZiBkZWxNaW4oc2VsZik6XFxuICAgICAgICByZXR2YWwgPSBzZWxmLmhlYXBBcnJheVsxXVsxXVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXlbMV0gPSBzZWxmLmhlYXBBcnJheVtzZWxmLmN1cnJlbnRTaXplXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgLSAxXFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5jdXJyZW50U2l6ZSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgZGVjcmVhc2VLZXkoc2VsZix2YWwsYW10KTpcXG4gICAgICAgICMgdGhpcyBpcyBhIGxpdHRsZSB3aWVyZCwgYnV0IHdlIG5lZWQgdG8gZmluZCB0aGUgaGVhcCB0aGluZyB0byBkZWNyZWFzZSBieVxcbiAgICAgICAgIyBsb29raW5nIGF0IGl0cyB2YWx1ZVxcbiAgICAgICAgZG9uZSA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbXlLZXkgPSAwXFxuICAgICAgICB3aGlsZSBub3QgZG9uZSBhbmQgaSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzFdID09IHZhbDpcXG4gICAgICAgICAgICAgICAgZG9uZSA9IFRydWVcXG4gICAgICAgICAgICAgICAgbXlLZXkgPSBpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICBpZiBteUtleSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbXlLZXldID0gKGFtdCxzZWxmLmhlYXBBcnJheVtteUtleV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5wZXJjVXAobXlLZXkpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2dHgpOlxcbiAgICAgICAgZm9yIHBhaXIgaW4gc2VsZi5oZWFwQXJyYXk6XFxuICAgICAgICAgICAgaWYgcGFpclsxXSA9PSB2dHg6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbmNsYXNzIFRlc3RCaW5IZWFwKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwID0gUHJpb3JpdHlRdWV1ZSgpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgyLCd4JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgzLCd5JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg1LCd6JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg2LCdhJykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg0LCdkJykpXFxuXFxuXFxuICAgIGRlZiB0ZXN0SW5zZXJ0KHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5jdXJyZW50U2l6ZSA9PSA1XFxuXFxuICAgIGRlZiB0ZXN0RGVsbWluKHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneCdcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ3knXFxuICAgIFxcbiAgICBkZWYgdGVzdERlY0tleShzZWxmKTpcXG4gICAgICAgIHNlbGYudGhlSGVhcC5kZWNyZWFzZUtleSgnZCcsMSlcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ2QnXFxuICAgICAgICBcXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxcbiAgICB1bml0dGVzdC5tYWluKClcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvX19pbml0X18ucHlcIjpcIlxcbmZyb20gLmJpbmFyeVRyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIC5iYWxhbmNlIGltcG9ydCBBVkxUcmVlXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSAuYmluaGVhcCBpbXBvcnQgQmluSGVhcFxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iYWxhbmNlLnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmZyb20gLmJzdCBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZSwgVHJlZU5vZGVcXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGhhc19rZXkoaylcXG4gICAgICAgICAgICAgICAgICBpdGVtcygpIFxcbiAgICAgICAgICAgICAgICAgIGtleXMoKSBcXG4gICAgICAgICAgICAgICAgICB2YWx1ZXMoKVxcbiAgICAgICAgICAgICAgICAgIHB1dChrLHYpXFxuICAgICcnJ1xcblxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5yaWdodENoaWxkKSAgICAgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHVwZGF0ZUJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlRmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50ICE9IE5vbmU6XFxuICAgICAgICAgICAgaWYgbm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yICs9IDFcXG4gICAgICAgICAgICBlbGlmIG5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgLT0gMVxcblxcbiAgICAgICAgICAgIGlmIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsbm9kZSk6XFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUucmlnaHRDaGlsZC5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgIGVsaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmxlZnRDaGlsZC5iYWxhbmNlRmFjdG9yIDwgMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBSTCBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSByaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVMZWZ0KHNlbGYscm90Um9vdCk6XFxuICAgICAgICBuZXdSb290ID0gcm90Um9vdC5yaWdodENoaWxkXFxuICAgICAgICByb3RSb290LnJpZ2h0Q2hpbGQgPSBuZXdSb290LmxlZnRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5sZWZ0Q2hpbGQgIT0gTm9uZTpcXG4gICAgICAgICAgICBuZXdSb290LmxlZnRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QubGVmdENoaWxkID0gcm90Um9vdFxcbiAgICAgICAgcm90Um9vdC5wYXJlbnQgPSBuZXdSb290XFxuICAgICAgICByb3RSb290LmJhbGFuY2VGYWN0b3IgPSByb3RSb290LmJhbGFuY2VGYWN0b3IgKyAxIC0gbWluKG5ld1Jvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIG5ld1Jvb3QuYmFsYW5jZUZhY3RvciA9IG5ld1Jvb3QuYmFsYW5jZUZhY3RvciArIDEgKyBtYXgocm90Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcblxcblxcbiAgICBkZWYgcm90YXRlUmlnaHQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LmxlZnRDaGlsZFxcbiAgICAgICAgcm90Um9vdC5sZWZ0Q2hpbGQgPSBuZXdSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIGlmIG5ld1Jvb3QucmlnaHRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICBuZXdSb290LnJpZ2h0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciAtIDEgLSBtYXgobmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSArIG1pbihyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluYXJ5VHJlZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG4gICAgXFxcIlxcXCJcXFwiICAgIFxcbiAgICBkZWYgX19pbml0X18oc2VsZixyb290T2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gcm9vdE9ialxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSBOb25lXFxuXFxuICAgIGRlZiBpbnNlcnRMZWZ0KHNlbGYsbmV3Tm9kZSk6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQubGVmdCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSB0XFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0UmlnaHQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgICAgICB0LnJpZ2h0ID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gdFxcblxcbiAgICBkZWYgaXNMZWFmKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgobm90IHNlbGYubGVmdENoaWxkKSBhbmQgKG5vdCBzZWxmLnJpZ2h0Q2hpbGQpKVxcblxcbiAgICBkZWYgZ2V0UmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG5cXG4gICAgZGVmIGdldExlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgc2V0Um9vdFZhbChzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmtleSA9IG9ialxcblxcbiAgICBkZWYgZ2V0Um9vdFZhbChzZWxmLCk6XFxuICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5pbm9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG5cXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wcmVvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByZW9yZGVyKClcXG5cXG4gICAgZGVmIHByaW50ZXhwKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wcmludGV4cCgpXFxuICAgICAgICAgICAgcHJpbnQoJyknKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyZXZhbChzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcmV2YWwoKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmtleV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYua2V5XFxuXFxuZGVmIGlub3JkZXIodHJlZSk6XFxuICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZXIodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHByaW50KHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldFJpZ2h0Q2hpbGQoKSlcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIGlmIHRyZWUubGVmdENoaWxkOlxcbiAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgIGlmIHRyZWUucmlnaHRDaGlsZDpcXG4gICAgICAgIHByaW50ZXhwKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQoJyknKSBcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIHNWYWwgPSBcXFwiXFxcIlxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgc1ZhbCA9ICcoJyArIHByaW50ZXhwKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgICAgICBzVmFsID0gc1ZhbCArIHN0cih0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpICsgJyknXFxuICAgIHJldHVybiBzVmFsXFxuXFxuZGVmIHBvc3RvcmRlcmV2YWwodHJlZSk6XFxuICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgcmVzMSA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRMZWZ0Q2hpbGQoKSkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRSaWdodENoaWxkKCkpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3RyZWUuZ2V0Um9vdFZhbCgpXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gdHJlZS5nZXRSb290VmFsKClcXG5cXG5kZWYgaGVpZ2h0KHRyZWUpOlxcbiAgICBpZiB0cmVlID09IE5vbmU6XFxuICAgICAgICByZXR1cm4gLTFcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodCh0cmVlLmxlZnRDaGlsZCksaGVpZ2h0KHRyZWUucmlnaHRDaGlsZCkpXFxuXFxuIyB0ID0gQmluYXJ5VHJlZSg3KVxcbiMgdC5pbnNlcnRMZWZ0KDMpXFxuIyB0Lmluc2VydFJpZ2h0KDkpXFxuIyBpbm9yZGVyKHQpXFxuIyBpbXBvcnQgb3BlcmF0b3JcXG4jIHggPSBCaW5hcnlUcmVlKCcqJylcXG4jIHguaW5zZXJ0TGVmdCgnKycpXFxuIyBsID0geC5nZXRMZWZ0Q2hpbGQoKVxcbiMgbC5pbnNlcnRMZWZ0KDQpXFxuIyBsLmluc2VydFJpZ2h0KDUpXFxuIyB4Lmluc2VydFJpZ2h0KDcpXFxuIyBwcmludChwcmludGV4cCh4KSlcXG4jIHByaW50KHBvc3RvcmRlcmV2YWwoeCkpXFxuIyBwcmludChoZWlnaHQoeCkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JpbmhlYXAucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcblxcbiMgdGhpcyBoZWFwIHRha2VzIGtleSB2YWx1ZSBwYWlycywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgaW50ZWdlcnNcXG5jbGFzcyBCaW5IZWFwOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0ID0gWzBdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gMFxcblxcblxcbiAgICBkZWYgYnVpbGRIZWFwKHNlbGYsYWxpc3QpOlxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMlxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IGxlbihhbGlzdClcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF0gKyBhbGlzdFs6XVxcbiAgICAgICAgcHJpbnQobGVuKHNlbGYuaGVhcExpc3QpLCBpKVxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBwcmludChzZWxmLmhlYXBMaXN0LCBpKVxcbiAgICAgICAgICAgIHNlbGYucGVyY0Rvd24oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsaSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIHBlcmNEb3duKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgbWMgPSBzZWxmLm1pbkNoaWxkKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA+IHNlbGYuaGVhcExpc3RbbWNdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBMaXN0W2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSBzZWxmLmhlYXBMaXN0W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W21jXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBtY1xcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIG1pbkNoaWxkKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2kgKiAyXSA8IHNlbGYuaGVhcExpc3RbaSAqIDIgKyAxXTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyICsgMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaV0gPCBzZWxmLmhlYXBMaXN0W2kvLzJdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaSAvLyAyXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaSAvLyAyXSA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkgLy8gMlxcbiBcXG4gICAgZGVmIGluc2VydChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcExpc3RbMV1cXG4gICAgICAgIHNlbGYuaGVhcExpc3RbMV0gPSBzZWxmLmhlYXBMaXN0W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcExpc3QucG9wKClcXG4gICAgICAgIHNlbGYucGVyY0Rvd24oMSlcXG4gICAgICAgIHJldHVybiByZXR2YWxcXG4gICAgICAgIFxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIGlmIGN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JzdC5weVwiOlwiIyEvYmluL2VudiBweXRob24zLjFcXG4jIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1LCAyMDEwXFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgICAgICAgICAgICAgICBpblxcbiAgICAgICAgICAgICAgICAgIGRlbCA8PT0+IFxcbiAgICAnJydcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5zaXplID0gMFxcbiAgICBcXG4gICAgZGVmIHB1dChzZWxmLGtleSx2YWwpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLHNlbGYucm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gVHJlZU5vZGUoa2V5LHZhbClcXG4gICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZixrZXksdmFsLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixrLHYpOlxcbiAgICAgICAgc2VsZi5wdXQoayx2KVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYucm9vdDpcXG4gICAgICAgICAgICByZXMgPSBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdClcXG4gICAgICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMucGF5bG9hZFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBcXG4gICAgZGVmIF9nZXQoc2VsZixrZXksY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnROb2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgXFxuICAgICAgICBcXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHJlcyA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgICAgICBcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdCk6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgICBcXG4gICAgZGVmIGxlbmd0aChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJvb3QuX19pdGVyX18oKVxcbiAgICBcXG4gICAgZGVmIGRlbGV0ZShzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLnNpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZSA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVUb1JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUobm9kZVRvUmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUtMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgIGVsaWYgc2VsZi5zaXplID09IDEgYW5kIHNlbGYucm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHNlbGYuZGVsZXRlKGtleSlcXG4gICAgXFxuICAgIGRlZiByZW1vdmUoc2VsZixjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlYWYoKTogI2xlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZSA9PSBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5oYXNCb3RoQ2hpbGRyZW4oKTogI2ludGVyaW9yXFxuICAgICAgICAgICAgc3VjYyA9IGN1cnJlbnROb2RlLmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Muc3BsaWNlT3V0KClcXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5rZXkgPSBzdWNjLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnBheWxvYWQgPSBzdWNjLnBheWxvYWRcXG4gICAgICAgIGVsc2U6ICMgdGhpcyBub2RlIGhhcyBvbmUgY2hpbGRcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yZXBsYWNlTm9kZURhdGEoY3VycmVudE5vZGUubGVmdENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQubGVmdENoaWxkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5yaWdodENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBheWxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX2lub3JkZXIoc2VsZix0cmVlKTpcXG4gICAgICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wb3N0b3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wcmVvcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSkgICAgICAgICAgICBcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFRyZWVOb2RlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixrZXksdmFsLGxlZnQ9Tm9uZSxyaWdodD1Ob25lLHBhcmVudD1Ob25lKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWxcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gbGVmdFxcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmlnaHRcXG4gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50XFxuICAgICAgICBzZWxmLmJhbGFuY2VGYWN0b3IgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGhhc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiBpc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQubGVmdENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc1Jvb3Qoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGQpXFxuXFxuICAgIGRlZiBoYXNBbnlDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIGhhc0JvdGhDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgYW5kIHNlbGYubGVmdENoaWxkXFxuICAgIFxcbiAgICBkZWYgcmVwbGFjZU5vZGVEYXRhKHNlbGYsa2V5LHZhbHVlLGxjLHJjKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsY1xcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmNcXG4gICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGZcXG4gICAgICAgIFxcbiAgICBkZWYgZmluZFN1Y2Nlc3NvcihzZWxmKTpcXG4gICAgICAgIHN1Y2MgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzdWNjID0gc2VsZi5yaWdodENoaWxkLmZpbmRNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50LmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNjXFxuXFxuXFxuICAgIGRlZiBzcGxpY2VPdXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmlzTGVhZigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYuaGFzQW55Q2hpbGRyZW4oKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wYXJlbnQgPSBzZWxmLnBhcmVudFxcblxcbiAgICBkZWYgZmluZE1pbihzZWxmKTpcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50Lmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmxlZnRDaGlsZFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVGhlIHN0YW5kYXJkIGlub3JkZXIgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYua2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG4gICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy5iYXNpYyBpbXBvcnQgU3RhY2ssIFF1ZXVlLCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgR3JhcGgsIFZlcnRleFxcbmZyb20gcHl0aG9uZHMzLnNlYXJjaGluZyBpbXBvcnQgSGFzaFRhYmxlXFxuZnJvbSBweXRob25kczMudHJlZXMgaW1wb3J0IChcXG4gICAgQmluYXJ5VHJlZSxcXG4gICAgQVZMVHJlZSxcXG4gICAgQmluYXJ5U2VhcmNoVHJlZSxcXG4gICAgQmluYXJ5SGVhcCxcXG4gICAgUHJpb3JpdHlRdWV1ZSxcXG4pXFxuXFxuX19hbGxfXyA9IFtcXG4gICAgXFxcIlN0YWNrXFxcIixcXG4gICAgXFxcIlF1ZXVlXFxcIixcXG4gICAgXFxcIkRlcXVlXFxcIixcXG4gICAgXFxcIkdyYXBoXFxcIixcXG4gICAgXFxcIlZlcnRleFxcXCIsXFxuICAgIFxcXCJIYXNoVGFibGVcXFwiLFxcbiAgICBcXFwiQmluYXJ5VHJlZVxcXCIsXFxuICAgIFxcXCJBVkxUcmVlXFxcIixcXG4gICAgXFxcIkJpbmFyeVNlYXJjaFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5SGVhcFxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIlByaW9yaXR5UXVldWVcXFwiLFxcbl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmJhc2ljIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgT3JkZXJlZExpc3RcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgVW5vcmRlcmVkTGlzdFxcblxcbl9fYWxsX18gPSBbXFxcIlN0YWNrXFxcIiwgXFxcIlF1ZXVlXFxcIiwgXFxcIkRlcXVlXFxcIiwgXFxcIk9yZGVyZWRMaXN0XFxcIiwgXFxcIlVub3JkZXJlZExpc3RcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvZGVxdWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgRGVxdWU6XFxuICAgIFxcXCJcXFwiXFxcIlF1ZXVlIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBkZXF1ZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgYWRkX2Zyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZGRfcmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVfZnJvbnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlX3JlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL2xpbmtlZF9saXN0LnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIExpbmtlZExpc3ROb2RlOlxcbiAgICBcXFwiXFxcIlxcXCJBIG5vZGUgb2YgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZV9kYXRhKTpcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBub2RlX2RhdGFcXG4gICAgICAgIHNlbGYuX25leHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfZGF0YShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGRhdGFcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXRhXFxuXFxuICAgIGRlZiBzZXRfZGF0YShzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcblxcbiAgICBkYXRhID0gcHJvcGVydHkoZ2V0X2RhdGEsIHNldF9kYXRhKVxcblxcbiAgICBkZWYgZ2V0X25leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbmV4dCBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmV4dFxcblxcbiAgICBkZWYgc2V0X25leHQoc2VsZiwgbm9kZV9uZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25leHQgPSBub2RlX25leHRcXG5cXG4gICAgbmV4dCA9IHByb3BlcnR5KGdldF9uZXh0LCBzZXRfbmV4dClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5fZGF0YSlcXG5cXG5cXG5jbGFzcyBMaW5rZWRMaXN0OlxcbiAgICBcXFwiXFxcIlxcXCJMaW5rZWQgTGlzdCBjbGFzcyBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gMFxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJcyB0aGUgbGlzdCBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWQgaXMgTm9uZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxpc3QgYXMgYSBzdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpc3Rfc3RyID0gXFxcIltcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBsaXN0X3N0ciArPSBzdHIoY3VycmVudClcXG4gICAgICAgICAgICBpZiBjdXJyZW50Lm5leHQ6XFxuICAgICAgICAgICAgICAgIGxpc3Rfc3RyICs9IFxcXCIsIFxcXCJcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICBsaXN0X3N0ciArPSBcXFwiXVxcXCJcXG4gICAgICAgIHJldHVybiBsaXN0X3N0clxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBVbm9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJVbm9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIHVub3JkZXJlZCBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgTGlua2VkTGlzdC5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcbiAgICAgICAgbmV3X25vZGUuc2V0X25leHQoc2VsZi5faGVhZClcXG4gICAgICAgIHNlbGYuX2hlYWQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQuZGF0YSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhZCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgLSAxXFxuICAgICAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSBsaXN0XFxcIi5mb3JtYXQodmFsdWUpKVxcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcblxcbmNsYXNzIE9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJPcmRlcmVkIGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBPcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuICAgICAgICBwcmV2ID0gTm9uZVxcbiAgICAgICAgbmV3X25vZGUgPSBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSlcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQgYW5kIGN1cnJlbnQuZGF0YSA8IHZhbHVlOlxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcblxcbiAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBzZWxmLl9oZWFkXFxuICAgICAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBjdXJyZW50XFxuICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3X25vZGVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhpcyBpcyBhbiBleGVyY2lzZVxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBRdWV1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvc3RhY2sucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgU3RhY2s6XFxuICAgIFxcXCJcXFwiXFxcIlN0YWNrIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBzdGFjayBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBwZWVrKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9wIGl0ZW0gaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXNbLTFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuZ3JhcGhzLmFkamFjZW5jeV9ncmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBWZXJ0ZXhcXG5cXG5fX2FsbF9fID0gW1xcXCJHcmFwaFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvYWRqYWNlbmN5X2dyYXBoLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcbmltcG9ydCBzeXNcXG5cXG5cXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIHZlcnRleCBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdmVydGV4XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX25laWdoYm9ycyA9IHt9XFxuICAgICAgICBzZWxmLl9jb2xvciA9IFxcXCJ3aGl0ZVxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYuX3ByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSAwXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSAwXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVzcyB0aGFuIG9wZXJhdG9yIHJlcXVpcmVkIGZvciBoZWFwaWZ5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5rZXkgPCBvdGhlci5rZXlcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdmVydGV4IGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBrZXkgPSBwcm9wZXJ0eShnZXRfa2V5KVxcblxcbiAgICBkZWYgZ2V0X25laWdoYm9yKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgZGlzdGFuY2UgKGVkZ2Ugd2VpZ2h0KSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZWlnaGJvcnMuZ2V0KG90aGVyLCBOb25lKVxcblxcbiAgICBkZWYgc2V0X25laWdoYm9yKHNlbGYsIG90aGVyLCB3ZWlnaHQ9MCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGRpc3RhbmNlIChhZGQgYW4gZWRnZSkgdG8gYW4gYWRqYWNlbnQgbm9kZSAobmVpZ2hib3IpXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9uZWlnaGJvcnNbb3RoZXJdID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3JzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFsbCBhZGphY2VudCBub2RlcyAobmVpZ2hib3JzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9jb2xvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb2xvclxcblxcbiAgICBkZWYgc2V0X2NvbG9yKHNlbGYsIGNvbG9yKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3JcXG5cXG4gICAgY29sb3IgPSBwcm9wZXJ0eShnZXRfY29sb3IsIHNldF9jb2xvcilcXG5cXG4gICAgZGVmIGdldF9kaXN0YW5jZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkaXN0YW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBzZXRfZGlzdGFuY2Uoc2VsZiwgZGlzdGFuY2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kaXN0YW5jZSA9IGRpc3RhbmNlXFxuXFxuICAgIGRpc3RhbmNlID0gcHJvcGVydHkoZ2V0X2Rpc3RhbmNlLCBzZXRfZGlzdGFuY2UpXFxuXFxuICAgIGRlZiBnZXRfcHJldmlvdXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcHJldmlvdXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wcmV2aW91c1xcblxcbiAgICBkZWYgc2V0X3ByZXZpb3VzKHNlbGYsIHByZXZpb3VzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBwcmV2aW91c1xcblxcbiAgICBwcmV2aW91cyA9IHByb3BlcnR5KGdldF9wcmV2aW91cywgc2V0X3ByZXZpb3VzKVxcblxcbiAgICBkZWYgZ2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc2NvdmVyeSB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGVmIHNldF9kaXNjb3ZlcnlfdGltZShzZWxmLCBkaXNjb3ZlcnlfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lID0gZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGlzY292ZXJ5X3RpbWUgPSBwcm9wZXJ0eShnZXRfZGlzY292ZXJ5X3RpbWUsIHNldF9kaXNjb3ZlcnlfdGltZSlcXG5cXG4gICAgZGVmIGdldF9jbG9zaW5nX3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2luZ190aW1lXFxuXFxuICAgIGRlZiBzZXRfY2xvc2luZ190aW1lKHNlbGYsIGNsb3NpbmdfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSBjbG9zaW5nX3RpbWVcXG5cXG4gICAgY2xvc2luZ190aW1lID0gcHJvcGVydHkoZ2V0X2Nsb3NpbmdfdGltZSwgc2V0X2Nsb3NpbmdfdGltZSlcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gXFxcIns6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fCB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgIHNlbGYuX2tleSxcXG4gICAgICAgICAgICBzZWxmLl9jb2xvcixcXG4gICAgICAgICAgICBzZWxmLl9kaXN0YW5jZSxcXG4gICAgICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUsXFxuICAgICAgICAgICAgc2VsZi5fcHJldmlvdXMsXFxuICAgICAgICApXFxuXFxuXFxuY2xhc3MgR3JhcGg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIGFzIGFuIGFkamFjZW5jeSBtYXRyaXhcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fdmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fZWRnZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fdGltZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3ZlcnRpY2VzLnZhbHVlcygpKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHcmFwaCdzIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5fdmVydGljZXMpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImluIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3ZlcnRpY2VzXFxuXFxuICAgIGRlZiBnZXRfdmVydGV4KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIG5hbWVkIHZlcnRfa2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmVydGljZXMuZ2V0KGtleSwgTm9uZSlcXG5cXG4gICAgZGVmIHNldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpbnN0YW5jZSBvZiBWZXJ0ZXggdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl92ZXJ0aWNlc1trZXldID0gVmVydGV4KGtleSlcXG5cXG4gICAgZGVmIGFkZF9lZGdlKHNlbGYsIGZyb21fdmVydGV4LCB0b192ZXJ0ZXgsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIHdlaWdodGVkIGFuZCBkaXJlY3RlZCBlZGdlIHRvIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgZnJvbV92ZXJ0ZXggbm90IGluIHNlbGYuX3ZlcnRpY2VzOlxcbiAgICAgICAgICAgIHNlbGYuc2V0X3ZlcnRleChmcm9tX3ZlcnRleClcXG4gICAgICAgIGlmIHRvX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KHRvX3ZlcnRleClcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2Zyb21fdmVydGV4XS5zZXRfbmVpZ2hib3Ioc2VsZi5fdmVydGljZXNbdG9fdmVydGV4XSwgd2VpZ2h0KVxcbiAgICAgICAgc2VsZi5fZWRnZXNbKGZyb21fdmVydGV4LCB0b192ZXJ0ZXgpXSA9IHdlaWdodFxcblxcbiAgICBkZWYgZ2V0X3ZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9lZGdlcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZWRnZXMua2V5cygpXFxuXFxuICAgIGRlZiByZXNldF9kaXN0YW5jZXMoc2VsZiwgZGVmYXVsdF9kaXN0YW5jZT1zeXMubWF4c2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXNldCBkaXN0YW5jZXMgdG8gdGVzdCBEaWprc3RyYSdzXFxcIlxcXCJcXFwiXFxuICAgICAgICBmb3IgdmVydGV4IGluIHNlbGY6XFxuICAgICAgICAgICAgdmVydGV4LmRpc3RhbmNlID0gZGVmYXVsdF9kaXN0YW5jZVxcblxcbiAgICBkZWYgYmZzKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJyZWFkdGggRmlyc3QgU2VhcmNoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIHN0YXJ0LnByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgdmVydF9xdWV1ZSA9IFtzdGFydF1cXG4gICAgICAgIHdoaWxlIHZlcnRfcXVldWU6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ID0gdmVydF9xdWV1ZS5wb3AoMClcXG4gICAgICAgICAgICBmb3IgbmVpZ2ggaW4gY3VycmVudF92ZXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgaWYgbmVpZ2guY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5kaXN0YW5jZSA9IGN1cnJlbnRfdmVydC5kaXN0YW5jZSArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLnByZXZpb3VzID0gY3VycmVudF92ZXJ0XFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0X3F1ZXVlLmFwcGVuZChuZWlnaClcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuXFxuICAgIGRlZiBkZnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJEZXB0aCBGaXJzdCBzZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICBpZiB2ZXJ0ZXguY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQodmVydGV4KVxcblxcbiAgICBkZWYgZGZzX3Zpc2l0KHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRGUyBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmRpc2NvdmVyeV90aW1lID0gc2VsZi5fdGltZVxcbiAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIHN0YXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICBpZiBuZXh0X3ZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5zZXRfcHJldmlvdXMoc3RhcnQpXFxuICAgICAgICAgICAgICAgIHNlbGYuZGZzX3Zpc2l0KG5leHRfdmVydGV4KVxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmNsb3NpbmdfdGltZSA9IHNlbGYuX3RpbWVcXG5cXG4gICAgZGVmIHRyYXZlcnNlKHNlbGYsIHNyYywgZHN0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyYXZlcnNlIGEgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhdGggPSBbXVxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3ZlcnRleChkc3QpXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIHBhdGguYXBwZW5kKGN1cnJlbnQpXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldmlvdXNcXG4gICAgICAgIHByaW50KFxcbiAgICAgICAgICAgIFxcXCJQYXRoIGZyb20ge30gdG8ge30gKHt9KToge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KHNyYykua2V5LFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZHN0KS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmRpc3RhbmNlLFxcbiAgICAgICAgICAgICAgICBcXFwiIFxcXCIuam9pbih2ZXJ0ZXgua2V5IGZvciB2ZXJ0ZXggaW4gcmV2ZXJzZWQocGF0aCkpLFxcbiAgICAgICAgICAgIClcXG4gICAgICAgIClcXG5cXG4gICAgZGVmIGRpamtzdHJhKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRpamtzdHJhJ3Mgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgbm90X3lldF92aXNpdGVkID0gW1tzdGFydC5kaXN0YW5jZSwgc3RhcnRdXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICB3aGlsZSBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ZXggPSBoZWFwcS5oZWFwcG9wKG5vdF95ZXRfdmlzaXRlZClbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5kaXN0YW5jZSArIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgaWYgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2U6XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5kaXN0YW5jZSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIHZlcnRleCBpbiBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVydGV4WzFdLmtleSA9PSBuZXh0X3ZlcnRleC5rZXk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFswXSA9IG5leHRfdmVydGV4LmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBpZnkobm90X3lldF92aXNpdGVkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWVcXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90X3lldF92aXNpdGVkLCBbbmV4dF92ZXJ0ZXguZGlzdGFuY2UsIG5leHRfdmVydGV4XVxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIGJlbGxtYW5fZm9yZChzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCZWxsbWFuLUZvcmQgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKHNlbGYuX3ZlcnRpY2VzKSk6XFxuICAgICAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlID0gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkucHJldmlvdXMgPSBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSlcXG4gICAgICAgIGZvciBlZGdlIGluIHNlbGYuX2VkZ2VzOlxcbiAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgPCBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2VcXG4gICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlLXdlaWdodCBjeWNsZVxcXCIpXFxuXFxuICAgIGRlZiBwcmltKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW0ncyBzcGFubmluZyB0cmVlIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfaW5fYV90cmVlID0gW1t2ZXJ0ZXguZGlzdGFuY2UsIHZlcnRleF0gZm9yIHZlcnRleCBpbiBzZWxmXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgd2hpbGUgbm90X2luX2FfdHJlZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X2luX2FfdHJlZSlbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3IobmV4dF92ZXJ0ZXgpXFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIGFueShpdGVtWzFdID09IG5leHRfdmVydGV4IGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICBhbmQgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnByZXZpb3VzID0gY3VycmVudF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXg6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0gPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcblwiLFwic3JjL2xpYi9weXRob25kczMvaW50cm8vX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuaW50cm8gaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmludHJvLm9vcCBpbXBvcnQgRnJhY3Rpb25cXG5cXG5fX2FsbF9fID0gW1xcXCJGcmFjdGlvblxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9vb3AucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuZGVmIGdjZChudW1iZXIxLCBudW1iZXIyKTpcXG4gICAgXFxcIlxcXCJcXFwiSGVscGVyIGZ1bmN0aW9uIHRvIHNpbXBsaWZ5IGZyYWN0aW9uc1xcXCJcXFwiXFxcIlxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShudW1iZXIxLCBpbnQpIG9yIG5vdCBpc2luc3RhbmNlKG51bWJlcjIsIGludCk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcIk51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgbXVzdCBiZSBpbnRlZ2Vyc1xcXCIpXFxuICAgIHdoaWxlIG51bWJlcjEgJSBudW1iZXIyOlxcbiAgICAgICAgbnVtYmVyMSwgbnVtYmVyMiA9IG51bWJlcjIsIG51bWJlcjEgJSBudW1iZXIyXFxuICAgIHJldHVybiBudW1iZXIyXFxuXFxuXFxuY2xhc3MgRnJhY3Rpb246XFxuICAgIFxcXCJcXFwiXFxcIkZyYWN0aW9uIGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfbnVtZXIsIG5ld19kZW5vbSk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgY29tbW9uID0gZ2NkKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjpcXG4gICAgICAgICAgICByYWlzZVxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXIgLy8gY29tbW9uXFxuICAgICAgICBzZWxmLl9kZW5vbSA9IG5ld19kZW5vbSAvLyBjb21tb25cXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBudW1lcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lclxcblxcbiAgICBAbnVtZXIuc2V0dGVyXFxuICAgIGRlZiBzZXRfbnVtZXIoc2VsZiwgbmV3X251bWVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX251bWVyID0gbmV3X251bWVyXFxuXFxuICAgIGRlZiBnZXRfZGVub20oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kZW5vbVxcblxcbiAgICBkZWYgc2V0X2Rlbm9tKHNlbGYsIG5ld19kZW5vbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tXFxuXFxuICAgICMgQW5vdGhlciB3YXkgdG8gY3JlYXRlIGFuIGF0dHJpYnV0ZVxcbiAgICBkZW5vbSA9IHByb3BlcnR5KGdldF9kZW5vbSwgc2V0X2Rlbm9tKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgc3RyaW5nIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9udW1lciA+IHNlbGYuX2Rlbm9tOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwie30ge30ve31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5fbnVtZXIgLy8gc2VsZi5fZGVub20sIHNlbGYuX251bWVyICUgc2VsZi5fZGVub20sIHNlbGYuX2Rlbm9tXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgcmV0dXJuIFxcXCJ7fS97fVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gcmVwcmVzZW50YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiRnJhY3Rpb24oe30sIHt9KVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJFcXVhbGl0eSBjb21wYXJpc29uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbnVtZXIgKiBvdGhlci5kZW5vbSA9PSBvdGhlci5udW1lciAqIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCB0d28gZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbnVtZXIgPSBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tICsgc2VsZi5fZGVub20gKiBvdGhlci5udW1lclxcbiAgICAgICAgbmV3X2Rlbm9tID0gc2VsZi5fZGVub20gKiBvdGhlci5kZW5vbVxcbiAgICAgICAgcmV0dXJuIEZyYWN0aW9uKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc2VhcmNoaW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNlYXJjaCBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nLmhhc2hfdGFibGUgaW1wb3J0IEhhc2hUYWJsZVxcblxcbl9fYWxsX18gPSBbXFxcIkhhc2hUYWJsZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvaGFzaF90YWJsZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBIYXNoVGFibGU6XFxuICAgIFxcXCJcXFwiXFxcIkhhc2ggVGFibGUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemU9MTYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgaGFzaCB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNpemVcXG4gICAgICAgIHNlbGYuX3Nsb3RzID0gW05vbmVdICogc2VsZi5fc2l6ZVxcbiAgICAgICAgc2VsZi5fZGF0YSA9IFtOb25lXSAqIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2dldF9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBkYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fc2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgZGF0YSlcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2xlbl9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSAtIHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2luIGluXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3Nsb3RzXFxuXFxuICAgIGRlZiBfaGFzaF9mdW5jdGlvbihzZWxmLCBrZXksIHNpemUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIGhhc2ggZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgJSBzaXplXFxuXFxuICAgIGRlZiBfcmVoYXNoKHNlbGYsIG9sZF9oYXNoLCBzaXplLCBzdGVwPTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIHJlaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChvbGRfaGFzaCArIHN0ZXApICUgc2l6ZVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgdGFibGUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplID09IHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBoYXNoX3ZhbHVlID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuXFxuICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdID0ga2V5XFxuICAgICAgICAgICAgc2VsZi5fZGF0YVtoYXNoX3ZhbHVlXSA9IGRhdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPT0ga2V5OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YSAgIyByZXBsYWNlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaiA9IDBcXG4gICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuICAgICAgICAgICAgICAgIHdoaWxlIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgbm90IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdICE9IGtleVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIGogPCBzZWxmLl9zaXplXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfc2xvdCA9IHNlbGYuX3JlaGFzaChoYXNoX3ZhbHVlLCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcblxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdID0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhXFxuICAgICAgICAgICAgICAgIGVsaWYgaiA9PSBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKFxcXCJIYXNoIFRhYmxlIGlzIGZ1bGxcXFwiKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtuZXh0X3Nsb3RdID0gZGF0YSAgIyByZXBsYWNlXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhbiBpdGVtIGZyb20gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydF9zbG90ID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuICAgICAgICBwb3NpdGlvbiA9IHN0YXJ0X3Nsb3RcXG4gICAgICAgIGogPSAwXFxuXFxuICAgICAgICB3aGlsZSBzZWxmLl9zbG90c1twb3NpdGlvbl0gaXMgbm90IE5vbmUgYW5kIGogPCBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhW3Bvc2l0aW9uXVxcbiAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5fcmVoYXNoKHN0YXJ0X3Nsb3QsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSB0YWJsZVxcXCIuZm9ybWF0KGtleSkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zb3J0aW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNvcnRpbmcgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBidWJibGVfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzZWxlY3Rfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBpbnNlcnRfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzaGVsbF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IG1lcmdlX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgcXVpY2tfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBoZWFwX3NvcnRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvc29ydGluZ19hbGdvcml0aG1zLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcblxcblxcbmRlZiBidWJibGVfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJCdWJibGUgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZShsZW4obHN0KSAtIDEsIDAsIC0xKTpcXG4gICAgICAgIGV4Y2hhbmdlcyA9IEZhbHNlXFxuICAgICAgICBmb3IgaiBpbiByYW5nZShpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPiBsc3RbaiArIDFdOlxcbiAgICAgICAgICAgICAgICBleGNoYW5nZXMgPSBUcnVlXFxuICAgICAgICAgICAgICAgIGxzdFtqXSwgbHN0W2ogKyAxXSA9IGxzdFtqICsgMV0sIGxzdFtqXVxcbiAgICAgICAgaWYgbm90IGV4Y2hhbmdlczpcXG4gICAgICAgICAgICBicmVha1xcblxcblxcbmRlZiBzZWxlY3Rfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTZWxlY3Rpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUobHN0KTpcXG4gICAgICAgIG1pbl9pZHggPSBsZW4obHN0KSAtIDFcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihsc3QpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPCBsc3RbbWluX2lkeF06XFxuICAgICAgICAgICAgICAgIG1pbl9pZHggPSBqXFxuICAgICAgICBpZiBtaW5faWR4ICE9IGk6XFxuICAgICAgICAgICAgbHN0W21pbl9pZHhdLCBsc3RbaV0gPSBsc3RbaV0sIGxzdFttaW5faWR4XVxcblxcblxcbmRlZiBpbnNlcnRfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnRpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obHN0KSk6XFxuICAgICAgICBjdXJfdmFsID0gbHN0W2ldXFxuICAgICAgICBjdXJfcG9zID0gaVxcblxcbiAgICAgICAgd2hpbGUgY3VyX3BvcyA+IDAgYW5kIGxzdFtjdXJfcG9zIC0gMV0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gMV1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIDFcXG4gICAgICAgIGxzdFtjdXJfcG9zXSA9IGN1cl92YWxcXG5cXG5cXG5kZWYgc2hlbGxfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTaGVsbCBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIHN1Ymxpc3RfY291bnQgPSBsZW4obHN0KSAvLyAzXFxuICAgIHdoaWxlIHN1Ymxpc3RfY291bnQgPiAwOlxcbiAgICAgICAgZm9yIHBvc19zdGFydCBpbiByYW5nZShzdWJsaXN0X2NvdW50KTpcXG4gICAgICAgICAgICBfZ2FwX2luc2VydF9zb3J0KGxzdCwgcG9zX3N0YXJ0LCBzdWJsaXN0X2NvdW50KVxcbiAgICAgICAgc3VibGlzdF9jb3VudCA9IHN1Ymxpc3RfY291bnQgLy8gMlxcblxcblxcbmRlZiBfZ2FwX2luc2VydF9zb3J0KGxzdCwgc3RhcnQsIGdhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnQgaGVscGVyIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0ICsgZ2FwLCBsZW4obHN0KSwgZ2FwKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID49IGdhcCBhbmQgbHN0W2N1cl9wb3MgLSBnYXBdID4gY3VyX3ZhbDpcXG4gICAgICAgICAgICBsc3RbY3VyX3Bvc10gPSBsc3RbY3VyX3BvcyAtIGdhcF1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIGdhcFxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBtZXJnZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk1lcmdlIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgaWYgbGVuKGxzdCkgPiAxOlxcbiAgICAgICAgbWlkID0gbGVuKGxzdCkgLy8gMlxcbiAgICAgICAgbGVmdF9oYWxmID0gbHN0WzptaWRdXFxuICAgICAgICByaWdodF9oYWxmID0gbHN0W21pZDpdXFxuXFxuICAgICAgICBtZXJnZV9zb3J0KGxlZnRfaGFsZilcXG4gICAgICAgIG1lcmdlX3NvcnQocmlnaHRfaGFsZilcXG5cXG4gICAgICAgIGksIGosIGsgPSAwLCAwLCAwXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZikgYW5kIGogPCBsZW4ocmlnaHRfaGFsZik6XFxuICAgICAgICAgICAgaWYgbGVmdF9oYWxmW2ldIDw9IHJpZ2h0X2hhbGZbal06XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihsZWZ0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuXFxuZGVmIHF1aWNrX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgMCwgbGVuKGxzdCkgLSAxKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9oZWxwKGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IGhlbHBlclxcXCJcXFwiXFxcIlxcbiAgICBpZiBtYXJrX2wgPCBtYXJrX3I6XFxuICAgICAgICBzcGxpdCA9IF9xdWlja19zb3J0X3BhcnQobHN0LCBtYXJrX2wsIG1hcmtfcilcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIHNwbGl0IC0gMSlcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBzcGxpdCArIDEsIG1hcmtfcilcXG5cXG5cXG5kZWYgX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydCBwYXJ0aXRpb25cXFwiXFxcIlxcXCJcXG4gICAgcGl2b3RfdmFsID0gbHN0W21hcmtfbF1cXG4gICAgbWFya19sX2N1ciA9IG1hcmtfbCArIDFcXG4gICAgbWFya19yX2N1ciA9IG1hcmtfclxcbiAgICBkb25lID0gRmFsc2VcXG5cXG4gICAgd2hpbGUgbm90IGRvbmU6XFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX2xfY3VyXSA8PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19sX2N1ciA9IG1hcmtfbF9jdXIgKyAxXFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX3JfY3VyXSA+PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19yX2N1ciA9IG1hcmtfcl9jdXIgLSAxXFxuICAgICAgICBpZiBtYXJrX3JfY3VyIDwgbWFya19sX2N1cjpcXG4gICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBsc3RbbWFya19sX2N1cl0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF9jdXJdXFxuICAgIGxzdFttYXJrX2xdLCBsc3RbbWFya19yX2N1cl0gPSBsc3RbbWFya19yX2N1cl0sIGxzdFttYXJrX2xdXFxuXFxuICAgIHJldHVybiBtYXJrX3JfY3VyXFxuXFxuXFxuZGVmIGhlYXBfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWFwIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgcmVzID0gW11cXG4gICAgaGVhcHEuaGVhcGlmeShsc3QpXFxuICAgIHdoaWxlIGxzdDpcXG4gICAgICAgIHJlcy5hcHBlbmQoaGVhcHEuaGVhcHBvcChsc3QpKVxcbiAgICBmb3IgaSBpbiByZXM6XFxuICAgICAgICBsc3QuYXBwZW5kKGkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy50cmVlcyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMudHJlZXMuYXZsX3RyZWUgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV90cmVlIGltcG9ydCBCaW5hcnlUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMucHJpb3JpdHlfcXVldWUgaW1wb3J0IFByaW9yaXR5UXVldWVcXG5cXG5fX2FsbF9fID0gW1xcXCJCaW5hcnlUcmVlXFxcIiwgXFxcIkJpbmFyeUhlYXBcXFwiLCBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsIFxcXCJBVkxUcmVlXFxcIiwgXFxcIlByaW9yaXR5UXVldWVcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYXZsX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlUcmVlTm9kZVxcblxcblxcbmNsYXNzIEFWTFRyZWVOb2RlKEJpbmFyeVRyZWVOb2RlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWwsIGJhbGFuY2VfZmFjdG9yLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUsIHBhcmVudD1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBBVkwgdHJlZSBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlUcmVlTm9kZS5fX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgbGVmdCwgcmlnaHQsIHBhcmVudClcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIGdldF9iYWxhbmNlX2ZhY3RvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbm9kZSBiYWxhbmNlIGZhY3RvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2JhbGFuY2VfZmFjdG9yXFxuXFxuICAgIGRlZiBzZXRfYmFsYW5jZV9mYWN0b3Ioc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9iYWxhbmNlX2ZhY3RvciA9IHZhbHVlXFxuXFxuICAgIGJhbGFuY2VfZmFjdG9yID0gcHJvcGVydHkoZ2V0X2JhbGFuY2VfZmFjdG9yLCBzZXRfYmFsYW5jZV9mYWN0b3IpXFxuXFxuXFxuY2xhc3MgQVZMVHJlZShCaW5hcnlTZWFyY2hUcmVlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgbmV3IEFWTCB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlTZWFyY2hUcmVlLl9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBBVkxUcmVlTm9kZShrZXksIHZhbHVlLCAwKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZSB0byB0aGUgdHJlZSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodCA9IEFWTFRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgMCwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2UoY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgdXBkYXRlX2JhbGFuY2Uoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJVcGRhdGUgdGhlIHRyZWUgYmFsYW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlX2ZhY3RvciA8IC0xOlxcbiAgICAgICAgICAgIHNlbGYucmViYWxhbmNlKG5vZGUpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBub2RlLnBhcmVudDpcXG4gICAgICAgICAgICBpZiBub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShub2RlLnBhcmVudClcXG5cXG4gICAgZGVmIHJlYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYmFsYW5jZSB0aGUgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5jaGlsZF9yaWdodC5iYWxhbmNlX2ZhY3RvciA+IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gTFIgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIGxlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX2xlZnQuYmFsYW5jZV9mYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVfbGVmdChzZWxmLCByb3RhdGlvbl9yb290KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxlZnQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodCA9IG5ld19yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIGlmIG5ld19yb290LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfbGVmdC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9yaWdodCA9IG5ld19yb290XFxuICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yICsgMSAtIG1pbihuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yICsgMSArIG1heChyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgcm90YXRlX3JpZ2h0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmlnaHQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9sZWZ0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX2xlZnQgPSBuZXdfcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQucGFyZW50ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QucGFyZW50ID0gcm90YXRpb25fcm9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfcm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBuZXdfcm9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX3JpZ2h0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yIC0gMSAtIG1heChuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yIC0gMSArIG1pbihyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X2hlYXAucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5SGVhcDpcXG4gICAgXFxcIlxcXCJcXFwiTWluaW1hbCBCaW5hcnkgSGVhcFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoZWFwXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwID0gW11cXG5cXG4gICAgZGVmIF9wZXJjX3VwKHNlbGYsIGN1cl9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTW92ZSBhIG5vZGUgdXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIChjdXJfaWR4IC0gMSkgLy8gMiA+PSAwOlxcbiAgICAgICAgICAgIHBhcmVudF9pZHggPSAoY3VyX2lkeCAtIDEpIC8vIDJcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdIDwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbcGFyZW50X2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgY3VyX2lkeCA9IHBhcmVudF9pZHhcXG5cXG4gICAgZGVmIF9wZXJjX2Rvd24oc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSBkb3duXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSAyICogY3VyX2lkeCArIDEgPCBsZW4oc2VsZi5faGVhcCk6XFxuICAgICAgICAgICAgbWluX2NoaWxkX2lkeCA9IHNlbGYuX2dldF9taW5fY2hpbGQoY3VyX2lkeClcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdID4gc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgY3VyX2lkeCA9IG1pbl9jaGlsZF9pZHhcXG5cXG4gICAgZGVmIF9nZXRfbWluX2NoaWxkKHNlbGYsIHBhcmVudF9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGEgc21hbGxlciBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgMiAqIHBhcmVudF9pZHggKyAyID4gbGVuKHNlbGYuX2hlYXApIC0gMTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICBpZiBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMV0gPCBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMl06XFxuICAgICAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMVxcbiAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMlxcblxcbiAgICBkZWYgaGVhcGlmeShzZWxmLCBub3RfYV9oZWFwLCBzaG93X2RldGFpbHM9RmFsc2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnVpbGQgYSBoZWFwIGZyb20gYW55IGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBub3RfYV9oZWFwWzpdXFxuICAgICAgICBjdXJfaWR4ID0gbGVuKHNlbGYuX2hlYXApIC8vIDIgLSAxXFxuICAgICAgICB3aGlsZSBjdXJfaWR4ID49IDA6XFxuICAgICAgICAgICAgc2VsZi5fcGVyY19kb3duKGN1cl9pZHgpXFxuICAgICAgICAgICAgY3VyX2lkeCA9IGN1cl9pZHggLSAxXFxuICAgICAgICAgICAgaWYgc2hvd19kZXRhaWxzOlxcbiAgICAgICAgICAgICAgICBwcmludChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IGl0ZW1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAuYXBwZW5kKGl0ZW0pXFxuICAgICAgICBzZWxmLl9wZXJjX3VwKGxlbihzZWxmLl9oZWFwKSAtIDEpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcFswXSwgc2VsZi5faGVhcFstMV0gPSBzZWxmLl9oZWFwWy0xXSwgc2VsZi5faGVhcFswXVxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5faGVhcC5wb3AoKVxcbiAgICAgICAgc2VsZi5fcGVyY19kb3duKDApXFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBoZWFwIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgaGVhcCBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVhcCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX19jb250YWluc19faW4gbWV0aG9kIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9oZWFwXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfc2VhcmNoX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZU5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBUcmVlIE5vZGUgY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBUcmVlIE5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudFxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX2xlZnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9yaWdodCA9IHByb3BlcnR5KGdldF9jaGlsZF9yaWdodCwgc2V0X2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgZ2V0X3BhcmVudChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgc2V0X3BhcmVudChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gbm9kZVxcblxcbiAgICBwYXJlbnQgPSBwcm9wZXJ0eShnZXRfcGFyZW50LCBzZXRfcGFyZW50KVxcblxcbiAgICBkZWYgaXNfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgaXNfbGVhZihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGhhc19hX2NoaWxkKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0IG9yIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGhhc19jaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGhhcyBib3RoIGNoaWxkcmVuXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgYW5kIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9rZXkoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXksIHNldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlXFxuXFxuICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG5cXG4gICAgdmFsdWUgPSBwcm9wZXJ0eShnZXRfdmFsdWUsIHNldF92YWx1ZSlcXG5cXG4gICAgZGVmIHJlcGxhY2VfcGF5bG9hZChzZWxmLCBrZXksIHZhbHVlLCBsZWZ0LCByaWdodCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGFuZ2Ugbm9kZSBwYXlsb2FkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBsZWZ0XFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IHJpZ2h0XFxuICAgICAgICBpZiBzZWxmLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGZcXG5cXG4gICAgZGVmIGZpbmRfc3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbm9kZSdzIHN1Y2Nlc3NvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3VjY2Vzc29yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fY2hpbGRfcmlnaHQuZmluZF9taW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fcGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnQuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvclxcblxcbiAgICBkZWYgZmluZF9taW4oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBzbWFsbGVzdCBub2RlIGluIHRoZSByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZlxcbiAgICAgICAgd2hpbGUgY3VycmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkX2xlZnRcXG4gICAgICAgIHJldHVybiBjdXJyZW50XFxuXFxuICAgIGRlZiBzcGxpY2Vfb3V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3BsaWNlIG91dFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5pc19sZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNfYV9jaGlsZCgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2tleVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJCaW5hcnkgc2VhcmNoIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX3NpemUgPSAwXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyZWUgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290Ll9faXRlcl9fKClcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBnZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuXFxuICAgIGRlZiBnZXRfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290XFxuXFxuICAgIGRlZiBzZXRfcm9vdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Jvb3QgPSBub2RlXFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdCwgc2V0X3Jvb3QpXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfZ2V0KHNlbGYsIGtleSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnRfbm9kZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbm9kZVxcbiAgICAgICAgZWxpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiW10gc2V0dGVyIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLnB1dChrZXksIHZhbHVlKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBzZWxmLl9yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gQmluYXJ5VHJlZU5vZGUoa2V5LCB2YWx1ZSlcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLCBrZXksIHZhbHVlLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQmluYXJ5VHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBib29sKHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRlbCBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcblxcbiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIGJ5IGl0cyBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3NpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVfdG9fcmVtb3ZlID0gc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdClcXG4gICAgICAgICAgICBpZiBub2RlX3RvX3JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlKG5vZGVfdG9fcmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuICAgICAgICBlbGlmIHNlbGYuX3NpemUgPT0gMSBhbmQgc2VsZi5fcm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIF9kZWxldGUoc2VsZiwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2xlYWYoKTogICMgcmVtb3ZpbmcgYSBsZWFmXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlID09IGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5oYXNfY2hpbGRyZW4oKTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggdHdvIGNoaWxkcmVuXFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gY3VycmVudF9ub2RlLmZpbmRfc3VjY2Vzc29yKClcXG4gICAgICAgICAgICBzdWNjZXNzb3Iuc3BsaWNlX291dCgpXFxuICAgICAgICAgICAgY3VycmVudF9ub2RlLmtleSA9IHN1Y2Nlc3Nvci5rZXlcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUudmFsdWUgPSBzdWNjZXNzb3IudmFsdWVcXG4gICAgICAgIGVsc2U6ICAjIHJlbW92aW5nIGEgbm9kZSB3aXRoIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9yaWdodCxcXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5yZXBsYWNlX3BheWxvYWQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX2xlZnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pbm9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgY2xlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYWxsIG5vZGVzXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuZGVsZXRlKHNlbGYuX3Jvb3Qua2V5KVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IG9wZXJhdG9yXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG5cXG4gICAgTW9kaWZpZWQgdG8gYWxsb3cgZm9yIHRyZWVzIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gb3RoZXIgdHJlZXNcXG4gICAgcmF0aGVyIHRoYW4gYWx3YXlzIGNyZWF0aW5nIGEgbmV3IHRyZWUgaW4gdGhlIGluc2VydF9mZWZ0IG9yIGluc2VydF9yaWdodFxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gTm9uZVxcblxcbiAgICBkZWYgZ2V0X3Jvb3RfdmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBzZXRfcm9vdF92YWwoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByb290IGtleSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdF92YWwsIHNldF9yb290X3ZhbClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9yaWdodChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgYSBub2RlIGlzIGxlYWZcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiAobm90IHNlbGYuX2NoaWxkX2xlZnQpIGFuZCAobm90IHNlbGYuX2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgaW5zZXJ0X2xlZnQoc2VsZiwgbmV3X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGxlZnQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9sZWZ0KHNlbGYuX2NoaWxkX2xlZnQpXFxuXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIGluc2VydF9yaWdodChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgcmlnaHQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZS5zZXRfY2hpbGRfcmlnaHQoc2VsZi5fY2hpbGRfcmlnaHQpXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5ld19zdWJ0cmVlXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByZW9yZGVyKClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0Lmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQuaW5vcmRlcigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwcmludF9leHAoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmludCBhbiBleHByZXNzaW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHByaW50KFxcXCIoXFxcIiwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByaW50X2V4cCgpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wcmludF9leHAoKVxcbiAgICAgICAgICAgIHByaW50KFxcXCIpXFxcIiwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHBvc3RvcmRlcl9ldmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdG9yZGVyIGV2YWx1YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG9wZXJhdGlvbnMgPSB7XFxuICAgICAgICAgICAgXFxcIitcXFwiOiBvcGVyYXRvci5hZGQsXFxuICAgICAgICAgICAgXFxcIi1cXFwiOiBvcGVyYXRvci5zdWIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBvcGVyYXRvci5tdWwsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBvcGVyYXRvci50cnVlZGl2LFxcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0XzEgPSBOb25lXFxuICAgICAgICByZXN1bHRfMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcmVzdWx0XzEgPSBzZWxmLl9jaGlsZF9sZWZ0LnBvc3RvcmRlcl9ldmFsKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHJlc3VsdF8yID0gc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgcmVzdWx0XzEgYW5kIHJlc3VsdF8yOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25zW3NlbGYuX2tleV0ocmVzdWx0XzEsIHJlc3VsdF8yKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgaGVpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVpZ2h0IG9mIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9sZWZ0ID0gLTFcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IC0xXFxuXFxuICAgICAgICByZXR1cm4gMSArIG1heChoZWlnaHRfbGVmdCwgaGVpZ2h0X3JpZ2h0KVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb3VudCBub2RlcyBpbiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLl9rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX2xlZnQgPSAwXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LnNpemUoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IDBcXG5cXG4gICAgICAgIHJldHVybiAxICsgY2hpbGRyZW5fbGVmdCArIGNoaWxkcmVuX3JpZ2h0XFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9wcmlvcml0eV9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcblxcblxcbmNsYXNzIFByaW9yaXR5UXVldWUoQmluYXJ5SGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBoZWFwIHRha2VzIChrZXksIHZhbHVlKSBwYWlycyB3aGVyZSBrZXkgc2lnbmlmaWVzIHByaW9yaXR5XFxuICAgIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGFsbCBjb21wYXJhYmxlLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIGNoYW5nZV9wcmlvcml0eShzZWxmLCBuZXdfcHJpb3JpdHksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSB0aGUgcHJpb3JpdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGtleV90b19tb3ZlID0gMFxcbiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX2hlYXApKTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2ldWzFdID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBrZXlfdG9fbW92ZSA9IGlcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGlmIGtleV90b19tb3ZlID4gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGVhcFtrZXlfdG9fbW92ZV0gPSAobmV3X3ByaW9yaXR5LCBzZWxmLl9oZWFwW2tleV90b19tb3ZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX3VwKGtleV90b19tb3ZlKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9fX2luaXRfXy5weVwiOlwiXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvX19pbml0X18ucHlcIjpcIlxcblxcblxcbmZyb20gLmF2bCBpbXBvcnQgQXJib2xBVkxcXG5mcm9tIC5hYmIgaW1wb3J0IEFyYm9sQmluYXJpb0J1c3F1ZWRhXFxuZnJvbSAubW9udGljdWxvQmluYXJpbyBpbXBvcnQgTW9udGljdWxvQmluYXJpb1xcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FiYi5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYWJiLnB5XFxuXFxuY2xhc3MgQXJib2xCaW5hcmlvQnVzcXVlZGE6XFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgICAgIHNlbGYudGFtYW5vID0gMFxcblxcbiAgICBkZWYgYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yKTpcXG4gICAgICAgIGlmIHNlbGYucmFpejpcXG4gICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLHNlbGYucmFpeilcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yKVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFubyArIDFcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgICAgICBpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiBcXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsYyx2KTpcXG4gICAgICAgIHNlbGYuYWdyZWdhcihjLHYpXFxuXFxuICAgIGRlZiBvYnRlbmVyKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5jYXJnYVV0aWxcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX29idGVuZXIoc2VsZixjbGF2ZSxub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgbm90IG5vZG9BY3R1YWw6XFxuICAgIFxcdCAgICByZXR1cm4gTm9uZVxcbiAgICBcXHRlbGlmIG5vZG9BY3R1YWwuY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICByZXR1cm4gbm9kb0FjdHVhbFxcbiAgICBcXHRlbGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pICAgICAgICBcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgcmVzID0gc2VsZi5vYnRlbmVyKGNsYXZlKSBcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGNsYXZlKTpcXG4gICAgXFx0aWYgc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopOlxcbiAgICBcXHQgICAgcmV0dXJuIFRydWVcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBGYWxzZVxcbiAgICAgICBcXG4gICAgZGVmIGxvbmdpdHVkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJhaXouX19pdGVyX18oKVxcblxcbiAgICBkZWYgZWxpbWluYXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnRhbWFubyA+IDE6XFxuICAgICAgICAgICBub2RvQUVsaW1pbmFyID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgIFxcdCAgIGlmIG5vZG9BRWxpbWluYXI6XFxuICAgIFxcdCAgICAgICBzZWxmLnJlbW92ZXIobm9kb0FFbGltaW5hcilcXG4gICAgXFx0ICAgICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8tMVxcbiAgICBcXHQgICBlbHNlOlxcbiAgICBcXHQgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcbiAgICAgICAgZWxpZiBzZWxmLnRhbWFubyA9PSAxIGFuZCBzZWxmLnJhaXouY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICBzZWxmLnJhaXogPSBOb25lXFxuICAgIFxcdCAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgXFx0ICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5lbGltaW5hcihjbGF2ZSlcXG5cXG4gICAgZGVmIHJlbW92ZXIoc2VsZixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIb2phKCk6ICNob2phXFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbCA9PSBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBub2RvQWN0dWFsLnRpZW5lQW1ib3NIaWpvcygpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWMgPSBub2RvQWN0dWFsLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgIHN1Yy5lbXBhbG1hcigpXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jbGF2ZSA9IHN1Yy5jbGF2ZVxcbiAgICAgICAgICAgIG5vZG9BY3R1YWwuY2FyZ2FVdGlsID0gc3VjLmNhcmdhVXRpbFxcblxcbiAgICAgICAgZWxzZTogIyBlc3RlIG5vZG8gdGllbmUgdW4gKDEpIGhpam9cXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsaWYgbm9kb0FjdHVhbC5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5jbGF2ZSwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG5vZG9BY3R1YWwuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5yZWVtcGxhemFyRGF0b0RlTm9kbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5oaWpvSXpxdWllcmRvLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX2lub3JkZW4oc2VsZixhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbCAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSlcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVuKHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wb3N0b3JkZW4oc2VsZiwgYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlbihzZWxmLHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wcmVvcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sOlxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuXFxuY2xhc3MgTm9kb0FyYm9sOlxcbiAgIGRlZiBfX2luaXRfXyhzZWxmLGNsYXZlLHZhbG9yLGl6cXVpZXJkbz1Ob25lLGRlcmVjaG89Tm9uZSxwYWRyZT1Ob25lKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaXpxdWllcmRvXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gZGVyZWNob1xcbiAgICAgICAgc2VsZi5wYWRyZSA9IHBhZHJlXFxuICAgICAgICBzZWxmLmZhY3RvckVxdWlsaWJyaW8gPSAwXFxuXFxuICAgIGRlZiB0aWVuZUhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgIFxcbiAgICBkZWYgdGllbmVIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuXFxuICAgIGRlZiBlc0hpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID09IHNlbGZcXG4gICAgXFxuICAgIGRlZiBlc0hpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFkcmUgYW5kIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPT0gc2VsZlxcblxcbiAgICBkZWYgZXNSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLmhpam9EZXJlY2hvIG9yIHNlbGYuaGlqb0l6cXVpZXJkbylcXG5cXG4gICAgZGVmIHRpZW5lQWxndW5IaWpvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiB0aWVuZUFtYm9zSGlqb3Moc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBhbmQgc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiByZWVtcGxhemFyRGF0b0RlTm9kbyhzZWxmLGNsYXZlLHZhbG9yLGhpenEsaGRlcik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY2FyZ2FVdGlsID0gdmFsb3JcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IGhpenFcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBoZGVyXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wYWRyZSA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmICAgIFxcblxcbiAgICBkZWYgZW5jb250cmFyU3VjZXNvcihzZWxmKTpcXG4gICAgICAgIHN1YyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHN1YyA9IHNlbGYuaGlqb0RlcmVjaG8uZW5jb250cmFyTWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5wYWRyZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmVcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWMgPSBzZWxmLnBhZHJlLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNcXG5cXG4gICAgZGVmIGVtcGFsbWFyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5lc0hvamEoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi50aWVuZUFsZ3VuSGlqbygpOlxcbiAgICAgICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBhZHJlID0gc2VsZi5wYWRyZVxcblxcbiAgICBkZWYgZW5jb250cmFyTWluKHNlbGYpOlxcbiAgICAgICAgYWN0dWFsID0gc2VsZlxcbiAgICAgICAgd2hpbGUgYWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICByZXR1cm4gYWN0dWFsXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIGZvciBlbGVtIGluIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLmNsYXZlXFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hcmJvbEJpbmFyaW8ucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNhcmJvbEJpbmFyaW8ucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG9iamV0b1JhaXopOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IG9iamV0b1JhaXpcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0YXJJenF1aWVyZG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgIGVsc2U6ICBcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSB0XFxuXFxuICAgIGRlZiBpbnNlcnRhckRlcmVjaG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobyA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSB0XFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5oaWpvSXpxdWllcmRvKSBhbmQgKG5vdCBzZWxmLmhpam9EZXJlY2hvKSlcXG5cXG4gICAgZGVmIG9idGVuZXJIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lckhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgIFxcbiAgICBkZWYgYXNpZ25hclZhbG9yUmFpeihzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqXFxuXFxuICAgIGRlZiBvYnRlbmVyVmFsb3JSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG4gICAgZGVmIGlub3JkZW4oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLmlub3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbm9yZGVuKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucG9zdG9yZGVuKClcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wb3N0b3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG5cXG4gICAgZGVmIHByZW9yZGVuKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucHJlb3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnByZW9yZGVuKClcXG5cXG4gICAgZGVmIGltcHJpbWlyRXhwcmVzaW9uKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW1wcmltaXJFeHByZXNpb24oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSwgZW5kPScgJylcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICAgICAgcHJpbnQoJyknLCBlbmQ9JyAnKVxcblxcbiAgICBkZWYgZXZhbFBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcmVzMSA9IHNlbGYuaGlqb0l6cXVpZXJkby5ldmFsUG9zdG9yZGVuKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5oaWpvRGVyZWNoby5ldmFsUG9zdG9yZGVuKCkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbc2VsZi5jbGF2ZV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG5kZWYgaW5vcmRlbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKVxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sLmhpam9JenF1aWVyZG86XFxuICAgICAgICBwcmludCgnKCcsIGVuZD0nICcpXFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCksIGVuZD0nICcpXFxuICAgIGlmIGFyYm9sLmhpam9EZXJlY2hvOlxcbiAgICAgICAgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuICAgICAgICBwcmludCgnKScsIGVuZD0nICcpIFxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICB2YWxvckNhZGVuYSA9IFxcXCJcXFwiXFxuICBpZiBhcmJvbDpcXG4gICAgICB2YWxvckNhZGVuYSA9ICcoJyArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIHN0cihhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSsnKSdcXG4gIHJldHVybiB2YWxvckNhZGVuYVxcblxcbmRlZiBldmFsUG9zdG9yZGVuKGFyYm9sKTpcXG4gICAgb3BlcmFkb3JlcyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgcmVzMSA9IE5vbmVcXG4gICAgcmVzMiA9IE5vbmVcXG4gICAgaWYgYXJib2w6XFxuICAgICAgICByZXMxID0gZXZhbFBvc3RvcmRlbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKSAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIHJlczIgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSAgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcmFkb3Jlc1thcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KClcXG5cXG5kZWYgYWx0dXJhKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoYWx0dXJhKGFyYm9sLmhpam9JenF1aWVyZG8pLGFsdHVyYShhcmJvbC5oaWpvRGVyZWNobykpXFxuXFxudCA9IEFyYm9sQmluYXJpbyg3KVxcbnQuaW5zZXJ0YXJJenF1aWVyZG8oMylcXG50Lmluc2VydGFyRGVyZWNobyg5KVxcbmlub3JkZW4odClcXG5pbXBvcnQgb3BlcmF0b3JcXG54ID0gQXJib2xCaW5hcmlvKCcqJylcXG54Lmluc2VydGFySXpxdWllcmRvKCcrJylcXG5sID0geC5vYnRlbmVySGlqb0l6cXVpZXJkbygpXFxubC5pbnNlcnRhckl6cXVpZXJkbyg0KVxcbmwuaW5zZXJ0YXJEZXJlY2hvKDUpXFxueC5pbnNlcnRhckRlcmVjaG8oNylcXG5wcmludChpbXByaW1pckV4cHJlc2lvbih4KSlcXG5wcmludChldmFsUG9zdG9yZGVuKHgpKVxcbnByaW50KGFsdHVyYSh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hdmwucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2F2bC5weVxcblxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGEsIE5vZG9BcmJvbFxcblxcbmNsYXNzIEFyYm9sQVZMKEFyYm9sQmluYXJpb0J1c3F1ZWRhKTpcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgIFxcdGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgIFxcdFxcdHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdFxcdG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgYWN0dWFsaXphckVxdWlsaWJyaW8oc2VsZixub2RvKTpcXG4gICAgXFx0aWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMSBvciBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAtMTpcXG4gICAgXFx0ICAgIHNlbGYucmVlcXVpbGlicmFyKG5vZG8pICAgIFxcbiAgICBcXHQgICAgcmV0dXJuXFxuICAgIFxcdGlmIG5vZG8ucGFkcmUgIT0gTm9uZTpcXG4gICAgXFx0ICAgIGlmIG5vZG8uZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdCAgICBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gKz0gMVxcbiAgICBcXHQgICAgZWxpZiBub2RvLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAtPSAxXFxuXFxuICAgIFxcdCAgICBpZiBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gIT0gMDpcXG4gICAgXFx0XFx0ICAgIHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kby5wYWRyZSlcXG5cXG4gICAgZGVmIHJlZXF1aWxpYnJhcihzZWxmLG5vZG8pOlxcbiAgICAgICAgaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvRGVyZWNoby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8uaGlqb0RlcmVjaG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuXFx0ICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuICAgICAgICBlbGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA+IDA6XFxuXFx0ICAgIGlmIG5vZG8uaGlqb0l6cXVpZXJkby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kby5oaWpvSXpxdWllcmRvKVxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kbylcXG5cXHQgICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcbiAgICAgICAgICAgXFxuICAgIGRlZiByb3Rhckl6cXVpZXJkYShzZWxmLHJvdFJhaXopOlxcbiAgICBcXHRudWV2YVJhaXogPSByb3RSYWl6Lmhpam9EZXJlY2hvXFxuICAgIFxcdHJvdFJhaXouaGlqb0RlcmVjaG8gPSBudWV2YVJhaXouaGlqb0l6cXVpZXJkb1xcbiAgICBcXHRpZiBudWV2YVJhaXouaGlqb0l6cXVpZXJkbyAhPSBOb25lOlxcbiAgICBcXHQgICAgbnVldmFSYWl6Lmhpam9JenF1aWVyZG8ucGFkcmUgPSByb3RSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgXFx0aWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IG51ZXZhUmFpelxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgcm90UmFpei5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0ICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdCAgICBcXHRyb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5oaWpvSXpxdWllcmRvID0gcm90UmFpelxcbiAgICBcXHRyb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgIFxcdHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgLSBtaW4obnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgIFxcdG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvID0gbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gKyAxICsgbWF4KHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG5cXG4gICAgZGVmIHJvdGFyRGVyZWNoYShzZWxmLHJvdFJhaXopOlxcbiAgICAgICAgbnVldmFSYWl6ID0gcm90UmFpei5oaWpvSXpxdWllcmRvXFxuICAgICAgICByb3RSYWl6Lmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXouaGlqb0RlcmVjaG9cXG4gICAgICAgIGlmIG51ZXZhUmFpei5oaWpvRGVyZWNobyAhPSBOb25lOlxcbiAgICAgICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNoby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgICAgIGlmIHJvdFJhaXouZXNSYWl6KCk6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJhaXouZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6XFxuICAgICAgICBudWV2YVJhaXouaGlqb0RlcmVjaG8gPSByb3RSYWl6XFxuICAgICAgICByb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgICAgICByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gLSAxIC0gbWF4KG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcbiAgICAgICAgbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgKyBtaW4ocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKSAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvbW9udGljdWxvQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI21vbnRpY3Vsb0JpbmFyaW8ucHlcXG5cXG5jbGFzcyBNb250aWN1bG9CaW5hcmlvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IDBcXG5cXG4gICAgZGVmIGNvbnN0cnVpck1vbnRpY3VsbyhzZWxmLHVuYUxpc3RhKTpcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDJcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gbGVuKHVuYUxpc3RhKVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3VsbyA9IFswXSArIHVuYUxpc3RhWzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5saXN0YU1vbnRpY3VsbyksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYubGlzdGFNb250aWN1bG8sIGkpXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbyxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldID4gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYubGlzdGFNb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHNlbGYubGlzdGFNb250aWN1bG9baG1dXFxuICAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSAqIDIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baSAqIDJdIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBpbmZpbHRBcnJpYmEoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA8IHNlbGYubGlzdGFNb250aWN1bG9baS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0YXIoc2VsZixrKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5saXN0YU1vbnRpY3Vsb1sxXVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1sxXSA9IHNlbGYubGlzdGFNb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpbyhzZWxmKTpcXG4gICAgICAgIGlmIHRhbWFub0FjdHVhbCA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL19faW5pdF9fLnB5XCI6XCJcXG4jX19hbGxfXyA9IFtcXFwicGlsYVxcXCJdXFxuXFxuXFxuZnJvbSAucGlsYSBpbXBvcnQgUGlsYVxcbmZyb20gLmNvbGEgaW1wb3J0IENvbGFcXG5mcm9tIC5jb2xhZG9ibGUgaW1wb3J0IENvbGFEb2JsZVxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL2NvbGEucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2NvbGEucHlcXG5cXG5jbGFzcyBDb2xhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgYXZhbnphcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYWRvYmxlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYWRvYmxlLnB5XFxuXFxuY2xhc3MgQ29sYURvYmxlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyRnJlbnRlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFncmVnYXJGaW5hbChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZXJGcmVudGUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlckZpbmFsKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvcGlsYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI3BpbGEucHlcXG5cXG5jbGFzcyBQaWxhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBpbmNsdWlyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGV4dHJhZXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgaW5zcGVjY2lvbmFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbbGVuKHNlbGYuaXRlbXMpLTFdXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IEdyYWZvXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IFZlcnRpY2VcXG5mcm9tIC5jb2xhUHJpb3JpZGFkIGltcG9ydCBDb2xhUHJpb3JpZGFkXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9jb2xhUHJpb3JpZGFkLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYVByaW9yaWRhZC5weVxcblxcbmNsYXNzIENvbGFQcmlvcmlkYWQ6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8gPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiB1bmFMaXN0YTpcXG4gICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGkpXFxuICAgICAgICBpID0gbGVuKHVuYUxpc3RhKSAvLyAyICAgICAgICAgICAgXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QWJham8oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGluZmlsdEFiYWpvKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGhtID0gc2VsZi5oaWpvTWluKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzBdID4gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBobVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGhpam9NaW4oc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpKjIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baSoyXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjIrMV1bMF06XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyKzFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPCBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkvLzJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCArIDFcXG4gICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKHNlbGYudGFtYW5vQWN0dWFsKVxcblxcbiAgICBkZWYgZWxpbWluYXJNaW4oc2VsZik6XFxuICAgICAgICB2YWxvclNhY2FkbyA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1sxXVsxXVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW3NlbGYudGFtYW5vQWN0dWFsXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCAtIDFcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZW1lbnRhckNsYXZlKHNlbGYsdmFsb3IsbnVldm8pOlxcbiAgICAgICAgaGVjaG8gPSBGYWxzZVxcbiAgICAgICAgaSA9IDFcXG4gICAgICAgIG1pQ2xhdmUgPSAwXFxuICAgICAgICB3aGlsZSBub3QgaGVjaG8gYW5kIGkgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzFdID09IHZhbG9yOlxcbiAgICAgICAgICAgICAgICBoZWNobyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbWlDbGF2ZSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG1pQ2xhdmUgPiAwOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXSA9IChudWV2byxzZWxmLmFycmVnbG9Nb250aWN1bG9bbWlDbGF2ZV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEobWlDbGF2ZSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZlcnRpY2UpOlxcbiAgICAgICAgZm9yIHBhcmVqYSBpbiBzZWxmLmFycmVnbG9Nb250aWN1bG86XFxuICAgICAgICAgICAgaWYgcGFyZWphWzFdID09IHZlcnRpY2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2UgICAgIFxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvZ3JhZm9BZHkucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2dyYWZvQWR5LnB5XFxuXFxuXFxuaW1wb3J0IHN5c1xcblxcbmNsYXNzIEdyYWZvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgYWdyZWdhclZlcnRpY2Uoc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG51ZXZvVmVydGljZSA9IFZlcnRpY2UoY2xhdmUpXFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbY2xhdmVdID0gbnVldm9WZXJ0aWNlXFxuICAgICAgICByZXR1cm4gbnVldm9WZXJ0aWNlXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lclZlcnRpY2Uoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmxpc3RhVmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWdyZWdhckFyaXN0YShzZWxmLGRlLGEsY29zdG89MCk6XFxuICAgICAgICAgICAgaWYgZGUgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGRlKVxcbiAgICAgICAgICAgIGlmIGEgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGEpXFxuICAgICAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzW2RlXS5hZ3JlZ2FyVmVjaW5vKHNlbGYubGlzdGFWZXJ0aWNlc1thXSxjb3N0bylcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLmxpc3RhVmVydGljZXMua2V5cygpKVxcbiAgICAgICAgXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYubGlzdGFWZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGljZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5pZCA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNvbmVjdGFkb0EgPSB7fVxcbiAgICAgICAgc2VsZi5jb2xvciA9ICdibGFuY28nXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkZWNlc29yID0gTm9uZVxcbiAgICAgICAgc2VsZi5kZXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiAgYWdyZWdhclZlY2lubyhzZWxmLHZlY2lubyxwb25kZXJhY2lvbj0wKTpcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQVt2ZWNpbm9dID0gcG9uZGVyYWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckNvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJEaXN0YW5jaWEoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIGFzaWduYXJQcmVkZWNlc29yKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBwXFxuXFxuICAgIGRlZiBhc2lnbmFyRGVzY3VicmltaWVudG8oc2VsZix0aWVtcG9EZXNjdWJyaW1pZW50byk6XFxuICAgICAgICBzZWxmLmRlc2MgPSB0aWVtcG9EZXNjdWJyaW1pZW50b1xcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyRmluYWxpemFjaW9uKHNlbGYsdGllbXBvRmluYWxpemFjaW9uKTpcXG4gICAgICAgIHNlbGYuZmluID0gdGllbXBvRmluYWxpemFjaW9uXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJGaW5hbGl6YWNpb24oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5maW5cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRlc2N1YnJpbWllbnRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGVzY1xcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyUHJlZGVjZXNvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRlY2Vzb3JcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRpc3RhbmNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc3RcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckNvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyQ29uZXhpb25lcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0Eua2V5cygpXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQb25kZXJhY2lvbihzZWxmLHZlY2lubyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25lY3RhZG9BW3ZlY2lub11cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRlc2MgXFxcIiArIHN0cihzZWxmLmRlc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3RhbmNpYSBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWRlY2Vzb3IgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZGVjZXNvcikrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lcklkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cIixcInNyYy9saWIvcXVvcHJpLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJxdW9wcmkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yYW5kb20uanNcIjpcInZhciBNZXJzZW5uZVR3aXN0ZXI9ZnVuY3Rpb24oYSl7YT09bnVsbCYmKGE9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHRoaXMuTj02MjQsdGhpcy5NPTM5Nyx0aGlzLk1BVFJJWF9BPTI1Njc0ODM2MTUsdGhpcy5VUFBFUl9NQVNLPTIxNDc0ODM2NDgsdGhpcy5MT1dFUl9NQVNLPTIxNDc0ODM2NDcsdGhpcy5tdD1BcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHRoaXMuaW5pdF9nZW5yYW5kKGEpfTtNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfZ2VucmFuZD1mdW5jdGlvbihhKXtmb3IodGhpcy5tdFswXT1hPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgYT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oMTgxMjQzMzI1MyooKDQyOTQ5MDE3NjAmYSk+Pj4xNik8PDE2KSsxODEyNDMzMjUzKig2NTUzNSZhKSt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmO2Zvcih0aGlzLmluaXRfZ2VucmFuZCgxOTY1MDIxOCksZD0xLGU9MCxmPXRoaXMuTj5iP3RoaXMuTjpiO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTY2NDUyNSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNjY0NTI1Kig2NTUzNSZnKSkrYVtlXStlLHRoaXMubXRbZF0+Pj49MCxkKyssZSsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKSxlPj1iJiYoZT0wKX1mb3IoZj10aGlzLk4tMTtmO2YtLSl7dmFyIGc9dGhpcy5tdFtkLTFdXnRoaXMubXRbZC0xXT4+PjMwO3RoaXMubXRbZF09KHRoaXMubXRbZF1eKDE1NjYwODM5NDEqKCg0Mjk0OTAxNzYwJmcpPj4+MTYpPDwxNikrMTU2NjA4Mzk0MSooNjU1MzUmZykpLWQsdGhpcy5tdFtkXT4+Pj0wLGQrKyxkPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLGQ9MSl9dGhpcy5tdFswXT0yMTQ3NDgzNjQ4fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfaW50MzI9ZnVuY3Rpb24oKXt2YXIgYSxiPVswLHRoaXMuTUFUUklYX0FdO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBkO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9nZW5yYW5kKDU0ODkpLGQ9MDtkPHRoaXMuTi10aGlzLk07ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCt0aGlzLk1dXmE+Pj4xXmJbMSZhXTtmb3IoO2Q8dGhpcy5OLTE7ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCsodGhpcy5NLXRoaXMuTildXmE+Pj4xXmJbMSZhXTthPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5hPj4+MV5iWzEmYV0sdGhpcy5tdGk9MH1yZXR1cm4gYT10aGlzLm10W3RoaXMubXRpKytdLGFePWE+Pj4xMSxhXj0yNjM2OTI4NjQwJmE8PDcsYV49NDAyMjczMDc1MiZhPDwxNSxhXj1hPj4+MTgsYT4+PjB9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKT4+PjF9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk1KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMz1mdW5jdGlvbigpe3JldHVybih0aGlzLmdlbnJhbmRfaW50MzIoKSsuNSkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZXM1Mz1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NSxhPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NjtyZXR1cm4oNjcxMDg4NjQqZCthKSooMS85MDA3MTk5MjU0NzQwOTkyKX07dmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5sb2csYj1NYXRoLnNxcnQsZD17fSxlPW5ldyBNZXJzZW5uZVR3aXN0ZXIsZj12b2lkIDA7ZC5zZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9MDxhcmd1bWVudHMubGVuZ3RoP25ldyBNZXJzZW5uZVR3aXN0ZXIoYSk6bmV3IE1lcnNlbm5lVHdpc3RlcixTay5idWlsdGluLm5vbmUubm9uZSR9KSxkLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRvbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLmZsb2F0XyhlLmdlbnJhbmRfcmVzNTMoKSl9KTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gMHxhfSxoPWZ1bmN0aW9uKGEsYixkKXt2YXIgZixoLGk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgZmlyc3QgYXJndW1lbnQgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYodm9pZCAwPT09YilyZXR1cm4gaT1nKGUuZ2VucmFuZF9yZXM1MygpKmEpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1kJiYoZD0xKSxmPWItYSwxPT1kJiYwPGYpcmV0dXJuIGk9YStnKGUuZ2VucmFuZF9yZXM1MygpKmYpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoMT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkgKFxcXCIrYStcXFwiLCBcXFwiK2IrXFxcIiwgXFxcIitmK1xcXCIpXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPGQpaD1nKChmK2QtMSkvZCk7ZWxzZSBpZigwPmQpaD1nKChmK2QrMSkvZCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKClcXFwiKTtyZXR1cm4gaT1hK2QqZyhlLmdlbnJhbmRfcmVzNTMoKSpoKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpfTtkLnJhbmRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGUpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kaW50XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGgoZCxlKzEpfSksZC5yYW5kcmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRyYW5nZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDMpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGgoYSxiLGQpfSksZC51bmlmb3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1bmlmb3JtXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpO3ZhciBnPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBjPWQrZyooZi1kKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9KSxkLnRyaWFuZ3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGQsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidHJpYW5ndWxhclxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxvd1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiaGlnaFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihkKSk7dmFyIGcsaCxpO3JldHVybiBhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksYT5kJiYoaT1hLGE9ZCxkPWkpLHZvaWQgMD09PWZ8fGY9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/Zj0oZC1hKS8yOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtb2RlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpKSxnPWUuZ2VucmFuZF9yZXM1MygpLGg9ZzwoZi1hKS8oZC1hKT9hK2IoZyooZC1hKSooZi1hKSk6ZC1iKCgxLWcpKihkLWEpKihkLWYpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oaCl9KTt2YXIgaT1mdW5jdGlvbihkLGcpe3ZhciBrLGwsbSxuLG8saD1NYXRoLnNpbixpPU1hdGguY29zLGo9TWF0aC5QSTtyZXR1cm4gdm9pZCAwPT09Zj8oaz1lLmdlbnJhbmRfcmVzNTMoKSxsPWUuZ2VucmFuZF9yZXM1MygpLG09YigtMiphKGspKSxuPTIqaipsLG89bSppKG4pLGY9bSpoKG4pKToobz1mLGY9dm9pZCAwKSxkK2cqb307cmV0dXJuIGQuZ2F1c3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnYXVzc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm11XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzaWdtYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhpKGEsYikpfSksZC5ub3JtYWx2YXJpYXRlPWQuZ2F1c3MsZC5sb2dub3JtdmFyaWF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGQ9TWF0aC5leHA7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImxvZ25vcm12YXJpYXRlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQoaShhLGIpKSl9KSxkLmV4cG92YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZXhwb3ZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJsYW1iZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD1lLmdlbnJhbmRfcmVzNTMoKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1hKGQpL2IpfSksZC5jaG9pY2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjaG9pY2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZXFcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSx2b2lkIDAhPT1hLnNxJGxlbmd0aCl7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhnKGUuZ2VucmFuZF9yZXM1MygpKmEuc3EkbGVuZ3RoKCkpKTtyZXR1cm4gYS5tcCRzdWJzY3JpcHQoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpfSksZC5zaHVmZmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2h1ZmZsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KXtjb25zdCBoPWEudjtmb3IodmFyIGI9aC5sZW5ndGgtMTswPGI7Yi09MSl7dmFyIGQ9ZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSksZj1oW2RdO2hbZF09aFtiXSxoW2JdPWZ9fWVsc2UgaWYodm9pZCAwPT09YS5zcSRsZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpO2Vsc2UgaWYodm9pZCAwIT09YS5tcCRhc3Nfc3Vic2NyaXB0KWZvcih2YXIgZCxiPWEuc3EkbGVuZ3RoKCktMTswPGI7Yi09MSl7ZD1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqKGIrMSkpKSxiPW5ldyBTay5idWlsdGluLmludF8oYik7dmFyIGY9YS5tcCRzdWJzY3JpcHQoZCk7YS5tcCRhc3Nfc3Vic2NyaXB0KGQsYS5tcCRzdWJzY3JpcHQoYikpLGEubXAkYXNzX3N1YnNjcmlwdChiLGYpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaXMgaW1tdXRhYmxlXFxcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQuc2FtcGxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZixnLGgsbCxtLGQ9TWF0aC5mbG9vcjtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2FtcGxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicG9wdWxhdGlvblxcXCIsXFxcIml0ZXJhYmxlXFxcIixTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImtcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG09W10saD1Tay5hYnN0ci5pdGVyKGEpLChmPTAsbD1oLnRwJGl0ZXJuZXh0KCkpO3ZvaWQgMCE9PWw7ZisrLGw9aC50cCRpdGVybmV4dCgpKWc9ZChlLmdlbnJhbmRfcmVzNTMoKSooZisxKSksZjxiPyhnPGYmJihtW2ZdPW1bZ10pLG1bZ109bCk6ZzxiJiYobVtnXT1sKTtpZihmPGIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwic2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb25cXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChtKX0pLGR9O1wiLFwic3JjL2xpYi9yZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKG5hbWUpe3ZhciB2YWxpZEdyb3Vwcyxjb252ZXJ0LGdldEZsYWdzLF9zcGxpdCxfZmluZGFsbCxtYXRjaG9iaixfc2VhcmNoLF9tYXRjaCxyZWdleG9iaixtb2Q9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwicmVcXFwiKX07cmV0dXJuIG1vZC5JPTIsbW9kLklHTk9SRUNBU0U9Mixtb2QuTT04LG1vZC5NVUxUSUxJTkU9OCx2YWxpZEdyb3Vwcz1bXFxcIig/OlxcXCIsXFxcIig/PVxcXCIsXFxcIig/IVxcXCJdLGNvbnZlcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO2lmKGM9YS5tYXRjaCgvXFxcXChcXFxcPy4vZyksYylmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKC0xPT12YWxpZEdyb3Vwcy5pbmRleE9mKGNbZF0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkRpc2FsbG93ZWQgZ3JvdXAgaW4gcGF0dGVybjogJ1xcXCIrY1tkXStcXFwiJ1xcXCIpO3JldHVybiBiPWEucmVwbGFjZShcXFwiL1xcXFxcXFxcL2dcXFwiLFxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIiksYj1hLnJlcGxhY2UoLyhbXlxcXFxcXFxcXSl7LCg/IVteXFxcXFtdKlxcXFxdKS9nLFxcXCIkMXswLFxcXCIpLGJ9LGdldEZsYWdzPWZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJnXFxcIjtyZXR1cm4oYSZtb2QuSUdOT1JFQ0FTRSk9PW1vZC5JR05PUkVDQVNFJiYoYis9XFxcImlcXFwiKSwoYSZtb2QuTVVMVElMSU5FKT09bW9kLk1VTFRJTElORSYmKGIrPVxcXCJtXFxcIiksYn0sX3NwbGl0PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhIG51bWJlclxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO2ZvcihjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suZmZpLnVud3JhcG8oYSksZj1Tay5mZmkudW53cmFwbyhiKSxlPWNvbnZlcnQoZSksZz1udWxsIT09ZS5tYXRjaCgvXlxcXFwoLipcXFxcKSQvKSxoPWdldEZsYWdzKGQpLGk9bmV3IFJlZ0V4cChlLGgpLGo9W10sayxsPTAsbT0wO251bGwhPShrPWkuZXhlYyhmKSkmJmsuaW5kZXghPT1pLmxhc3RJbmRleCYmKGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCxrLmluZGV4KSkpLGcmJmoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoa1swXSkpLGw9aS5sYXN0SW5kZXgsbSs9MSwhKGMmJm0+PWMpKTspO3JldHVybiBqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGYuc3Vic3RyaW5nKGwpKSksbmV3IFNrLmJ1aWx0aW4ubGlzdChqKX0sX3NwbGl0LmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIixcXFwiZmxhZ3NcXFwiXSxfc3BsaXQuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKF9zcGxpdCksX2ZpbmRhbGw9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsajtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYoZD1Tay5mZmkudW53cmFwbyhhKSxlPVNrLmZmaS51bndyYXBvKGIpLGQ9Y29udmVydChkKSxmPWdldEZsYWdzKGMpLGc9bmV3IFJlZ0V4cChkLGYpLGQubWF0Y2goL1xcXFwkLykpe3ZhciBrPW5ldyBSZWdFeHAoL1xcXFxuJC8pO2UubWF0Y2goaykmJihlPWUuc2xpY2UoMCwtMSkpfWZvcihoPVtdLGo7bnVsbCE9KGo9Zy5leGVjKGUpKTspe2lmKDI+ai5sZW5ndGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqWzBdKSk7ZWxzZSBpZigyPT1qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMV0pKTtlbHNle2Zvcih2YXIgbD1bXSxtPTE7bTxqLmxlbmd0aDttKyspbC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqW21dKSk7aC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGwpKX1qLmluZGV4PT09Zy5sYXN0SW5kZXgmJihnLmxhc3RJbmRleCs9MSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoaCl9LF9maW5kYWxsLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX2ZpbmRhbGwuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKF9maW5kYWxsKSxtYXRjaG9iaj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS50aGVtYXRjaD1iLGEucmU9YyxhLnN0cmluZz1kLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuZ3JvdXBzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVtYXRjaC52LnNsaWNlKDEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX0pLGIuZ3JvdXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9dm9pZCAwPT09Yj8wOlNrLmJ1aWx0aW4uYXNudW0kKGIpLGI+PWEudGhlbWF0Y2gudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiSW5kZXggb3V0IG9mIHJhbmdlOiBcXFwiK2IpO3JldHVybiBhLnRoZW1hdGNoLnZbYl19KX0sbW9kLk1hdGNoT2JqZWN0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MobW9kLG1hdGNob2JqLFxcXCJNYXRjaE9iamVjdFxcXCIsW10pLG1vZC5fZmluZHJlPWZ1bmN0aW9uKHJlcyxzdHJpbmcpe3Jlcz1yZXMucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIik7dmFyIG1hdGNoZXMsc2l0ZW0scmV0dmFsLHJlPWV2YWwocmVzKSxwYXR0PS9cXFxcbiQvLHN0cj1Tay5mZmkucmVtYXBUb0pzKHN0cmluZyk7aWYobWF0Y2hlcz1zdHIubWF0Y2gocGF0dCk/c3RyLnNsaWNlKDAsLTEpLm1hdGNoKHJlKTpzdHIubWF0Y2gocmUpLHJldHZhbD1uZXcgU2suYnVpbHRpbi5saXN0LG51bGw9PW1hdGNoZXMpcmV0dXJuIHJldHZhbDtmb3IodmFyIGk9MDtpPG1hdGNoZXMubGVuZ3RoOysraSlzaXRlbT1uZXcgU2suYnVpbHRpbi5zdHIobWF0Y2hlc1tpXSkscmV0dmFsLnYucHVzaChzaXRlbSk7cmV0dXJuIHJldHZhbH0sX3NlYXJjaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4oZT1cXFwiL1xcXCIrYS52LnJlcGxhY2UoL1xcXFwvL2csXFxcIlxcXFxcXFxcL1xcXCIpK1xcXCIvXFxcIixsc3Q9bW9kLl9maW5kcmUoZSxiKSwxPmxzdC52Lmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX3NlYXJjaC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9zZWFyY2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2Quc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoX3NlYXJjaCksX21hdGNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hdGNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuKHBhdD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9XFxcIi9eXFxcIitwYXQucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+U2suZmZpLnJlbWFwVG9Kcyhsc3QpLmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX21hdGNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX21hdGNoLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLm1hdGNoPW5ldyBTay5idWlsdGluLmZ1bmMoX21hdGNoKSxyZWdleG9iaj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaDtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlPWIsYS5mbGFncz12b2lkIDA9PT1jPzA6YyxTay5idWlsdGluLm5vbmUubm9uZSR9KSxoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcInJlLmNvbXBpbGUoJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLnJlKStcXFwiJylcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGIuc3Vic3RyaW5nKDAsMjEyKSl9KSxiLl9fc3RyX189aCxiLl9fcmVwcl9fPWgsYz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxlPW51bGw9PWI/MDpTay5mZmkucmVtYXBUb0pzKGIpLGY9bnVsbD09Yz9kLmxlbmd0aDpTay5mZmkucmVtYXBUb0pzKGMpO3JldHVyblxcXCJeXFxcIj09ZSYmKGU9ZC5pbmRleE9mKFxcXCJcXFxcblxcXCIpKzEpLG51bGw9PT1mJiYoZj1kLmxlbmd0aCksU2suZmZpLnJlbWFwVG9QeShkLnN1YnN0cmluZyhlLGYpKX0sZD1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX3NlYXJjaChhLnJlLGYsYS5mbGFncyl9LGQuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLnNlYXJjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGU9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX21hdGNoKGEucmUsZixhLmZsYWdzKX0sZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxlLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxmPWZ1bmN0aW9uKGEsYixjKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrSW50KGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhbiBpbnRlZ2VyXFxcIik7cmV0dXJuIF9zcGxpdChhLnJlLGIsYyxhLmZsYWdzKX0sZi5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJtYXhzcGxpdFxcXCJdLGYuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxiLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZiksZz1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9maW5kYWxsKGEucmUsZixhLmZsYWdzKX0sZy5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxnLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGcpfSxtb2QuUmVnZXhPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QscmVnZXhvYmosXFxcIlJlZ2V4T2JqZWN0XFxcIixbXSksbW9kLmNvbXBpbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNvbXBpbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWImJihiPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybiBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuUmVnZXhPYmplY3QsW2EsYl0pLGN9KSxtb2QucHVyZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLG1vZH07XCIsXCJzcmMvbGliL3JlcHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJlcHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZXF1ZXN0cy5weVwiOlwiIyBtb3N0IHJlc3RyaWN0ZWQgdmVyc2lvblxcblxcXCJcXFwiXFxcIlxcblRoaXMgc29sdXRpb24gd29ya3MgaW4gcnVuZXN0b25lIC0gaG93ZXZlciBpdCBpcyBtdWNoIG1vcmUgbGltaXRlZC5cXG5BbiBlcnJvciBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHRleHRib29rIGFzIGl0IGRvZXNcXG5mb3IgdGhlIGNvbW1hbmQgbGluZS4gU2luY2UgSFRUUEVycm9yIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluXFxuUnVuZXN0b25lLCBJIGhhZCB0byBjaGFuZ2UgdGhlIGV4Y2VwdGlvbi5cXG5EZWNvZGUgYW5kIEVuY29kZSBhcmUgbm90IGF2YWlsYWJsZSBpbiBSdW5lc3RvbmUsIHNvIHRoZXJlIG1pZ2h0IGJlXFxuaXNzdWVzIHdpdGggcmVwb25zZXMuXFxuRG9lcyBub3QgdXNlIHRoZSBzdGF0dXMgYXR0cmlidXRlIGZvciB1cmxvcGVuLCB3b3VsZCBiZSBuaWNlIHRvIGhhdmVcXG50aGF0IGJhY2suXFxuRG9lcyBub3Qgd29yayBvbiByZWd1bGFyIHdlYiBwYWdlcyAobGlrZSBnb29nbGUgb3IgdGhlIG1pY2hpZ2FuIGRhaWx5KSBiZWNhdXNlIG9mIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGxpbWl0cy5cXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuaW1wb3J0IGpzb25cXG5cXG5jbGFzcyBSZXNwb25zZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHVybCk6XFxuICAgICAgICBzZWxmLnRleHQgPSBkYXRhXFxuICAgICAgICBzZWxmLnVybCA9IHVybFxcblxcbiAgICBkZWYganNvbihzZWxmKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhzZWxmLnRleHQpXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHtcXFwiZXJyb3JcXFwiOiBcXFwiUmVzcG9uc2Ugbm90IGludGVycHJldGFibGUgYXMganNvbi4gVHJ5IHByaW50aW5nIHRoZSAudGV4dCBhdHRyaWJ1dGVcXFwifVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiPEEgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6IHt9PlxcXCIuZm9ybWF0KHNlbGYudXJsKVxcblxcblxcbnVybF9zdWJzID0ge1xcXCIgXFxcIjogXFxcIitcXFwiLFxcbiAgICAgICAgICAgIFxcXCIhXFxcIjogXFxcIiUyMVxcXCIsXFxuICAgICAgICAgICAgJ1xcXCInOiBcXFwiJTIyXFxcIixcXG4gICAgICAgICAgICBcXFwiI1xcXCI6IFxcXCIlMjNcXFwiLFxcbiAgICAgICAgICAgIFxcXCIkXFxcIjogXFxcIiUyNFxcXCIsXFxuICAgICAgICAgICAgXFxcIidcXFwiOiBcXFwiJTI3XFxcIixcXG4gICAgICAgICAgICBcXFwiKFxcXCI6IFxcXCIlMjhcXFwiLFxcbiAgICAgICAgICAgIFxcXCIpXFxcIjogXFxcIiUyOVxcXCIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBcXFwiJTJBXFxcIixcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IFxcXCIlMkJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIsXFxcIjogXFxcIiUyQ1xcXCIsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBcXFwiJTJGXFxcIixcXG4gICAgICAgICAgICBcXFwiOlxcXCI6IFxcXCIlM0FcXFwiLFxcbiAgICAgICAgICAgIFxcXCI7XFxcIjogXFxcIiUzQlxcXCIsXFxuICAgICAgICAgICAgXFxcIj1cXFwiOiBcXFwiJTNEXFxcIixcXG4gICAgICAgICAgICBcXFwiP1xcXCI6IFxcXCIlM0ZcXFwiLFxcbiAgICAgICAgICAgIFxcXCJAXFxcIjogXFxcIiU0MFxcXCIsXFxuICAgICAgICAgICAgXFxcIltcXFwiOiBcXFwiJTVCXFxcIixcXG4gICAgICAgICAgICBcXFwiXVxcXCI6IFxcXCIlNURcXFwiLFxcbiAgICAgICAgICAgIH1cXG5cXG5kZWYgX3N1YnN0KHMsIHN1YnN0aXR1dGlvbnM9dXJsX3N1YnMpOlxcbiAgICByZXMgPSBcXFwiXFxcIlxcbiAgICBmb3IgYyBpbiBzdHIocyk6XFxuICAgICAgICBpZiBjIGluIHN1YnN0aXR1dGlvbnM6XFxuICAgICAgICAgICAgcmVzICs9IHN1YnN0aXR1dGlvbnNbY11cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmVzICs9IGNcXG4gICAgcmV0dXJuIHJlc1xcblxcblxcbmRlZiByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIHRyeTpcXG4gICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2V1cmxcXG4gICAgICAgIGNvbXBsZXRlX3VybCA9IGJhc2V1cmwgKyBcXFwiP1xcXCJcXG4gICAgICAgIHBhaXJzID0gW1xcXCJ7fT17fVxcXCIuZm9ybWF0KF9zdWJzdChrKSwgX3N1YnN0KHBhcmFtc1trXSkpIGZvciBrIGluIHBhcmFtc11cXG4gICAgICAgIGNvbXBsZXRlX3VybCArPSBcXFwiJlxcXCIuam9pbihwYWlycylcXG4gICAgICAgIHJldHVybiBjb21wbGV0ZV91cmxcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIGZ1bGxfdXJsID0gcmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXMpXFxuICAgIGlmIG5vdCBmdWxsX3VybDpcXG4gICAgICAgIHRleHRfZGF0YSA9IFxcXCI8aHRtbD48Ym9keT48aDE+aW52YWxpZCByZXF1ZXN0PC9oMT48L2JvZHk+PC9odG1sPlxcXCJcXG4gICAgICAgIGZ1bGxfdXJsID0gXFxcIkNvdWxkbuKAmXQgZ2VuZXJhdGUgYSB2YWxpZCBVUkxcXFwiXFxuICAgIGVsc2U6XFxuICAgICAgICBkYXRhID0gdXJsb3BlbihmdWxsX3VybClcXG4gICAgICAgIHRleHRfZGF0YSA9IGRhdGEucmVhZCgpLnN0cmlwKClcXG4gICAgICAgIGlmIGxlbih0ZXh0X2RhdGEpID09IDA6XFxuICAgICAgICAgICAgdGV4dF9kYXRhID0gXFxcIkZhaWxlZCB0byByZXRyaWV2ZSB0aGF0IFVSTFxcXCJcXG4gICAgcmV0dXJuIFJlc3BvbnNlKHRleHRfZGF0YSwgZnVsbF91cmwpXCIsXCJzcmMvbGliL3JlcXVlc3RzX3dpdGhfY2FjaGluZy5weVwiOlwiaW1wb3J0IHJlcXVlc3RzXFxuaW1wb3J0IGpzb25cXG5cXG5QRVJNQU5FTlRfQ0FDSEVfRk5BTUUgPSBcXFwicGVybWFuZW50X2NhY2hlLnR4dFxcXCJcXG5URU1QX0NBQ0hFX0ZOQU1FID0gXFxcInRoaXNfcGFnZV9jYWNoZS50eHRcXFwiXFxuXFxuZGVmIF93cml0ZV90b19maWxlKGNhY2hlLCBmbmFtZSk6XFxuICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBvdXRmaWxlOlxcbiAgICAgICAgb3V0ZmlsZS53cml0ZShqc29uLmR1bXBzKGNhY2hlLCBpbmRlbnQ9MikpXFxuXFxuZGVmIF9yZWFkX2Zyb21fZmlsZShmbmFtZSk6XFxuICAgIHRyeTpcXG4gICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3InKSBhcyBpbmZpbGU6XFxuICAgICAgICAgICAgcmVzID0gaW5maWxlLnJlYWQoKVxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlcylcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIHt9XFxuXFxuZGVmIGFkZF90b19jYWNoZShjYWNoZV9maWxlLCBjYWNoZV9rZXksIGNhY2hlX3ZhbHVlKTpcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShjYWNoZV9maWxlKVxcbiAgICB0ZW1wX2NhY2hlW2NhY2hlX2tleV0gPSBjYWNoZV92YWx1ZVxcbiAgICBfd3JpdGVfdG9fZmlsZSh0ZW1wX2NhY2hlLCBjYWNoZV9maWxlKVxcblxcbmRlZiBjbGVhcl9jYWNoZShjYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBfd3JpdGVfdG9fZmlsZSh7fSwgY2FjaGVfZmlsZSlcXG5cXG5kZWYgbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zX2QsIHByaXZhdGVfa2V5cz1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYWtlcyBhIGxvbmcgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcXVlcnkuXFxuICAgIEFscGhhYmV0aXplIHRoZSBrZXlzIGZyb20gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IHNvIHdlIGdldCB0aGUgc2FtZSBvcmRlciBlYWNoIHRpbWUuXFxuICAgIE9taXQga2V5cyB3aXRoIHByaXZhdGUgaW5mby5cXFwiXFxcIlxcXCJcXG4gICAgYWxwaGFiZXRpemVkX2tleXMgPSBzb3J0ZWQocGFyYW1zX2Qua2V5cygpKVxcbiAgICByZXMgPSBbXVxcbiAgICBmb3IgayBpbiBhbHBoYWJldGl6ZWRfa2V5czpcXG4gICAgICAgIGlmIGsgbm90IGluIHByaXZhdGVfa2V5czpcXG4gICAgICAgICAgICByZXMuYXBwZW5kKFxcXCJ7fS17fVxcXCIuZm9ybWF0KGssIHBhcmFtc19kW2tdKSlcXG4gICAgcmV0dXJuIGJhc2V1cmwgKyBcXFwiX1xcXCIuam9pbihyZXMpXFxuXFxuZGVmIGdldChiYXNldXJsLCBwYXJhbXM9e30sIHByaXZhdGVfa2V5c190b19pZ25vcmU9W1xcXCJhcGlfa2V5XFxcIiwgXFxcImFwaWtleVxcXCJdLCBwZXJtYW5lbnRfY2FjaGVfZmlsZT1QRVJNQU5FTlRfQ0FDSEVfRk5BTUUsIHRlbXBfY2FjaGVfZmlsZT1URU1QX0NBQ0hFX0ZOQU1FKTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0cy5yZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgY2FjaGVfa2V5ID0gbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zLCBwcml2YXRlX2tleXNfdG9faWdub3JlKVxcbiAgICAjIExvYWQgdGhlIHBlcm1hbmVudCBhbmQgcGFnZS1zcGVjaWZpYyBjYWNoZXMgZnJvbSBmaWxlc1xcbiAgICBwZXJtYW5lbnRfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUocGVybWFuZW50X2NhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUodGVtcF9jYWNoZV9maWxlKVxcbiAgICBpZiBjYWNoZV9rZXkgaW4gdGVtcF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwYWdlLXNwZWNpZmljIGNhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZSh0ZW1wX2NhY2hlW2NhY2hlX2tleV0sIGZ1bGxfdXJsKVxcbiAgICBlbGlmIGNhY2hlX2tleSBpbiBwZXJtYW5lbnRfY2FjaGU6XFxuICAgICAgICBwcmludChcXFwiZm91bmQgaW4gcGVybWFuZW50X2NhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZShwZXJtYW5lbnRfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsc2U6XFxuICAgICAgICBwcmludChcXFwibmV3OyBhZGRpbmcgdG8gY2FjaGVcXFwiKVxcbiAgICAgICAgIyBhY3R1YWxseSByZXF1ZXN0IGl0XFxuICAgICAgICByZXNwID0gcmVxdWVzdHMuZ2V0KGJhc2V1cmwsIHBhcmFtcylcXG4gICAgICAgICMgc2F2ZSBpdFxcbiAgICAgICAgYWRkX3RvX2NhY2hlKHRlbXBfY2FjaGVfZmlsZSwgY2FjaGVfa2V5LCByZXNwLnRleHQpXFxuICAgICAgICByZXR1cm4gcmVzcFwiLFwic3JjL2xpYi9yZXhlYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmV4ZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZmM4MjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJmYzgyMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JsY29tcGxldGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJybGNvbXBsZXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JvYm90cGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyb2JvdHBhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3J1bnB5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJydW5weSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NjaGVkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzY2hlZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NldHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNldHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zZ21sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzZ21sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hhLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGVsdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoZWx2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NobGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGxleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NodXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2h1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2lnbmFsLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17U0lHX0RGTDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNJR19JR046bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxDVFJMX0NfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxDVFJMX0JSRUFLX0VWRU5UOm5ldyBTay5idWlsdGluLmludF8oMCksTlNJRzpuZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxTSUdIVVA6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxTSUdOSU5UOm5ldyBTay5idWlsdGluLmludF8oMiksU0lHSUxMOm5ldyBTay5idWlsdGluLmludF8oNCksU0lHRlBFOm5ldyBTay5idWlsdGluLmludF8oOCksU0lHS0lMTDpuZXcgU2suYnVpbHRpbi5pbnRfKDkpLFNJR1NFR1Y6bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksU0lHVEVSTTpuZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxTSUdCUkVBSzpuZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxTSUdBQlJUOm5ldyBTay5idWlsdGluLmludF8oMjIpLHBhdXNlOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwYXVzZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3ZhciBhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihhKXtpZihudWxsIT1Tay5zaWduYWxzJiZTay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIpe2Z1bmN0aW9uIGhhbmRsZVNpZ25hbCgpe1NrLnNpZ25hbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpLGEoKX1Tay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlU2lnbmFsKX1lbHNlIGNvbnNvbGUud2FybihcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLFNrLm1pc2NldmFsLnByaW50XyhcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLGEoKX0pfSxhfSksc2lnbmFsOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaWduYWwuc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQuXFxcIil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi9zaXRlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaXRlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNtdHBkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NuZGhkci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic25kaGRyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc29ja2V0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzb2NrZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcWxpdGUzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcWxpdGUzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29tcGlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29uc3RhbnRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29uc3RhbnRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX3BhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfcGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zc2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNzbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0YXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdGF0aXN0aWNzLnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5CYXNpYyBzdGF0aXN0aWNzIG1vZHVsZS5cXG5cXG5UaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3Mgb2YgZGF0YSwgaW5jbHVkaW5nXFxuYXZlcmFnZXMsIHZhcmlhbmNlLCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLlxcblxcbkNhbGN1bGF0aW5nIGF2ZXJhZ2VzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbm1lYW4gICAgICAgICAgICAgICAgQXJpdGhtZXRpYyBtZWFuIChhdmVyYWdlKSBvZiBkYXRhLlxcbmhhcm1vbmljX21lYW4gICAgICAgSGFybW9uaWMgbWVhbiBvZiBkYXRhLlxcbm1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuXFxubWVkaWFuX2xvdyAgICAgICAgICBMb3cgbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2hpZ2ggICAgICAgICBIaWdoIG1lZGlhbiBvZiBkYXRhLlxcbm1lZGlhbl9ncm91cGVkICAgICAgTWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGdyb3VwZWQgZGF0YS5cXG5tb2RlICAgICAgICAgICAgICAgIE1vZGUgKG1vc3QgY29tbW9uIHZhbHVlKSBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBhcml0aG1ldGljIG1lYW4gKFxcXCJ0aGUgYXZlcmFnZVxcXCIpIG9mIGRhdGE6XFxuXFxuPj4+IG1lYW4oWy0xLjAsIDIuNSwgMy4yNSwgNS43NV0pXFxuMi42MjVcXG5cXG5cXG5DYWxjdWxhdGUgdGhlIHN0YW5kYXJkIG1lZGlhbiBvZiBkaXNjcmV0ZSBkYXRhOlxcblxcbj4+PiBtZWRpYW4oWzIsIDMsIDQsIDVdKVxcbjMuNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgbWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGRhdGEgZ3JvdXBlZCBpbnRvIGNsYXNzIGludGVydmFsc1xcbmNlbnRyZWQgb24gdGhlIGRhdGEgdmFsdWVzIHByb3ZpZGVkLiBFLmcuIGlmIHlvdXIgZGF0YSBwb2ludHMgYXJlIHJvdW5kZWQgdG9cXG50aGUgbmVhcmVzdCB3aG9sZSBudW1iZXI6XFxuXFxuPj4+IG1lZGlhbl9ncm91cGVkKFsyLCAyLCAzLCAzLCAzLCA0XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG4yLjgzMzMzMzMzMzMuLi5cXG5cXG5UaGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiB0aGlzIHdheTogeW91IGhhdmUgdHdvIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzc1xcbmludGVydmFsIDEuNS0yLjUsIHRocmVlIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzcyBpbnRlcnZhbCAyLjUtMy41LCBhbmQgb25lIGluXFxudGhlIGNsYXNzIGludGVydmFsIDMuNS00LjUuIFRoZSBtZWRpYW4gb2YgdGhlc2UgZGF0YSBwb2ludHMgaXMgMi44MzMzLi4uXFxuXFxuXFxuQ2FsY3VsYXRpbmcgdmFyaWFiaWxpdHkgb3Igc3ByZWFkXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5GdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5wdmFyaWFuY2UgICAgICAgICAgIFBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgZGF0YS5cXG52YXJpYW5jZSAgICAgICAgICAgIFNhbXBsZSB2YXJpYW5jZSBvZiBkYXRhLlxcbnBzdGRldiAgICAgICAgICAgICAgUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG5zdGRldiAgICAgICAgICAgICAgIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBkYXRhOlxcblxcbj4+PiBzdGRldihbMi41LCAzLjI1LCA1LjUsIDExLjI1LCAxMS43NV0pICAjZG9jdGVzdDogK0VMTElQU0lTXFxuNC4zODk2MTg0MzQ0NC4uLlxcblxcbklmIHlvdSBoYXZlIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB0aGUgbWVhbiwgeW91IGNhbiBwYXNzIGl0IGFzIHRoZSBvcHRpb25hbFxcbnNlY29uZCBhcmd1bWVudCB0byB0aGUgZm91ciBcXFwic3ByZWFkXFxcIiBmdW5jdGlvbnMgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdDpcXG5cXG4+Pj4gZGF0YSA9IFsxLCAyLCAyLCA0LCA0LCA0LCA1LCA2XVxcbj4+PiBtdSA9IG1lYW4oZGF0YSlcXG4+Pj4gcHZhcmlhbmNlKGRhdGEsIG11KVxcbjIuNVxcblxcblxcbkV4Y2VwdGlvbnNcXG4tLS0tLS0tLS0tXFxuXFxuQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQ6IFN0YXRpc3RpY3NFcnJvciBpcyBhIHN1YmNsYXNzIG9mIFZhbHVlRXJyb3IuXFxuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsXFxuICAgICAgICAgICAgJ3BzdGRldicsICdwdmFyaWFuY2UnLCAnc3RkZXYnLCAndmFyaWFuY2UnLFxcbiAgICAgICAgICAgICdtZWRpYW4nLCAgJ21lZGlhbl9sb3cnLCAnbWVkaWFuX2hpZ2gnLCAnbWVkaWFuX2dyb3VwZWQnLFxcbiAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLCAnaGFybW9uaWNfbWVhbicsXFxuICAgICAgICAgIF1cXG5cXG5mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyXFxuZnJvbSBtYXRoIGltcG9ydCBzcXJ0XFxuXFxuZGVmIG1lYW4oZGF0YSk6XFxuICAgIHJldHVybiBzdW0oZGF0YSkgLyBsZW4oZGF0YSlcXG5cXG5kZWYgaGFybW9uaWNfbWVhbihkYXRhKTpcXG4gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvclxcblxcblxcbmRlZiBtZWRpYW4oZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gKF9kYXRhW2wvLzJdICsgX2RhdGFbbC8vMi0xXSkgLyAyXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5kZWYgbWVkaWFuX2xvdyhkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yLTFdXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5cXG5kZWYgbWVkaWFuX2hpZ2goZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5fZ3JvdXBlZChkYXRhKTpcXG4gICAgcmV0dXJuIG1lZGlhbihkYXRhKVxcblxcbmRlZiBtb2RlKGRhdGEpOlxcbiAgICBjb3VudGVyID0gQ291bnRlcihkYXRhKVxcbiAgICBtYXhfY291bnQgPSBtYXgoY291bnRlci52YWx1ZXMoKSlcXG4gICAgX21vZGUgPSBbayBmb3Igayx2IGluIGNvdW50ZXIuaXRlbXMoKSBpZiB2ID09IG1heF9jb3VudF1cXG4gICAgaWYgbGVuKF9tb2RlKSA+IDE6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJObyBVbmlxdWUgTW9kZSwgZm91bmQge30gZXF1YWxseSBjb21tb24gdmFsdWVzXFxcIi5mb3JtYXQobGVuKF9tb2RlKSkpXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gX21vZGVbMF1cXG5cXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS9sZW4oZGF0YSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS8obGVuKGRhdGEpIC0xKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydChwdmFyaWFuY2UoZGF0YSkpXFxuXFxuZGVmIHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydCh2YXJpYW5jZShkYXRhKSlcXG5cXG5cIixcInNyYy9saWIvc3RhdHZmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdHZmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuYXNjaWlfbG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLmFzY2lpX3VwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5hc2NpaV9sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmFzY2lpX2xvd2VyY2FzZS52K2EuYXNjaWlfdXBwZXJjYXNlLnYpLGEubG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLnVwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmxvd2VyY2FzZS52K2EudXBwZXJjYXNlLnYpLGEuZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OVxcXCIpLGEuaGV4ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRlxcXCIpLGEub2N0ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1NjdcXFwiKSxhLnB1bmN0dWF0aW9uPW5ldyBTay5idWlsdGluLnN0cihcXFwiIVxcXFxcXFwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXFxdXl9ge3x9flxcXCIpLGEud2hpdGVzcGFjZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXFx0XFxcXG5cXFxceDBCXFxcXGZcXFxcciBcXFwiKSxhLnByaW50YWJsZT1uZXcgU2suYnVpbHRpbi5zdHIoYS5kaWdpdHMudithLmxldHRlcnMudithLnB1bmN0dWF0aW9uLnYrXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxceDBCXFxcXGZcXFwiKSxhLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuc3BsaXQsYSl9KSxhLmNhcGl0YWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5jYXBpdGFsaXplLFthXSl9KSxhLmpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiB2b2lkIDA9PT1iJiYoYj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5qb2luLFtiLGFdKX0pLGEuY2Fwd29yZHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNhcHdvcmRzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzZXAgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5zcGxpdCxbYixjXSkudixlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXSxoPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNhcGl0YWxpemUsW2ddKTtlLnB1c2goaCl9cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmpvaW4sW25ldyBTay5idWlsdGluLmxpc3QoZSksY10pfSksYX07XCIsXCJzcmMvbGliL3N0cmluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nb2xkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdvbGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdwcmVwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdwcmVwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RydWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJ1Y3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdWJwcm9jZXNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdWJwcm9jZXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXVkaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1ZGlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3ltYm9sLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW1ib2wgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW10YWJsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3ltdGFibGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YWJuYW5ueS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGFibmFubnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YXJmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YXJmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVsbmV0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWxuZXRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZW1wZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVtcGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuXFxuZGVmIHRlc3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBwbGFjZXM9NSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsaW50KTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxpZiBpc2luc3RhbmNlKGV4cGVjdGVkLGZsb2F0KTpcXG4gICAgICAgIGlmIGFicyhhY3R1YWwtZXhwZWN0ZWQpIDwgMTAqKigtcGxhY2VzKTpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgcHJpbnQoJ1Rlc3QgRmFpbGVkOiBleHBlY3RlZCAnICsgc3RyKGV4cGVjdGVkKSArICcgYnV0IGdvdCAnICsgc3RyKGFjdHVhbCkpXFxuICAgIHJldHVybiBGYWxzZVxcblxcbmRlZiB0ZXN0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCk6XFxuICAgIHBhc3NcXG5cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5fX2dldGF0dHJfXyA9IFxcXCJTdXJwcmlzZSFcXFwiXFxuX19kaXJfXyA9IFxcXCJTdXJwcmlzZSBhZ2FpbiFcXFwiXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIyLnB5XCI6XCJkZWYgX19nZXRhdHRyX18oKTpcXG4gICAgXFxcIkJhZCBvbmVcXFwiXFxuXFxueCA9IDFcXG5cXG5kZWYgX19kaXJfXyhiYWRfc2lnKTpcXG4gICAgcmV0dXJuIFtdXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIzLnB5XCI6XCJkZWYgX19nZXRhdHRyX18obmFtZSk6XFxuICAgIGdsb2JhbCBfX2dldGF0dHJfX1xcbiAgICBpZiBuYW1lICE9ICdkZWxnZXRhdHRyJzpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuICAgIGRlbCBfX2dldGF0dHJfX1xcbiAgICByYWlzZSBBdHRyaWJ1dGVFcnJvclxcblwiLFwic3JjL2xpYi90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbHRlc3RkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVzdC9nb29kX2dldGF0dHIucHlcIjpcInggPSAxXFxuXFxuZGVmIF9fZGlyX18oKTpcXG4gICAgcmV0dXJuIFsnYScsICdiJywgJ2MnXVxcblxcbmRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgaWYgbmFtZSA9PSBcXFwieW9sb1xcXCI6XFxuICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihcXFwiRGVwcmVjYXRlZCwgdXNlIHdoYXRldmVyIGluc3RlYWRcXFwiKVxcbiAgICByZXR1cm4gZlxcXCJUaGVyZSBpcyB7bmFtZX1cXFwiXFxuXFxueSA9IDJcXG5cIixcInNyYy9saWIvdGVzdC90ZXN0X3N1cHBvcnQucHlcIjpcIlxcXCJcXFwiXFxcIlN1cHBvcnRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy5cXFwiXFxcIlxcXCJcXG5cXG5pZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOlxcbiAgICByYWlzZSBJbXBvcnRFcnJvcigndGVzdF9zdXBwb3J0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlJylcXG5cXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5cXG4jIGRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiMgICAgIFxcXCJcXFwiXFxcIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy5cXFwiXFxcIlxcXCJcXG4jICAgICB2YWxpZF90eXBlcyA9ICh1bml0dGVzdC5UZXN0U3VpdGUsIHVuaXR0ZXN0LlRlc3RDYXNlKVxcbiMgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKClcXG4jICAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuIyAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzLCBzdHIpOlxcbiMgICAgICAgICAgICAgaWYgY2xzIGluIHN5cy5tb2R1bGVzOlxcbiMgICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QuZmluZFRlc3RDYXNlcyhzeXMubW9kdWxlc1tjbHNdKSlcXG4jICAgICAgICAgICAgIGVsc2U6XFxuIyAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwic3RyIGFyZ3VtZW50cyBtdXN0IGJlIGtleXMgaW4gc3lzLm1vZHVsZXNcXFwiKVxcbiMgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2xzLCB2YWxpZF90eXBlcyk6XFxuIyAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGNscylcXG4jICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpXFxuIyAgICAgX3J1bl9zdWl0ZShzdWl0ZSlcXG5cXG5kZWYgcnVuX3VuaXR0ZXN0KCpjbGFzc2VzKTpcXG4gICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuICAgICAgICBwcmludCBjbHNcXG4gICAgICAgIGlmIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgICAgICAgICAgY2xzKCkubWFpbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHByaW50IFxcXCJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBcXFwiLCBjbHNcXG5cIixcInNyYy9saWIvdGV4dHdyYXAucHlcIjpcIlxcXCJcXFwiXFxcIlRleHQgd3JhcHBpbmcgYW5kIGZpbGxpbmcuXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBHcmVnb3J5IFAuIFdhcmQuXFxuIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uXFxuIyBXcml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD5cXG5cXG5pbXBvcnQgcmUsIHN0cmluZ1xcblxcbl9fYWxsX18gPSBbJ1RleHRXcmFwcGVyJywgJ3dyYXAnLCAnZmlsbCcsICdkZWRlbnQnLCAnaW5kZW50JywgJ3Nob3J0ZW4nXVxcblxcbiMgSGFyZGNvZGUgdGhlIHJlY29nbml6ZWQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBVUy1BU0NJSVxcbiMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIG1haW4gcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXRcXG4jIHNvbWUgVW5pY29kZSBzcGFjZXMgKGxpa2UgXFxcXHUwMGEwKSBhcmUgbm9uLWJyZWFraW5nIHdoaXRlc3BhY2VzLlxcbl93aGl0ZXNwYWNlID0gJ1xcXFx0XFxcXG5cXFxceDBiXFxcXHgwY1xcXFxyICdcXG5cXG5jbGFzcyBUZXh0V3JhcHBlcjpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIE9iamVjdCBmb3Igd3JhcHBpbmcvZmlsbGluZyB0ZXh0LiAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgY29uc2lzdHMgb2ZcXG4gICAgdGhlIHdyYXAoKSBhbmQgZmlsbCgpIG1ldGhvZHM7IHRoZSBvdGhlciBtZXRob2RzIGFyZSBqdXN0IHRoZXJlIGZvclxcbiAgICBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cXG4gICAgSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSByZXBsYWNlIHRoZSBtYWluIHdyYXBwaW5nIGFsZ29yaXRobSxcXG4gICAgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gb3ZlcnJpZGUgX3dyYXBfY2h1bmtzKCkuXFxuICAgIFNldmVyYWwgaW5zdGFuY2UgYXR0cmlidXRlcyBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB3cmFwcGluZzpcXG4gICAgICB3aWR0aCAoZGVmYXVsdDogNzApXFxuICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCBvZiB3cmFwcGVkIGxpbmVzICh1bmxlc3MgYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgaXMgZmFsc2UpXFxuICAgICAgaW5pdGlhbF9pbmRlbnQgKGRlZmF1bHQ6IFxcXCJcXFwiKVxcbiAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2Ygd3JhcHBlZFxcbiAgICAgICAgb3V0cHV0LiAgQ291bnRzIHRvd2FyZHMgdGhlIGxpbmUncyB3aWR0aC5cXG4gICAgICBzdWJzZXF1ZW50X2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgbGluZXMgc2F2ZSB0aGUgZmlyc3RcXG4gICAgICAgIG9mIHdyYXBwZWQgb3V0cHV0OyBhbHNvIGNvdW50cyB0b3dhcmRzIGVhY2ggbGluZSdzIHdpZHRoLlxcbiAgICAgIGV4cGFuZF90YWJzIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy5cXG4gICAgICAgIEVhY2ggdGFiIHdpbGwgYmVjb21lIDAgLi4gJ3RhYnNpemUnIHNwYWNlcywgZGVwZW5kaW5nIG9uIGl0cyBwb3NpdGlvblxcbiAgICAgICAgaW4gaXRzIGxpbmUuICBJZiBmYWxzZSwgZWFjaCB0YWIgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIuXFxuICAgICAgdGFic2l6ZSAoZGVmYXVsdDogOClcXG4gICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gMCAuLiAndGFic2l6ZScgc3BhY2VzLCB1bmxlc3NcXG4gICAgICAgICdleHBhbmRfdGFicycgaXMgZmFsc2UuXFxuICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0IGJ5IHNwYWNlc1xcbiAgICAgICAgYWZ0ZXIgdGFiIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBpZiBleHBhbmRfdGFicyBpcyBmYWxzZSBhbmRcXG4gICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSBpcyB0cnVlLCBldmVyeSB0YWIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYVxcbiAgICAgICAgc2luZ2xlIHNwYWNlIVxcbiAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzIChkZWZhdWx0OiBmYWxzZSlcXG4gICAgICAgIEVuc3VyZSB0aGF0IHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbiBpcyBhbHdheXMgZm9sbG93ZWRcXG4gICAgICAgIGJ5IHR3byBzcGFjZXMuICBPZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBhbGdvcml0aG0gaXNcXG4gICAgICAgICh1bmF2b2lkYWJseSkgaW1wZXJmZWN0LlxcbiAgICAgIGJyZWFrX2xvbmdfd29yZHMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBCcmVhayB3b3JkcyBsb25nZXIgdGhhbiAnd2lkdGgnLiAgSWYgZmFsc2UsIHRob3NlIHdvcmRzIHdpbGwgbm90XFxuICAgICAgICBiZSBicm9rZW4sIGFuZCBzb21lIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuICd3aWR0aCcuXFxuICAgICAgYnJlYWtfb25faHlwaGVucyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEFsbG93IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMuIElmIHRydWUsIHdyYXBwaW5nIHdpbGwgb2NjdXJcXG4gICAgICAgIHByZWZlcmFibHkgb24gd2hpdGVzcGFjZXMgYW5kIHJpZ2h0IGFmdGVyIGh5cGhlbnMgcGFydCBvZlxcbiAgICAgICAgY29tcG91bmQgd29yZHMuXFxuICAgICAgZHJvcF93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRHJvcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbGluZXMuXFxuICAgICAgbWF4X2xpbmVzIChkZWZhdWx0OiBOb25lKVxcbiAgICAgICAgVHJ1bmNhdGUgd3JhcHBlZCBsaW5lcy5cXG4gICAgICBwbGFjZWhvbGRlciAoZGVmYXVsdDogJyBbLi4uXScpXFxuICAgICAgICBBcHBlbmQgdG8gdGhlIGxhc3QgbGluZSBvZiB0cnVuY2F0ZWQgdGV4dC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFucyA9IHt9XFxuICAgICMgdXNwYWNlID0gb3JkKCcgJylcXG4gICAgdXNwYWNlID0gJyAnXFxuICAgIGZvciB4IGluIF93aGl0ZXNwYWNlOlxcbiAgICAgICAgIyB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbb3JkKHgpXSA9IHVzcGFjZVxcbiAgICAgICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zW3hdID0gdXNwYWNlXFxuXFxuICAgICMgVGhpcyBmdW5reSBsaXR0bGUgcmVnZXggaXMganVzdCB0aGUgdHJpY2sgZm9yIHNwbGl0dGluZ1xcbiAgICAjIHRleHQgdXAgaW50byB3b3JkLXdyYXBwYWJsZSBjaHVua3MuICBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLS9iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIVxcbiAgICAjIChhZnRlciBzdHJpcHBpbmcgb3V0IGVtcHR5IHN0cmluZ3MpLlxcbiAgICB3b3Jkc2VwX3JlID0gcmUuY29tcGlsZShcXG4gICAgICAgIHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSkpJykgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICBlbV9kYXNoID0gcmUuY29tcGlsZShyJyhcXFxccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSl8JyAgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICByJyg/IV4pLXsyLH0oPz1cXFxcdykpJykgICAgICAgICAgICAgICAgICAgICAjIGVtLWRhc2hcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICMgVGhpcyBsZXNzIGZ1bmt5IGxpdHRsZSByZWdleCBqdXN0IHNwbGl0IG9uIHJlY29nbml6ZWQgc3BhY2VzLiBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLWJhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hL1xcbiAgICB3b3Jkc2VwX3NpbXBsZV9yZSA9IHJlLmNvbXBpbGUocicoXFxcXHMrKScpXFxuXFxuXFxuICAgICMgWFhYIHRoaXMgaXMgbm90IGxvY2FsZS0gb3IgY2hhcnNldC1hd2FyZSAtLSBzdHJpbmcubG93ZXJjYXNlXFxuICAgICMgaXMgVVMtQVNDSUkgb25seSAoYW5kIHRoZXJlZm9yZSBFbmdsaXNoLW9ubHkpXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHJlLmNvbXBpbGUocidbYS16XScgICAgICAgICAgICAgIyBsb3dlcmNhc2UgbGV0dGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXC5cXFxcIVxcXFw/XScgICAgICAgICAgIyBzZW50ZW5jZS1lbmRpbmcgcHVuY3QuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXFxcXCJcXFxcJ10/JyAgICAgICAgICAgIyBvcHRpb25hbCBlbmQtb2YtcXVvdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xcXFxaJykgICAgICAgICAgICAgICAjIGVuZCBvZiBjaHVua1xcbiAgICBzZW50ZW5jZV9lbmRfcmUgPSByJ1thLXpdW1xcXFwuXFxcXCFcXFxcP11bXFxcXFxcXCJcXFxcJ10/J1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZixcXG4gICAgICAgICAgICAgICAgIHdpZHRoPTcwLFxcbiAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPVRydWUsXFxuICAgICAgICAgICAgICAgICByZXBsYWNlX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzPUZhbHNlLFxcbiAgICAgICAgICAgICAgICAgYnJlYWtfbG9uZ193b3Jkcz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsXFxuICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPVRydWUsXFxuICAgICAgICAgICAgICAgICB0YWJzaXplPTgsXFxuICAgICAgICAgICAgICAgICBtYXhfbGluZXM9Tm9uZSxcXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPScgWy4uLl0nKTpcXG4gICAgICAgIHNlbGYud2lkdGggPSB3aWR0aFxcbiAgICAgICAgc2VsZi5pbml0aWFsX2luZGVudCA9IGluaXRpYWxfaW5kZW50XFxuICAgICAgICBzZWxmLnN1YnNlcXVlbnRfaW5kZW50ID0gc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFic1xcbiAgICAgICAgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2UgPSByZXBsYWNlX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3MgPSBmaXhfc2VudGVuY2VfZW5kaW5nc1xcbiAgICAgICAgc2VsZi5icmVha19sb25nX3dvcmRzID0gYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgPSBkcm9wX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuYnJlYWtfb25faHlwaGVucyA9IGJyZWFrX29uX2h5cGhlbnNcXG4gICAgICAgIHNlbGYudGFic2l6ZSA9IHRhYnNpemVcXG4gICAgICAgIHNlbGYubWF4X2xpbmVzID0gbWF4X2xpbmVzXFxuICAgICAgICBzZWxmLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJcXG5cXG5cXG4gICAgIyAtLSBQcml2YXRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAocG9zc2libHkgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlKVxcblxcbiAgICBkZWYgX211bmdlX3doaXRlc3BhY2Uoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmdcXG4gICAgICAgIE11bmdlIHdoaXRlc3BhY2UgaW4gdGV4dDogZXhwYW5kIHRhYnMgYW5kIGNvbnZlcnQgYWxsIG90aGVyXFxuICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gc3BhY2VzLiAgRWcuIFxcXCIgZm9vXFxcXFxcXFx0YmFyXFxcXFxcXFxuXFxcXFxcXFxuYmF6XFxcIlxcbiAgICAgICAgYmVjb21lcyBcXFwiIGZvbyAgICBiYXIgIGJhelxcXCIuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuZXhwYW5kX3RhYnM6XFxuICAgICAgICAgICAgdGV4dCA9IHRleHQuZXhwYW5kdGFicyhzZWxmLnRhYnNpemUpXFxuICAgICAgICBpZiBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZTpcXG4gICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2VsZi51bmljb2RlX3doaXRlc3BhY2VfdHJhbnMuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShrZXksIHZhbClcXG4gICAgICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuICAgIGRlZiBfc3BsaXQoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfc3BsaXQodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFNwbGl0IHRoZSB0ZXh0IHRvIHdyYXAgaW50byBpbmRpdmlzaWJsZSBjaHVua3MuICBDaHVua3MgYXJlXFxuICAgICAgICBub3QgcXVpdGUgdGhlIHNhbWUgYXMgd29yZHM7IHNlZSBfd3JhcF9jaHVua3MoKSBmb3IgZnVsbFxcbiAgICAgICAgZGV0YWlscy4gIEFzIGFuIGV4YW1wbGUsIHRoZSB0ZXh0XFxuICAgICAgICAgIExvb2ssIGdvb2YtYmFsbCAtLSB1c2UgdGhlIC1iIG9wdGlvbiFcXG4gICAgICAgIGJyZWFrcyBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLScsICdiYWxsJywgJyAnLCAnLS0nLCAnICcsXFxuICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgJ29wdGlvbiEnXFxuICAgICAgICBpZiBicmVha19vbl9oeXBoZW5zIGlzIFRydWUsIG9yIGluOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLWJhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCBvcHRpb24hJ1xcbiAgICAgICAgb3RoZXJ3aXNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZTpcXG4gICAgICAgICAgICBjaHVua3MgPSBzZWxmLndvcmRzZXBfcmUuc3BsaXQodGV4dClcXG4gICAgICAgICAgICBpZiBcXFwiLS1cXFwiIGluIHRleHQ6XFxuICAgICAgICAgICAgICAgIGNodW5rcyA9IFtpdGVtIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3VibGlzdCBpbiBbc2VsZi5lbV9kYXNoLnNwbGl0KGNodW5rKSBmb3IgY2h1bmsgaW4gY2h1bmtzXSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHN1Ymxpc3RdXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9zaW1wbGVfcmUuc3BsaXQodGV4dClcXG4gICAgICAgIGNodW5rcyA9IFtjIGZvciBjIGluIGNodW5rcyBpZiBjXVxcbiAgICAgICAgcmV0dXJuIGNodW5rc1xcblxcbiAgICBkZWYgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzIDogW3N0cmluZ10pXFxuICAgICAgICBDb3JyZWN0IGZvciBzZW50ZW5jZSBlbmRpbmdzIGJ1cmllZCBpbiAnY2h1bmtzJy4gIEVnLiB3aGVuIHRoZVxcbiAgICAgICAgb3JpZ2luYWwgdGV4dCBjb250YWlucyBcXFwiLi4uIGZvby5cXFxcXFxcXG5CYXIgLi4uXFxcIiwgbXVuZ2Vfd2hpdGVzcGFjZSgpXFxuICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhhdCB0byBbLi4uLCBcXFwiZm9vLlxcXCIsIFxcXCIgXFxcIiwgXFxcIkJhclxcXCIsIC4uLl1cXG4gICAgICAgIHdoaWNoIGhhcyBvbmUgdG9vIGZldyBzcGFjZXM7IHRoaXMgbWV0aG9kIHNpbXBseSBjaGFuZ2VzIHRoZSBvbmVcXG4gICAgICAgIHNwYWNlIHRvIHR3by5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaSA9IDBcXG4gICAgICAgICMgcGF0c2VhcmNoID0gc2VsZi5zZW50ZW5jZV9lbmRfcmUuc2VhcmNoXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGNodW5rcyktMTpcXG4gICAgICAgICAgICBpZiBjaHVua3NbaSsxXSA9PSBcXFwiIFxcXCIgYW5kIHJlLnNlYXJjaChzZWxmLnNlbnRlbmNlX2VuZF9yZSwgY2h1bmtzW2ldKSBhbmQgY2h1bmtzW2ldWy0xXSBpbiBcXFwiLiE/XFxcXFxcXCJcXFxcJ1xcXCI6XFxuICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdID0gXFxcIiAgXFxcIlxcbiAgICAgICAgICAgICAgICBpICs9IDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG5cXG4gICAgZGVmIF9oYW5kbGVfbG9uZ193b3JkKHNlbGYsIHJldmVyc2VkX2NodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcyA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUgOiBbc3RyaW5nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gOiBpbnQsIHdpZHRoIDogaW50KVxcbiAgICAgICAgSGFuZGxlIGEgY2h1bmsgb2YgdGV4dCAobW9zdCBsaWtlbHkgYSB3b3JkLCBub3Qgd2hpdGVzcGFjZSkgdGhhdFxcbiAgICAgICAgaXMgdG9vIGxvbmcgdG8gZml0IGluIGFueSBsaW5lLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIEZpZ3VyZSBvdXQgd2hlbiBpbmRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCB3aWR0aCwgYW5kIG1ha2VcXG4gICAgICAgICMgc3VyZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGlzIHN0cmlwcGVkIG9mZiBvbiBldmVyeSBwYXNzXFxuICAgICAgICBpZiB3aWR0aCA8IDE6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IHdpZHRoIC0gY3VyX2xlblxcblxcbiAgICAgICAgIyBJZiB3ZSdyZSBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIHRoZW4gZG8gc286IHB1dCBhcyBtdWNoXFxuICAgICAgICAjIG9mIHRoZSBuZXh0IGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZSBhcyB3aWxsIGZpdC5cXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfbG9uZ193b3JkczpcXG4gICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzWy0xXVs6c3BhY2VfbGVmdF0pXFxuICAgICAgICAgICAgcmV2ZXJzZWRfY2h1bmtzWy0xXSA9IHJldmVyc2VkX2NodW5rc1stMV1bc3BhY2VfbGVmdDpdXFxuXFxuICAgICAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbG9uZyB3b3JkIGludGFjdC4gIE9ubHkgYWRkXFxuICAgICAgICAjIGl0IHRvIHRoZSBjdXJyZW50IGxpbmUgaWYgdGhlcmUncyBub3RoaW5nIGFscmVhZHkgdGhlcmUgLS1cXG4gICAgICAgICMgdGhhdCBtaW5pbWl6ZXMgaG93IG11Y2ggd2UgdmlvbGF0ZSB0aGUgd2lkdGggY29uc3RyYWludC5cXG4gICAgICAgIGVsaWYgbm90IGN1cl9saW5lOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3MucG9wKCkpXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIGFuZCB0aGVyZSdzIGFscmVhZHlcXG4gICAgICAgICMgdGV4dCBvbiB0aGUgY3VycmVudCBsaW5lLCBkbyBub3RoaW5nLiAgTmV4dCB0aW1lIHRocm91Z2ggdGhlXFxuICAgICAgICAjIG1haW4gbG9vcCBvZiBfd3JhcF9jaHVua3MoKSwgd2UnbGwgd2luZCB1cCBoZXJlIGFnYWluLCBidXRcXG4gICAgICAgICMgY3VyX2xlbiB3aWxsIGJlIHplcm8sIHNvIHRoZSBuZXh0IGxpbmUgd2lsbCBiZSBlbnRpcmVseVxcbiAgICAgICAgIyBkZXZvdGVkIHRvIHRoZSBsb25nIHdvcmQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgcmlnaHQgbm93LlxcblxcbiAgICBkZWYgX3dyYXBfY2h1bmtzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfd3JhcF9jaHVua3MoY2h1bmtzIDogW3N0cmluZ10pIC0+IFtzdHJpbmddXFxuICAgICAgICBXcmFwIGEgc2VxdWVuY2Ugb2YgdGV4dCBjaHVua3MgYW5kIHJldHVybiBhIGxpc3Qgb2YgbGluZXMgb2ZcXG4gICAgICAgIGxlbmd0aCAnc2VsZi53aWR0aCcgb3IgbGVzcy4gIChJZiAnYnJlYWtfbG9uZ193b3JkcycgaXMgZmFsc2UsXFxuICAgICAgICBzb21lIGxpbmVzIG1heSBiZSBsb25nZXIgdGhhbiB0aGlzLikgIENodW5rcyBjb3JyZXNwb25kIHJvdWdobHlcXG4gICAgICAgIHRvIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW06IGVhY2ggY2h1bmsgaXNcXG4gICAgICAgIGluZGl2aXNpYmxlIChtb2R1bG8gJ2JyZWFrX2xvbmdfd29yZHMnKSwgYnV0IGEgbGluZSBicmVhayBjYW5cXG4gICAgICAgIGNvbWUgYmV0d2VlbiBhbnkgdHdvIGNodW5rcy4gIENodW5rcyBzaG91bGQgbm90IGhhdmUgaW50ZXJuYWxcXG4gICAgICAgIHdoaXRlc3BhY2U7IGllLiBhIGNodW5rIGlzIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhIFxcXCJ3b3JkXFxcIi5cXG4gICAgICAgIFdoaXRlc3BhY2UgY2h1bmtzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZlxcbiAgICAgICAgbGluZXMsIGJ1dCBhcGFydCBmcm9tIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGlmIHNlbGYud2lkdGggPD0gMDpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJpbnZhbGlkIHdpZHRoICVyIChtdXN0IGJlID4gMClcXFwiICUgc2VsZi53aWR0aClcXG4gICAgICAgIGlmIHNlbGYubWF4X2xpbmVzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIHNlbGYubWF4X2xpbmVzID4gMTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgICAgICBpZiBsZW4oaW5kZW50KSArIGxlbihzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKSA+IHNlbGYud2lkdGg6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInBsYWNlaG9sZGVyIHRvbyBsYXJnZSBmb3IgbWF4IHdpZHRoXFxcIilcXG5cXG4gICAgICAgICMgQXJyYW5nZSBpbiByZXZlcnNlIG9yZGVyIHNvIGl0ZW1zIGNhbiBiZSBlZmZpY2llbnRseSBwb3BwZWRcXG4gICAgICAgICMgZnJvbSBhIHN0YWNrIG9mIGNodWNrcy5cXG4gICAgICAgIGNodW5rcy5yZXZlcnNlKClcXG5cXG4gICAgICAgIHdoaWxlIGNodW5rczpcXG5cXG4gICAgICAgICAgICAjIFN0YXJ0IHRoZSBsaXN0IG9mIGNodW5rcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICMgY3VyX2xlbiBpcyBqdXN0IHRoZSBsZW5ndGggb2YgYWxsIHRoZSBjaHVua3MgaW4gY3VyX2xpbmUuXFxuICAgICAgICAgICAgY3VyX2xpbmUgPSBbXVxcbiAgICAgICAgICAgIGN1cl9sZW4gPSAwXFxuXFxuICAgICAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN0YXRpYyBzdHJpbmcgd2lsbCBwcmVmaXggdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcblxcbiAgICAgICAgICAgICMgTWF4aW11bSB3aWR0aCBmb3IgdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIHdpZHRoID0gc2VsZi53aWR0aCAtIGxlbihpbmRlbnQpXFxuXFxuICAgICAgICAgICAgIyBGaXJzdCBjaHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdCwgdW5sZXNzIHRoaXNcXG4gICAgICAgICAgICAjIGlzIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgdGV4dCAoaWUuIG5vIGxpbmVzIHN0YXJ0ZWQgeWV0KS5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY2h1bmtzWy0xXS5zdHJpcCgpID09ICcnIGFuZCBsaW5lczpcXG4gICAgICAgICAgICAgICAgZGVsIGNodW5rc1stMV1cXG5cXG4gICAgICAgICAgICB3aGlsZSBjaHVua3M6XFxuICAgICAgICAgICAgICAgIGwgPSBsZW4oY2h1bmtzWy0xXSlcXG5cXG4gICAgICAgICAgICAgICAgIyBDYW4gYXQgbGVhc3Qgc3F1ZWV6ZSB0aGlzIGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZS5cXG4gICAgICAgICAgICAgICAgaWYgY3VyX2xlbiArIGwgPD0gd2lkdGg6XFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoY2h1bmtzLnBvcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArPSBsXFxuXFxuICAgICAgICAgICAgICAgICMgTm9wZSwgdGhpcyBsaW5lIGlzIGZ1bGwuXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBpcyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0b1xcbiAgICAgICAgICAgICMgZml0IG9uICphbnkqIGxpbmUgKG5vdCBqdXN0IHRoaXMgb25lKS5cXG4gICAgICAgICAgICBpZiBjaHVua3MgYW5kIGxlbihjaHVua3NbLTFdKSA+IHdpZHRoOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKVxcbiAgICAgICAgICAgICAgICBjdXJfbGVuID0gc3VtKG1hcChsZW4sIGN1cl9saW5lKSlcXG5cXG4gICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNodW5rIG9uIHRoaXMgbGluZSBpcyBhbGwgd2hpdGVzcGFjZSwgZHJvcCBpdC5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXS5zdHJpcCgpID09ICcnOlxcbiAgICAgICAgICAgICAgICBjdXJfbGVuIC09IGxlbihjdXJfbGluZVstMV0pXFxuICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG5cXG4gICAgICAgICAgICBpZiBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubWF4X2xpbmVzIGlzIE5vbmUgb3JcXG4gICAgICAgICAgICAgICAgICAgIGxlbihsaW5lcykgKyAxIDwgc2VsZi5tYXhfbGluZXMgb3JcXG4gICAgICAgICAgICAgICAgICAgIChub3QgY2h1bmtzIG9yXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgbGVuKGNodW5rcykgPT0gMSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBub3QgY2h1bmtzWzBdLnN0cmlwKCkpIGFuZCBjdXJfbGVuIDw9IHdpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICMgQ29udmVydCBjdXJyZW50IGxpbmUgYmFjayB0byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW5cXG4gICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBhbGwgbGluZXMgKHJldHVybiB2YWx1ZSkuXFxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX2xpbmVbLTFdLnN0cmlwKCkgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoc2VsZi5wbGFjZWhvbGRlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWwgY3VyX2xpbmVbLTFdXFxuICAgICAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2xpbmUgPSBsaW5lc1stMV0ucnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihwcmV2X2xpbmUpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIpIDw9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1stMV0gPSBwcmV2X2xpbmUgKyBzZWxmLnBsYWNlaG9sZGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyBzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgX3NwbGl0X2NodW5rcyhzZWxmLCB0ZXh0KTpcXG4gICAgICAgIHRleHQgPSBzZWxmLl9tdW5nZV93aGl0ZXNwYWNlKHRleHQpXFxuICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXQodGV4dClcXG5cXG4gICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4gICAgZGVmIHdyYXAoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ3cmFwKHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZlxcbiAgICAgICAgbm8gbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkXFxuICAgICAgICBsaW5lcy4gIFRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksXFxuICAgICAgICBhbmQgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZVxcbiAgICAgICAgY29udmVydGVkIHRvIHNwYWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBjaHVua3MgPSBzZWxmLl9zcGxpdF9jaHVua3ModGV4dClcXG4gICAgICAgIGlmIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3M6XFxuICAgICAgICAgICAgc2VsZi5fZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcylcXG5cXG4gICAgZGVmIGZpbGwoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJmaWxsKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBub1xcbiAgICAgICAgbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZ1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgZW50aXJlIHdyYXBwZWQgcGFyYWdyYXBoLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIlxcXFxuXFxcIi5qb2luKHNlbGYud3JhcCh0ZXh0KSlcXG5cXG5cXG4jIC0tIENvbnZlbmllbmNlIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG5kZWYgd3JhcCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJXcmFwIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mIG5vXFxuICAgIG1vcmUgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuICBCeVxcbiAgICBkZWZhdWx0LCB0YWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLCBhbmRcXG4gICAgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZSBjb252ZXJ0ZWQgdG9cXG4gICAgc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplXFxuICAgIHdyYXBwaW5nIGJlaGF2aW91ci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LndyYXAodGV4dClcXG5cXG5kZWYgZmlsbCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJGaWxsIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBuZXcgc3RyaW5nLlxcbiAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vIG1vcmVcXG4gICAgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZVxcbiAgICB3cmFwcGVkIHBhcmFncmFwaC4gIEFzIHdpdGggd3JhcCgpLCB0YWJzIGFyZSBleHBhbmRlZCBhbmQgb3RoZXJcXG4gICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3JcXG4gICAgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemUgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCh0ZXh0KVxcblxcbmRlZiBzaG9ydGVuKHRleHQsIHdpZHRoLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkNvbGxhcHNlIGFuZCB0cnVuY2F0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBmaXQgaW4gdGhlIGdpdmVuIHdpZHRoLlxcbiAgICBUaGUgdGV4dCBmaXJzdCBoYXMgaXRzIHdoaXRlc3BhY2UgY29sbGFwc2VkLiAgSWYgaXQgdGhlbiBmaXRzIGluXFxuICAgIHRoZSAqd2lkdGgqLCBpdCBpcyByZXR1cm5lZCBhcyBpcy4gIE90aGVyd2lzZSwgYXMgbWFueSB3b3Jkc1xcbiAgICBhcyBwb3NzaWJsZSBhcmUgam9pbmVkIGFuZCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyBhcHBlbmRlZDo6XFxuICAgICAgICA+Pj4gdGV4dHdyYXAuc2hvcnRlbihcXFwiSGVsbG8gIHdvcmxkIVxcXCIsIHdpZHRoPTEyKVxcbiAgICAgICAgJ0hlbGxvIHdvcmxkISdcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTEpXFxuICAgICAgICAnSGVsbG8gWy4uLl0nXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsIG1heF9saW5lcz0xLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCgnICcuam9pbih0ZXh0LnN0cmlwKCkuc3BsaXQoKSkpXFxuXFxuXFxuIyAtLSBMb29zZWx5IHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuIyBfd2hpdGVzcGFjZV9vbmx5X3JlID0gcmUuY29tcGlsZSgnXlsgXFxcXHRdKyQnLCByZS5NVUxUSUxJTkUpXFxuIyBfbGVhZGluZ193aGl0ZXNwYWNlX3JlID0gcmUuY29tcGlsZSgnKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJywgcmUuTVVMVElMSU5FKVxcblxcbmRlZiBkZWRlbnQodGV4dCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbnkgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLlxcbiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdHJpcGxlLXF1b3RlZCBzdHJpbmdzIGxpbmUgdXAgd2l0aCB0aGUgbGVmdFxcbiAgICBlZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlXFxuICAgIGluIGluZGVudGVkIGZvcm0uXFxuICAgIE5vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleVxcbiAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgXFxcIiAgaGVsbG9cXFwiIGFuZCBcXFwiXFxcXFxcXFx0aGVsbG9cXFwiIGFyZVxcbiAgICBjb25zaWRlcmVkIHRvIGhhdmUgbm8gY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS5cXG4gICAgRW50aXJlbHkgYmxhbmsgbGluZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYSBuZXdsaW5lIGNoYXJhY3Rlci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0b1xcbiAgICAjIGFsbCBsaW5lcy5cXG4gICAgbWFyZ2luID0gTm9uZVxcblxcbiAgICBpbmRlbnRzID0gcmUuZmluZGFsbChyJyheWyBcXFxcdF0qKSg/OlteIFxcXFx0XFxcXG5dKScsdGV4dCwgcmUuTVVMVElMSU5FKVxcbiAgICBmb3IgaW5kZW50IGluIGluZGVudHM6XFxuICAgICAgICBpZiBtYXJnaW4gaXMgTm9uZTpcXG4gICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnRcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIG1vcmUgZGVlcGx5IGluZGVudGVkIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLlxcbiAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOlxcbiAgICAgICAgICAgIHBhc3NcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBpdCdzIHRoZSBuZXcgd2lubmVyLlxcbiAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBGaW5kIHRoZSBsYXJnZXN0IGNvbW1vbiB3aGl0ZXNwYWNlIGJldHdlZW4gY3VycmVudCBsaW5lIGFuZCBwcmV2aW91c1xcbiAgICAgICAgIyB3aW5uZXIuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZvciBpLCAoeCwgeSkgaW4gZW51bWVyYXRlKHppcChtYXJnaW4sIGluZGVudCkpOlxcbiAgICAgICAgICAgICAgICBpZiB4ICE9IHk6XFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW5bOmldXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAjIHNhbml0eSBjaGVjayAodGVzdGluZy9kZWJ1Z2dpbmcgb25seSlcXG4gICAgaWYgMCBhbmQgbWFyZ2luOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKTpcXG4gICAgICAgICAgICBhc3NlcnQgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKG1hcmdpbiksIFxcXFxcXG4gICAgICAgICAgICAgICAgICAgXFxcImxpbmUgPSAlciwgbWFyZ2luID0gJXJcXFwiICUgKGxpbmUsIG1hcmdpbilcXG5cXG4gICAgaWYgbWFyZ2luOlxcbiAgICAgICAgbGluZXMgPSBbbGluZVtsZW4obWFyZ2luKTpdIFxcbiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBsaW5lLnN0cmlwKCkgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoXFxcIlxcXFxuXFxcIildXFxuICAgICAgICB0ZXh0ID0gXFxcIlxcXFxuXFxcIi5qb2luKGxpbmVzKVxcbiAgICByZXR1cm4gdGV4dFxcblxcblxcbmRlZiBpbmRlbnQodGV4dCwgcHJlZml4LCBwcmVkaWNhdGU9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFkZHMgJ3ByZWZpeCcgdG8gdGhlIGJlZ2lubmluZyBvZiBzZWxlY3RlZCBsaW5lcyBpbiAndGV4dCcuXFxuICAgIElmICdwcmVkaWNhdGUnIGlzIHByb3ZpZGVkLCAncHJlZml4JyB3aWxsIG9ubHkgYmUgYWRkZWQgdG8gdGhlIGxpbmVzXFxuICAgIHdoZXJlICdwcmVkaWNhdGUobGluZSknIGlzIFRydWUuIElmICdwcmVkaWNhdGUnIGlzIG5vdCBwcm92aWRlZCxcXG4gICAgaXQgd2lsbCBkZWZhdWx0IHRvIGFkZGluZyAncHJlZml4JyB0byBhbGwgbm9uLWVtcHR5IGxpbmVzIHRoYXQgZG8gbm90XFxuICAgIGNvbnNpc3Qgc29sZWx5IG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGlmIHByZWRpY2F0ZSBpcyBOb25lOlxcbiAgICAgICAgZGVmIHByZWRpY2F0ZShsaW5lKTpcXG4gICAgICAgICAgICByZXR1cm4gbGluZS5zdHJpcCgpXFxuXFxuICAgIGRlZiBwcmVmaXhlZF9saW5lcygpOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKFRydWUpOlxcbiAgICAgICAgICAgIHlpZWxkIChwcmVmaXggKyBsaW5lIGlmIHByZWRpY2F0ZShsaW5lKSBlbHNlIGxpbmUpXFxuICAgIHJldHVybiAnJy5qb2luKHByZWZpeGVkX2xpbmVzKCkpXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgI3ByaW50IGRlZGVudChcXFwiXFxcXHRmb29cXFxcblxcXFx0YmFyXFxcIilcXG4gICAgI3ByaW50IGRlZGVudChcXFwiICBcXFxcdGhlbGxvIHRoZXJlXFxcXG4gIFxcXFx0ICBob3cgYXJlIHlvdT9cXFwiKVxcbiAgICBwcmludChkZWRlbnQoXFxcIkhlbGxvIHRoZXJlLlxcXFxuICBUaGlzIGlzIGluZGVudGVkLlxcXCIpKVwiLFwic3JjL2xpYi90aGlzLnB5XCI6XCJcXG5wcmludChcXFwiXFxcIlxcXCJcXG5UaGUgWmVuIG9mIFB5dGhvbiwgYnkgVGltIFBldGVyc1xcblxcbkJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LlxcbkV4cGxpY2l0IGlzIGJldHRlciB0aGFuIGltcGxpY2l0LlxcblNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxcbkNvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXFxuRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuXFxuU3BhcnNlIGlzIGJldHRlciB0aGFuIGRlbnNlLlxcblJlYWRhYmlsaXR5IGNvdW50cy5cXG5TcGVjaWFsIGNhc2VzIGFyZW4ndCBzcGVjaWFsIGVub3VnaCB0byBicmVhayB0aGUgcnVsZXMuXFxuQWx0aG91Z2ggcHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS5cXG5FcnJvcnMgc2hvdWxkIG5ldmVyIHBhc3Mgc2lsZW50bHkuXFxuVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuXFxuSW4gdGhlIGZhY2Ugb2YgYW1iaWd1aXR5LCByZWZ1c2UgdGhlIHRlbXB0YXRpb24gdG8gZ3Vlc3MuXFxuVGhlcmUgc2hvdWxkIGJlIG9uZS0tIGFuZCBwcmVmZXJhYmx5IG9ubHkgb25lIC0tb2J2aW91cyB3YXkgdG8gZG8gaXQuXFxuQWx0aG91Z2ggdGhhdCB3YXkgbWF5IG5vdCBiZSBvYnZpb3VzIGF0IGZpcnN0IHVubGVzcyB5b3UncmUgRHV0Y2guXFxuTm93IGlzIGJldHRlciB0aGFuIG5ldmVyLlxcbkFsdGhvdWdoIG5ldmVyIGlzIG9mdGVuIGJldHRlciB0aGFuICpyaWdodCogbm93LlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBoYXJkIHRvIGV4cGxhaW4sIGl0J3MgYSBiYWQgaWRlYS5cXG5JZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZWFzeSB0byBleHBsYWluLCBpdCBtYXkgYmUgYSBnb29kIGlkZWEuXFxuTmFtZXNwYWNlcyBhcmUgb25lIGhvbmtpbmcgZ3JlYXQgaWRlYSAtLSBsZXQncyBkbyBtb3JlIG9mIHRob3NlIVxcblxcXCJcXFwiXFxcIlxcbilcXG5cIixcInNyYy9saWIvdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90aW1lLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjaGVja19zdHJ1Y3RfdGltZShhKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIlJlcXVpcmVkIGFyZ3VtZW50ICdzdHJ1Y3RfdGltZScgbXVzdCBiZSBvZiB0eXBlOiAnc3RydWN0X3RpbWUnXFxcIik7dmFyIGMsZD1hLnYubGVuZ3RoLGU9YS52O2ZvcihjPTA7YzxkOysrYylpZighU2suYnVpbHRpbi5jaGVja0ludChlW2NdKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cnVjdF90aW1lIG1heSBvbmx5IGNvbnRhaW4gaW50ZWdlcnNcXFwiKTtyZXR1cm4hMH1mdW5jdGlvbiBwYWRMZWZ0KGEsYixkKXt2YXIgYz1hLnRvU3RyaW5nKCk7cmV0dXJuIEFycmF5KGItYy5sZW5ndGgrMSkuam9pbihkfHxcXFwiIFxcXCIpK2N9ZnVuY3Rpb24gaXNMZWFwWWVhcihhKXtyZXR1cm4gMD09KDMmYSkmJigwIT1hJTEwMHx8MD09YSU0MDApfWZ1bmN0aW9uIGdldERheU9mWWVhcihhLGIpe2I9Ynx8ITE7dmFyIGM9Yj9hLmdldFVUQ01vbnRoKCk6YS5nZXRNb250aCgpLGQ9Yj9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSxlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdW2NdK2Q7cmV0dXJuIDE8YyYmaXNMZWFwWWVhcihiP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpJiZlKyssZX1mdW5jdGlvbiBzdGRUaW1lem9uZU9mZnNldCgpe3ZhciBhPU1hdGgubWF4LGI9bmV3IERhdGUoMjAwMiwwLDEpLGM9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBhKGIuZ2V0VGltZXpvbmVPZmZzZXQoKSxjLmdldFRpbWV6b25lT2Zmc2V0KCkpfWZ1bmN0aW9uIGRzdChhKXtyZXR1cm4gYS5nZXRUaW1lem9uZU9mZnNldCgpPHN0ZFRpbWV6b25lT2Zmc2V0KCl9ZnVuY3Rpb24gdGltZVpvbmVOYW1lKGEpe3ZhciBiLGM9L1xcXFwoKC4qKVxcXFwpLy5leGVjKGEudG9TdHJpbmcoKSk7aWYobnVsbCE9dGhpcy5uYXZpZ2F0b3ImJihiPXRoaXMubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8dGhpcy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLGMmJjE8Yy5sZW5ndGgpcmV0dXJuIGNbMV07aWYodm9pZCAwPT09YilyZXR1cm4gbnVsbDt0cnl7dmFyIGQ9YS50b0xvY2FsZVN0cmluZyhiLHt0aW1lWm9uZU5hbWU6XFxcInNob3J0XFxcIn0pO3JldHVybiBjPWQuc3BsaXQoXFxcIiBcXFwiKSxjW2MubGVuZ3RoLTFdfWNhdGNoKGEpe3JldHVybiBudWxsfX1mdW5jdGlvbiBkYXRlX3RvX3N0cnVjdF90aW1lKGEsYyl7cmV0dXJuIGM9Y3x8ITEsbmV3IGIoW1NrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0Z1bGxZZWFyKCk6YS5nZXRGdWxsWWVhcigpKSxTay5idWlsdGluLmFzc2skKChjP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCkpKzEpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDSG91cnMoKTphLmdldEhvdXJzKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ01pbnV0ZXMoKTphLmdldE1pbnV0ZXMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDU2Vjb25kcygpOmEuZ2V0U2Vjb25kcygpKSxTay5idWlsdGluLmFzc2skKCgoYz9hLmdldFVUQ0RheSgpOmEuZ2V0RGF5KCkpKzYpJTcpLFNrLmJ1aWx0aW4uYXNzayQoZ2V0RGF5T2ZZZWFyKGEsYykpLFNrLmJ1aWx0aW4uYXNzayQoYz8wOmRzdChhKT8xOjApXSl9ZnVuY3Rpb24gZnJvbV9zZWNvbmRzKGEsYil7dmFyIGM9bmV3IERhdGU7aWYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2Vjc1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7dmFyIGQ9U2suYnVpbHRpbi5hc251bSQoYSk7Yy5zZXRUaW1lKDFlMypkKX1yZXR1cm4gZGF0ZV90b19zdHJ1Y3RfdGltZShjLGIpfWZ1bmN0aW9uIGFzY3RpbWVfZihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJhc2N0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksIWF8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9ZnJvbV9zZWNvbmRzKCk6IShhIGluc3RhbmNlb2YgYikmJihhPW5ldyBiKGEpKSxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSYmOT09YS52Lmxlbmd0aCl7dmFyIGU9W2RbU2suYnVpbHRpbi5hc251bSQoYS52WzZdKV0sY1tTay5idWlsdGluLmFzbnVtJChhLnZbMV0pLTFdLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzJdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikrXFxcIjpcXFwiK3BhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzRdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNV0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzBdKS50b1N0cmluZygpLDQsXFxcIjBcXFwiKV07cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmpvaW4oXFxcIiBcXFwiKSl9fWZ1bmN0aW9uIG1rdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1rdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgYj1uZXcgRGF0ZShTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMSxTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSksU2suYnVpbHRpbi5hc251bSQoYS52WzRdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNV0pKTtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChiLmdldFRpbWUoKS8xZTMsdm9pZCAwKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1rdGltZSgpIHJlcXVpcmVzIGEgc3RydWN0X3RpbWUgb3IgOS10dXBsZVxcXCIpfXZhciBhPXtfX3BhY2thZ2VfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSxiPVNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEoXFxcInRpbWVcXFwiLFxcXCJzdHJ1Y3RfdGltZVxcXCIse3RtX3llYXI6XFxcInllYXIsIGZvciBleGFtcGxlLCAxOTkzXFxcIix0bV9tb246XFxcIm1vbnRoIG9mIHllYXIsIHJhbmdlIFsxLCAxMl1cXFwiLHRtX21kYXk6XFxcImRheSBvZiBtb250aCwgcmFuZ2UgWzEsIDMxXVxcXCIsdG1faG91cjpcXFwiaG91cnMsIHJhbmdlIFswLCAyM11cXFwiLHRtX21pbjpcXFwibWludXRlcywgcmFuZ2UgWzAsIDU5XVxcXCIsdG1fc2VjOlxcXCJzZWNvbmRzLCByYW5nZSBbMCwgNjFdXFxcIix0bV93ZGF5OlxcXCJkYXkgb2Ygd2VlaywgcmFuZ2UgWzAsIDZdLCBNb25kYXkgaXMgMFxcXCIsdG1feWRheTpcXFwiZGF5IG9mIHllYXIsIHJhbmdlIFsxLCAzNjZdXFxcIix0bV9pc2RzdDpcXFwiMSBpZiBzdW1tZXIgdGltZSBpcyBpbiBlZmZlY3QsIDAgaWYgbm90LCBhbmQgLTEgaWYgdW5rbm93blxcXCJ9KTthLnN0cnVjdF90aW1lPWIsYS50aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9RGF0ZS5ub3coKTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3cmJihhKz1wZXJmb3JtYW5jZS5ub3coKSUxKSxTay5idWlsdGluLmFzc2skKGEvMWUzLHZvaWQgMCl9KSxhLnNsZWVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNsZWVwXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVsYXlcXFwiLFxcXCJmbG9hdFxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24obmV3IFByb21pc2UoZnVuY3Rpb24oYil7U2suc2V0VGltZW91dChmdW5jdGlvbigpe2IoU2suYnVpbHRpbi5ub25lLm5vbmUkKX0sMWUzKlNrLmZmaS5yZW1hcFRvSnMoYSkpfSkpfSksYS5sb2NhbHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9jYWx0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITEpfSksYS5nbXRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ210aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITApfSk7dmFyIGM9W1xcXCJKYW5cXFwiLFxcXCJGZWJcXFwiLFxcXCJNYXJcXFwiLFxcXCJBcHJcXFwiLFxcXCJNYXlcXFwiLFxcXCJKdW5cXFwiLFxcXCJKdWxcXFwiLFxcXCJBdWdcXFwiLFxcXCJTZXBcXFwiLFxcXCJPY3RcXFwiLFxcXCJOb3ZcXFwiLFxcXCJEZWNcXFwiXSxkPVtcXFwiTW9uXFxcIixcXFwiVHVlXFxcIixcXFwiV2VkXFxcIixcXFwiVGh1XFxcIixcXFwiRnJpXFxcIixcXFwiU2F0XFxcIixcXFwiU3VuXFxcIl07cmV0dXJuIGEuYXNjdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGFzY3RpbWVfZiksYS5jdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGFzY3RpbWVfZihmcm9tX3NlY29uZHMoYSkpfSksYS5ta3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhta3RpbWVfZiksYS50aW1lem9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKnN0ZFRpbWV6b25lT2Zmc2V0KCkpLGEuYWx0em9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKmZ1bmN0aW9uIGFsdFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5taW4sYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9KCkpLGEuZGF5bGlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyhkc3QobmV3IERhdGUpPzE6MCksYS50em5hbWU9bmV3IFNrLmJ1aWx0aW4udHVwbGUoZnVuY3Rpb24gdGltZVpvbmVOYW1lcygpe3ZhciBhPW5ldyBEYXRlKDIwMDIsMCwxKSxiPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gZHN0KGEpP1tuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGIpKSxuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGEpKV06W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpXX0oKSksYS5hY2NlcHQyZHllYXI9U2suYnVpbHRpbi5hc3NrJCgxKSxhLmNsb2NrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBhPXRoaXMucGVyZm9ybWFuY2UmJnRoaXMucGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpLzFlMzpuZXcgRGF0ZSgpLmdldFRpbWUoKS8xZTMsbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSksYS5zdHJmdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cmZ0aW1lX2YoYSxjKXt2YXIgZDtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJmdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcXFwiKTtyZXR1cm4gYz8hKGMgaW5zdGFuY2VvZiBiKSYmKGM9bmV3IGIoYykpOmM9ZnJvbV9zZWNvbmRzKCksY2hlY2tfc3RydWN0X3RpbWUoYyksZD1Tay5mZmkucmVtYXBUb0pzKGEpLFNrLmZmaS5yZW1hcFRvUHkoc3RyZnRpbWUoZCxuZXcgRGF0ZSgxZTMqbWt0aW1lX2YoYykudikpKX0pLGEudHpzZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiB0enNldF9mKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZS50enNldCgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcXFwiKX0pLGEuc3RycHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBzdHJwdGltZV9mKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3RycHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzdHJpbmdcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpLHZvaWQgMD09PWI/Yj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiVhICViICVkICVIOiVNOiVTICVZXFxcIik6U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZm9ybWF0XFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKTtsZXQgYz1kYXRlX3RvX3N0cnVjdF90aW1lKHN0cnB0aW1lKFNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9KcyhiKSwhMCkpO3JldHVybiBjLnZbOF09bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksY30pLGF9O1wiLFwic3JjL2xpYi90aW1laXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRpbWVpdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RvYWlmZi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidG9haWZmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9rZW4uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdG9rZW4ucHlcXFwifTtjb25zdCBiPVtdO2Zvcih0b2tlbiBpbiBTay50b2tlbi50b2tfbmFtZSl7Y29uc3QgYz1Tay50b2tlbi50b2tfbmFtZVt0b2tlbl0uc2xpY2UoMiksZD1wYXJzZUludCh0b2tlbiwxMCk7Yi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoZCkpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxhW2NdPVNrLmZmaS5yZW1hcFRvUHkoZCl9cmV0dXJuIGEudG9rX25hbWU9bmV3IFNrLmJ1aWx0aW4uZGljdChiKSxhLklTVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNURVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTTk9OVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNOT05URVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTTk9OVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTRU9GPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTRU9GXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNFT0YoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhfTtcIixcInNyYy9saWIvdG9rZW5pemUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt0b2tlbml6ZTpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRva2VuaXplXFxcIiwxLDEpLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbihhKTtjb25zdCBiPVtdO3JldHVybiBTay5fdG9rZW5pemUoXFxcIjxzdGRpbj5cXFwiLGZ1bmN0aW9uIGpzUmVhZGxpbmUoKXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhKTtyZXR1cm4gU2suZmZpLnJlbWFwVG9KcyhiKX0sXFxcIlVURi04XFxcIixmdW5jdGlvbiByZWNlaXZlVG9rZW4oYSl7Yi5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEudHlwZSksU2suZmZpLnJlbWFwVG9QeShhLnN0cmluZyksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5zdGFydFswXSksU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzFdKV0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEuZW5kWzBdKSxTay5mZmkucmVtYXBUb1B5KGEuZW5kWzFdKV0pLFNrLmZmaS5yZW1hcFRvUHkoYS5saW5lKV0pKX0pLG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi90cmFjZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90cmFjZWJhY2sucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRyYWNlYmFjayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3R0eS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHR5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHVydGxlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGU9ZnVuY3Rpb24gZ2V0Q29uZmlndXJlZFRhcmdldCgpe3ZhciBlLHQ7Zm9yKGU9U2suVHVydGxlR3JhcGhpY3MmJlNrLlR1cnRsZUdyYXBoaWNzLnRhcmdldHx8XFxcInR1cnRsZVxcXCIsdD1cXFwic3RyaW5nXFxcIj09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZTt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtyZXR1cm4gdH0oKTtyZXR1cm4gZS50dXJ0bGVJbnN0YW5jZT9lLnR1cnRsZUluc3RhbmNlLnJlc2V0KCk6ZS50dXJ0bGVJbnN0YW5jZT1mdW5jdGlvbiBnZW5lcmF0ZVR1cnRsZU1vZHVsZShlKXt2YXIgdD1NYXRoLnJvdW5kLHI9TWF0aC5tYXgsbj1NYXRoLnNxcnQsYT1NYXRoLm1pbixzPU1hdGguYWJzLG89TWF0aC5QSSxkPU1hdGguYXRhbjIsXz1NYXRoLnNpbixjPU1hdGguY29zO2Z1bmN0aW9uIGdldEFzc2V0KGUpe3ZhciB0PWcuYXNzZXRzLHI9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQ/dChlKTp0W2VdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2Ygcj9uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3ZhciBhPW5ldyBJbWFnZTthLm9ubG9hZD1mdW5jdGlvbigpe2cuYXNzZXRzW2VdPXRoaXMsdChhKX0sYS5vbmVycm9yPWZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoXFxcIk1pc3NpbmcgYXNzZXQ6IFxcXCIrcikpfSxhLnNyYz1yfSk6bmV3IEluc3RhbnRQcm9taXNlKHZvaWQgMCxyKX1mdW5jdGlvbiBJbnN0YW50UHJvbWlzZShlLHQpe3RoaXMubGFzdFJlc3VsdD10LHRoaXMubGFzdEVycm9yPWV9ZnVuY3Rpb24gRnJhbWVNYW5hZ2VyKCl7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIGdldEZyYW1lTWFuYWdlcigpe3JldHVybiBBfHwoQT1uZXcgRnJhbWVNYW5hZ2VyKSxBfWZ1bmN0aW9uIE1vdXNlSGFuZGxlcigpe3ZhciB0PXRoaXM7Zm9yKHZhciByIGluIHRoaXMuX3RhcmdldD1nZXRUYXJnZXQoKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9oYW5kbGVycz17bW91c2Vkb3duOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2Vkb3duXFxcIixyKX0sbW91c2V1cDpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNldXBcXFwiLHIpfSxtb3VzZW1vdmU6ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZW1vdmVcXFwiLHIpfX0sdGhpcy5faGFuZGxlcnMpdGhpcy5fdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocix0aGlzLl9oYW5kbGVyc1tyXSl9ZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKGUsdCl7dGhpcy5fdHlwZT1lLHRoaXMuX3RhcmdldD10LHRoaXMuX2hhbmRsZXJzPXZvaWQgMCxnZXRNb3VzZUhhbmRsZXIoKS5hZGRNYW5hZ2VyKGUsdGhpcyl9ZnVuY3Rpb24gVHVydGxlKGUpe2lmKGdldEZyYW1lTWFuYWdlcigpLmFkZFR1cnRsZSh0aGlzKSx0aGlzLl9zY3JlZW49Z2V0U2NyZWVuKCksdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fc2hhcGU9ZS52LCF2Lmhhc093blByb3BlcnR5KHRoaXMuX3NoYXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTaGFwZTonXFxcIit0aGlzLl9zaGFwZStcXFwiJyBub3QgaW4gZGVmYXVsdCBzaGFwZSwgcGxlYXNlIGNoZWNrIHNoYXBlIGFnYWluIVxcXCIpO3RoaXMucmVzZXQoKX1mdW5jdGlvbiBTY3JlZW4oKXt2YXIgZSx0O3RoaXMuX2ZyYW1lcz0xLHRoaXMuX2RlbGF5PXZvaWQgMCx0aGlzLl9iZ2NvbG9yPVxcXCJub25lXFxcIix0aGlzLl9tb2RlPVxcXCJzdGFuZGFyZFxcXCIsdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fa2V5TG9nZ2VyPXt9LGU9KGcud29ybGRXaWR0aHx8Zy53aWR0aHx8Z2V0V2lkdGgoKSkvMix0PShnLndvcmxkSGVpZ2h0fHxnLmhlaWdodHx8Z2V0SGVpZ2h0KCkpLzIsdGhpcy5zZXRVcFdvcmxkKC1lLC10LGUsdCl9ZnVuY3Rpb24gZW5zdXJlQW5vbnltb3VzKCl7cmV0dXJuIGZ8fChmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlR1cnRsZSkpLGYuaW5zdGFuY2V9ZnVuY3Rpb24gZ2V0VGFyZ2V0KCl7cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0U2NyZWVuKCl7cmV0dXJuIHB8fChwPW5ldyBTY3JlZW4pLHB9ZnVuY3Rpb24gZ2V0TW91c2VIYW5kbGVyKCl7cmV0dXJuIGh8fChoPW5ldyBNb3VzZUhhbmRsZXIpLGh9ZnVuY3Rpb24gZ2V0V2lkdGgoKXtyZXR1cm4gMHwocCYmcC5fd2lkdGh8fGcud2lkdGh8fGdldFRhcmdldCgpLmNsaWVudFdpZHRofHxULndpZHRoKX1mdW5jdGlvbiBnZXRIZWlnaHQoKXtyZXR1cm4gMHwocCYmcC5faGVpZ2h0fHxnLmhlaWdodHx8Z2V0VGFyZ2V0KCkuY2xpZW50SGVpZ2h0fHxULmhlaWdodCl9ZnVuY3Rpb24gY3JlYXRlTGF5ZXIoZSx0KXt2YXIgcixuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGE9Z2V0V2lkdGgoKSxzPWdldEhlaWdodCgpLGw9Z2V0VGFyZ2V0KCkuZmlyc3RDaGlsZD8tcytcXFwicHhcXFwiOlxcXCIwXFxcIjtyZXR1cm4gbi53aWR0aD1hLG4uaGVpZ2h0PXMsbi5zdHlsZS5wb3NpdGlvbj1cXFwicmVsYXRpdmVcXFwiLG4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwiLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcIm1hcmdpbi10b3BcXFwiLGwpLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcInotaW5kZXhcXFwiLGUpLHQmJihuLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiKSxnZXRUYXJnZXQoKS5hcHBlbmRDaGlsZChuKSxyPW4uZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxyLmxpbmVDYXA9XFxcInJvdW5kXFxcIixyLmxpbmVKb2luPVxcXCJyb3VuZFxcXCIsYXBwbHlXb3JsZChnZXRTY3JlZW4oKSxyKSxyfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCl7dSYmKCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSkodSksdT12b2lkIDApLG0mJih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLG09dm9pZCAwKX1mdW5jdGlvbiBhcHBseVdvcmxkKGUsdCl7dmFyIHI9ZS5sbHgsbj1lLmxseSxhPWUudXJ4LHM9ZS51cnksbD1lLnhTY2FsZSxpPWUueVNjYWxlO3QmJihjbGVhckxheWVyKHQpLHQucmVzdG9yZSgpLHQuc2F2ZSgpLHQuc2NhbGUoMS9sLDEvaSksdC50cmFuc2xhdGUoLXIsLXMpKX1mdW5jdGlvbiBwdXNoVW5kbyhlKXt2YXIgdCxyLG47aWYoZy5hbGxvd1VuZG8mJmUuX2J1ZmZlclNpemUpe2ZvcihlLl91bmRvQnVmZmVyfHwoZS5fdW5kb0J1ZmZlcj1bXSk7ZS5fdW5kb0J1ZmZlci5sZW5ndGg+ZS5fYnVmZmVyU2l6ZTspZS5fdW5kb0J1ZmZlci5zaGlmdCgpO2ZvcihyPXt9LHQ9W1xcXCJ4XFxcIixcXFwieVxcXCIsXFxcImFuZ2xlXFxcIixcXFwicmFkaWFuc1xcXCIsXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImRvd25cXFwiLFxcXCJmaWxsaW5nXFxcIixcXFwic2hvd25cXFwiLFxcXCJzaGFwZVxcXCIsXFxcInNpemVcXFwiXSxuPTA7bjx0Lmxlbmd0aDtuKyspclt0W25dXT1lW1xcXCJfXFxcIit0W25dXTtyZXR1cm4gZS5fdW5kb0J1ZmZlci5wdXNoKHIpLGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7ci5maWxsQnVmZmVyPXRoaXMuZmlsbEJ1ZmZlcj90aGlzLmZpbGxCdWZmZXIuc2xpY2UoKTp2b2lkIDAsZS5fcGFwZXImJmUuX3BhcGVyLmNhbnZhcyYmKHIuaW1hZ2U9ZS5fcGFwZXIuY2FudmFzLnRvRGF0YVVSTCgpKX0sITEpfX1mdW5jdGlvbiBwb3BVbmRvKGUpe3ZhciB0O2lmKGUuX2J1ZmZlclNpemUmJmUuX3VuZG9CdWZmZXImJih0PWUuX3VuZG9CdWZmZXIucG9wKCksISF0KSl7Zm9yKHZhciByIGluIHQpXFxcImltYWdlXFxcIiE9ciYmXFxcImZpbGxCdWZmZXJcXFwiIT09ciYmKGVbXFxcIl9cXFwiK3JdPXRbcl0pO3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3ZhciBlO3QuaW1hZ2UmJihMLnNyYz10LmltYWdlLGU9TCksY2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSwhMSxMKSxkZWxldGUgdC5pbWFnZX0sITAsdCl9fWZ1bmN0aW9uIHJlbW92ZUxheWVyKGUpe2UmJmUuY2FudmFzJiZlLmNhbnZhcy5wYXJlbnROb2RlJiZlLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuY2FudmFzKX1mdW5jdGlvbiBjbGVhckxheWVyKGUsdCxyKXtlJiYoZS5zYXZlKCksZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQ/KGUuZmlsbFN0eWxlPXQsZS5maWxsUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSk6ZS5jbGVhclJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCksciYmZS5kcmF3SW1hZ2UociwwLDApLGUucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3VHVydGxlKGUsdCl7dmFyIHIsbixhLHM9dltlLnNoYXBlXSxsPWdldFNjcmVlbigpLHU9Z2V0V2lkdGgoKSxtPWdldEhlaWdodCgpLHA9bC54U2NhbGUsZz1sLnlTY2FsZTtpZih0KXtpZihyPWMoZS5yYWRpYW5zKS9wLG49XyhlLnJhZGlhbnMpL2csYT1kKG4sciktby8yLHQuc2F2ZSgpLHQudHJhbnNsYXRlKGUueCxlLnkpLHQuc2NhbGUocCxnKSxzLm5vZGVOYW1lKXt2YXIgZj1zLm5hdHVyYWxXaWR0aCxoPXMubmF0dXJhbEhlaWdodDt0LmRyYXdJbWFnZShzLDAsMCxmLGgsLWYvMiwtaC8yLGYsaCl9ZWxzZXt0LnJvdGF0ZShhKSx0LmJlZ2luUGF0aCgpLHQubGluZVdpZHRoPTEsdC5zdHJva2VTdHlsZT1lLmNvbG9yLHQuZmlsbFN0eWxlPWUuZmlsbCx0Lm1vdmVUbygtc1swXVswXSxzWzBdWzFdKTtmb3IodmFyICQ9MTskPHMubGVuZ3RoOyQrKyl0LmxpbmVUbygtc1skXVswXSxzWyRdWzFdKTt0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9dC5yZXN0b3JlKCl9fWZ1bmN0aW9uIGRyYXdEb3QoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKSxuPWdldFNjcmVlbigpLGw9bi54U2NhbGUsaT1uLnlTY2FsZTtyJiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSxlKj1hKHMobCkscyhpKSksci5hcmModGhpcy54LHRoaXMueSxlLzIsMCxUdXJ0bGUuUkFESUFOUyksci5jbG9zZVBhdGgoKSxyLmZpbGxTdHlsZT10fHx0aGlzLmNvbG9yLHIuZmlsbCgpKX1mdW5jdGlvbiBtZWFzdXJlVGV4dChlLHQpe3JldHVybiB0JiYoUy5mb250PXQpLFMubWVhc3VyZVRleHQoZSkud2lkdGh9ZnVuY3Rpb24gZHJhd1RleHQoZSx0LHIpe3ZhciBuPXRoaXMuY29udGV4dCgpO24mJihuLnNhdmUoKSxyJiYobi5mb250PXIpLHQmJnQubWF0Y2goL14obGVmdHxyaWdodHxjZW50ZXIpJC8pJiYobi50ZXh0QWxpZ249dCksbi5zY2FsZSgxLC0xKSxuLmZpbGxTdHlsZT10aGlzLmZpbGwsbi5maWxsVGV4dChlLHRoaXMueCwtdGhpcy55KSxuLnJlc3RvcmUoKSl9ZnVuY3Rpb24gZHJhd0xpbmUoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKTtyJiYodCYmKHIuYmVnaW5QYXRoKCksci5tb3ZlVG8odGhpcy54LHRoaXMueSkpLHIubGluZVdpZHRoPXRoaXMuc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsci5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHIubGluZVRvKGUueCxlLnkpLHIuc3Ryb2tlKCkpfWZ1bmN0aW9uIGRyYXdGaWxsKCl7dmFyIGUsdD10aGlzLmNvbnRleHQoKSxyPXRoaXMuZmlsbEJ1ZmZlcjtpZih0JiZyJiZyLmxlbmd0aCl7Zm9yKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oclswXS54LHJbMF0ueSksZT0xO2U8ci5sZW5ndGg7ZSsrKXQubGluZVRvKHJbZV0ueCxyW2VdLnkpO2Zvcih0LmNsb3NlUGF0aCgpLHQuZmlsbFN0eWxlPXRoaXMuZmlsbCx0LmZpbGwoKSxlPTE7ZTxyLmxlbmd0aDtlKyspcltlXS5zdHJva2UmJih0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHJbZS0xXS54LHJbZS0xXS55KSx0LmxpbmVXaWR0aD1yW2VdLnNpemUqZ2V0U2NyZWVuKCkubGluZVNjYWxlLHQuc3Ryb2tlU3R5bGU9cltlXS5jb2xvcix0LmxpbmVUbyhyW2VdLngscltlXS55KSx0LnN0cm9rZSgpKTt0LnJlc3RvcmUoKX19ZnVuY3Rpb24gcGFydGlhbFRyYW5zbGF0ZShlLHQscixuLGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbihlKXt0aGlzLmRvd24mJmRyYXdMaW5lLmNhbGwodGhpcyxlLG4pfSxhLHt4OnQseTpyfSxuKX19ZnVuY3Rpb24gdHJhbnNsYXRlKGUsYSxsLG8sZCxfLGMpe3ZhciB1LG09ZS5fY29tcHV0ZWRfc3BlZWQscD1nZXRTY3JlZW4oKSxnPXMocC54U2NhbGUpLGY9cyhwLnlTY2FsZSksaD1hLCQ9bCx3PW4obypvKmcrZCpkKmYpLGI9bT90KHIoMSx3L20pKToxLHY9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2U7Zm9yKGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsaW5nJiZ0aGlzLmZpbGxCdWZmZXIucHVzaCh7eDp0aGlzLngseTp0aGlzLnksc3Ryb2tlOnRoaXMuZG93bixjb2xvcjp0aGlzLmNvbG9yLHNpemU6dGhpcy5zaXplfSl9LCExKSx1PTA7dTxiO3UrKyloPWErby9iKih1KzEpLCQ9bCtkL2IqKHUrMSksdj12LnRoZW4ocGFydGlhbFRyYW5zbGF0ZShlLGgsJCxfLG18fCFjKSksXz0hMTtyZXR1cm4gdi50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuW2ErbyxsK2RdfSl9ZnVuY3Rpb24gcGFydGlhbFJvdGF0ZShlLHQscixuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLG4se2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIHJvdGF0ZShlLG4sYSxsKXt2YXIgbyxkPWUuX2NvbXB1dGVkX3NwZWVkLF89MzYwKihhL2UuX2Z1bGxDaXJjbGUpLGM9ZD90KHIoMSxzKF8pL2QpKToxLHU9e30sbT1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3Iobz0wO288YztvKyspY2FsY3VsYXRlSGVhZGluZyhlLG4rYS9jKihvKzEpLHUpLG09bS50aGVuKHBhcnRpYWxSb3RhdGUoZSx1LmFuZ2xlLHUucmFkaWFucyxkfHwhbCkpO3JldHVybiBtLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY2FsY3VsYXRlSGVhZGluZyhlLG4rYSl9KX1mdW5jdGlvbiBnZXRDb29yZGluYXRlcyhlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1lJiYoZS55fHxlLl95fHxlWzFdKXx8MCxlPWUmJihlLnh8fGUuX3h8fGVbMF0pfHwwKSx7eDplLHk6dH19ZnVuY3Rpb24gaGV4VG9SR0IoZSl7dmFyIHQscixuO3JldHVybih0PS9ecmdiYT9cXFxcKChcXFxcZCspLChcXFxcZCspLChcXFxcZCspKD86LChbLlxcXFxkXSspKT9cXFxcKSQvLmV4ZWMoZSkpPyhuPVtwYXJzZUludCh0WzFdKSxwYXJzZUludCh0WzJdKSxwYXJzZUludCh0WzNdKV0sdFs0XSYmbi5wdXNoKHBhcnNlRmxvYXQodFs0XSkpKTovXiM/W2EtZlxcXFxkXXszfXxbYS1mXFxcXGRdezZ9JC9pLmV4ZWMoZSk/KDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC9eIz8oW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkkL2ksZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHQrdCtyK3IrbitufSkpLHI9L14jPyhbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KSQvaS5leGVjKGUpLG49W3BhcnNlSW50KHJbMV0sMTYpLHBhcnNlSW50KHJbMl0sMTYpLHBhcnNlSW50KHJbM10sMTYpXSk6bj1lLG59ZnVuY3Rpb24gY3JlYXRlQ29sb3IoZSx0LG4scyxsKXt2YXIgbztpZih2b2lkIDAhPT1uJiYodD1bdCxuLHMsbF0pLHQuY29uc3RydWN0b3I9PT1BcnJheSYmdC5sZW5ndGgpe2lmKDI1NT09PWUpe2ZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQodFtvXSkpKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO31lbHNlIGZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIHRbb10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7ZWxzZSBpZigxPj10W29dKXRbb109cigwLGEoMjU1LHBhcnNlSW50KDI1NSp0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7XFxcIm51bWJlclxcXCI9PXR5cGVvZiB0W29dPyh0WzNdPXIoMCxhKDEsdFtvXSkpLHQ9XFxcInJnYmEoXFxcIit0LmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCIpOnQ9XFxcInJnYihcXFwiK3Quc2xpY2UoMCwzKS5qb2luKFxcXCIsXFxcIikrXFxcIilcXFwifWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiB0JiYhdC5tYXRjaCgvXFxcXHMqdXJsXFxcXHMqXFxcXCgvaSkpdD10LnJlcGxhY2UoL1xcXFxzKy9nLFxcXCJcXFwiKTtlbHNlIHJldHVyblxcXCJibGFja1xcXCI7cmV0dXJuIHR9ZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGluZyhlLHQscil7dmFyIG49ZS5fYW5nbGV8fDAsYT1lLl9yYWRpYW5zfHwwO3JldHVybiByfHwocj17fSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYoZS5faXNSYWRpYW5zP249YT10JVR1cnRsZS5SQURJQU5TOmUuX2Z1bGxDaXJjbGU/KG49dCVlLl9mdWxsQ2lyY2xlLGE9bi9lLl9mdWxsQ2lyY2xlKlR1cnRsZS5SQURJQU5TKTpuPWE9MCwwPm4mJihuKz1lLl9mdWxsQ2lyY2xlLGErPVR1cnRsZS5SQURJQU5TKSksci5hbmdsZT1uLHIucmFkaWFucz1hLHJ9ZnVuY3Rpb24gcHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoZSl9KTtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHQmJm4udW5zaGlmdCh0KSxTay5taXNjZXZhbC5hcHBseUFzeW5jKHZvaWQgMCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4pLmNhdGNoKFNrLnVuY2F1Z2h0RXhjZXB0aW9uKX19ZnVuY3Rpb24gYWRkTW9kdWxlTWV0aG9kKGUsdCxyLG4pe3ZhciBhLHM9ci5yZXBsYWNlKC9eXFxcXCQvLFxcXCJcXFwiKSxsPXMucmVwbGFjZSgvX1xcXFwkW2Etel0rXFxcXCQkL2ksXFxcIlxcXCIpLG89ZS5wcm90b3R5cGVbcl0ubGVuZ3RoLGQ9ZS5wcm90b3R5cGVbcl0ubWluQXJncyxfPWUucHJvdG90eXBlW3JdLmNvX3Zhcm5hbWVzfHxbXSxjPWUucHJvdG90eXBlW3JdLnJldHVyblR5cGUsdT1lLnByb3RvdHlwZVtyXS5pc1NrO3ZvaWQgMD09PWQmJihkPW8pLGE9ZnVuY3Rpb24oKXt2YXIgZSx0LGEscyxfLG09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHA9bj9uKCk6bS5zaGlmdCgpLmluc3RhbmNlO2lmKG0ubGVuZ3RoPGR8fG0ubGVuZ3RoPm8pdGhyb3cgXz1kPT09bz9cXFwiZXhhY3RseSBcXFwiK286XFxcImJldHdlZW4gXFxcIitkK1xcXCIgYW5kIFxcXCIrbyxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IobCtcXFwiKCkgdGFrZXMgXFxcIitfK1xcXCIgcG9zaXRpb25hbCBhcmd1bWVudChzKSAoXFxcIittLmxlbmd0aCtcXFwiIGdpdmVuKVxcXCIpO2ZvcihlPW0ubGVuZ3RoOzA8PS0tZTspdm9pZCAwIT09bVtlXSYmKG1bZV09bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5mdW5jP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0pOm1bZV1pbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0uaW1fZnVuYyxtW2VdLmltX3NlbGYpOm1bZV0mJm1bZV0uJGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJm1bZV0uaW5zdGFuY2U/bVtlXS5pbnN0YW5jZTpTay5mZmkucmVtYXBUb0pzKG1bZV0pKTt2YXIgZz1tLnNsaWNlKDApO2ZvcihtPVtdLGU9Zy5sZW5ndGg7MDw9ZTstLWUpbnVsbCE9PWdbZV0mJihtW2VdPWdbZV0pO3RyeXt0PXBbcl0uYXBwbHkocCxtKX1jYXRjaCh0KXt0aHJvdyB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUubG9nKFxcXCJ3cmFwcGVkIG1ldGhvZCBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnN0YW50UHJvbWlzZSYmKHQ9dC5sYXN0UmVzdWx0KSx0IGluc3RhbmNlb2YgUHJvbWlzZT8odD10LmNhdGNoKGZ1bmN0aW9uKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcInByb21pc2UgZmFpbGVkXFxcIiksd2luZG93LmNvbnNvbGUubG9nKHQuc3RhY2spKSx0fSksYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpTay5mZmkucmVtYXBUb1B5KHMpfSxhLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6dC50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBzPWUsZX0pfSxhKTp2b2lkIDA9PT10P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDp1P3Q6XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGM/Yyh0KTpTay5mZmkucmVtYXBUb1B5KHQpfSxhLmNvX25hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKGwpLGEuY29fdmFybmFtZXM9Xy5zbGljZSgpLGEuJGRlZmF1bHRzPVtdO2Zvcih2YXIgbT1kO208Xy5sZW5ndGg7bSsrKWEuJGRlZmF1bHRzLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKTtufHxhLmNvX3Zhcm5hbWVzLnVuc2hpZnQoXFxcInNlbGZcXFwiKSx0W3NdPW5ldyBTay5idWlsdGluLmZ1bmMoYSl9ZnVuY3Rpb24gaW5pdFR1cnRsZShlLHQpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMsMiwzLCExLCExKSxlLmluc3RhbmNlPW5ldyBUdXJ0bGUodCksZS5pbnN0YW5jZS5za0luc3RhbmNlPWV9ZnVuY3Rpb24gZm9jdXNUdXJ0bGUoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJih3PSEhZSx3P2dldFRhcmdldCgpLmZvY3VzKCk6Z2V0VGFyZ2V0KCkuYmx1cigpKSx3fWZ1bmN0aW9uIHJlc2V0VHVydGxlKCl7Zm9yKGNhbmNlbEFuaW1hdGlvbkZyYW1lKCksZ2V0U2NyZWVuKCkucmVzZXQoKSxnZXRGcmFtZU1hbmFnZXIoKS5yZXNldCgpO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2gmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfWZ1bmN0aW9uIHN0b3BUdXJ0bGUoKXtjYW5jZWxBbmltYXRpb25GcmFtZSgpLGgmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfXZhciB1LG0scCxnLGYsaCx5PXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInR1cnRsZVxcXCIpfSwkPTAsdz0hMCxiPTFlMy8zMCx2PXt9LGs9MCx4PXt9LFQ9e3RhcmdldDpcXFwidHVydGxlXFxcIix3aWR0aDo0MDAsaGVpZ2h0OjQwMCx3b3JsZFdpZHRoOjAsd29ybGRIZWlnaHQ6MCxhbmltYXRlOiEwLGJ1ZmZlclNpemU6MCxhbGxvd1VuZG86ITAsYXNzZXRzOnt9fTtlLmhhc0F0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiKXx8ZS5zZXRBdHRyaWJ1dGUoXFxcInRhYmluZGV4XFxcIiwwKSx4LkZMT0FUPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LHguQ09MT1I9ZnVuY3Rpb24oZSl7aWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSk7Zm9yKHZhciB0PTA7Mz50O3QrKyllW3RdPVNrLmJ1aWx0aW4uYXNzayQoZVt0XSk7cmV0dXJuIDQ9PT1lLmxlbmd0aCYmKGVbM109bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbM10pKSxuZXcgU2suYnVpbHRpbi50dXBsZShlKX0seC5UVVJUTEVfTElTVD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7cisrKXQucHVzaChlW3JdLnNrSW5zdGFuY2UpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0KX0sdi5hcnJvdz1bWy0xMCwwXSxbMTAsMF0sWzAsMTBdXSx2LnNxdWFyZT1bWzEwLC0xMF0sWzEwLDEwXSxbLTEwLDEwXSxbLTEwLC0xMF1dLHYudHJpYW5nbGU9W1sxMCwtNS43N10sWzAsMTEuNTVdLFstMTAsLTUuNzddXSx2LmNsYXNzaWM9W1swLDBdLFstNSwtOV0sWzAsLTddLFs1LC05XV0sdi50dXJ0bGU9W1swLDE2XSxbLTIsMTRdLFstMSwxMF0sWy00LDddLFstNyw5XSxbLTksOF0sWy02LDVdLFstNywxXSxbLTUsLTNdLFstOCwtNl0sWy02LC04XSxbLTQsLTVdLFswLC03XSxbNCwtNV0sWzYsLThdLFs4LC02XSxbNSwtM10sWzcsMV0sWzYsNV0sWzksOF0sWzcsOV0sWzQsN10sWzEsMTBdLFsyLDE0XV0sdi5jaXJjbGU9W1sxMCwwXSxbOS41MSwzLjA5XSxbOC4wOSw1Ljg4XSxbNS44OCw4LjA5XSxbMy4wOSw5LjUxXSxbMCwxMF0sWy0zLjA5LDkuNTFdLFstNS44OCw4LjA5XSxbLTguMDksNS44OF0sWy05LjUxLDMuMDldLFstMTAsMF0sWy05LjUxLC0zLjA5XSxbLTguMDksLTUuODhdLFstNS44OCwtOC4wOV0sWy0zLjA5LC05LjUxXSxbLTAsLTEwXSxbMy4wOSwtOS41MV0sWzUuODgsLTguMDldLFs4LjA5LC01Ljg4XSxbOS41MSwtMy4wOV1dLGc9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gU2suVHVydGxlR3JhcGhpY3N8fChTay5UdXJ0bGVHcmFwaGljcz17fSksVClTay5UdXJ0bGVHcmFwaGljcy5oYXNPd25Qcm9wZXJ0eShlKXx8KFNrLlR1cnRsZUdyYXBoaWNzW2VdPVRbZV0pO3JldHVybiBTay5UdXJ0bGVHcmFwaGljc30oKSxJbnN0YW50UHJvbWlzZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0UmVzdWx0KX1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9LEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcil0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0RXJyb3IpLHRoaXMubGFzdEVycm9yPXZvaWQgMH1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9O3ZhciBBOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBhbmltYXRpb25GcmFtZShlKXtyZXR1cm4gZy5hbmltYXRlPyFlJiZ0P3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG09d2luZG93LnNldFRpbWVvdXQodCxlfHxiKSxtfTpmdW5jdGlvbihlKXtlKCl9fXZhciB0OyhmdW5jdGlvbihlKXtlJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gdT1lKHQpfSl9KSh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSxlLndpbGxSZW5kZXJOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fYnVmZmVyJiZ0aGlzLl9mcmFtZUNvdW50KzE9PT10aGlzLmZyYW1lQnVmZmVyKCkpfSxlLnR1cnRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHVydGxlc30sZS5hZGRUdXJ0bGU9ZnVuY3Rpb24oZSl7dGhpcy5fdHVydGxlcy5wdXNoKGUpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5fdHVydGxlcylmb3IodmFyIGU9dGhpcy5fdHVydGxlcy5sZW5ndGg7MDw9LS1lOyl0aGlzLl90dXJ0bGVzW2VdLnJlc2V0KCk7dGhpcy5fdHVydGxlcz1bXSx0aGlzLl9mcmFtZXM9W10sdGhpcy5fZnJhbWVDb3VudD0wLHRoaXMuX2J1ZmZlcj0xLHRoaXMuX3JhdGU9MCx0aGlzLl9hbmltYXRpb25GcmFtZT1hbmltYXRpb25GcmFtZSgpfSxlLmFkZEZyYW1lPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ITE7cmV0dXJuIHQmJih0aGlzLl9mcmFtZUNvdW50Kz0xKSx0aGlzLmZyYW1lcygpLnB1c2goZSkscj0hZy5hbmltYXRlfHx0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQ9PT10aGlzLmZyYW1lQnVmZmVyKCkscj90aGlzLnVwZGF0ZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5mcmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVzfSxlLmZyYW1lQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX2J1ZmZlcj0wfGUsZSYmZTw9dGhpcy5fZnJhbWVDb3VudCk/dGhpcy51cGRhdGUoKTp0aGlzLl9idWZmZXJ9LGUucmVmcmVzaEludGVydmFsPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX3JhdGU9MHxlLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKGUpKSx0aGlzLl9yYXRlfSxlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXMmJnRoaXMuX2ZyYW1lcy5sZW5ndGg/dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTpuZXcgSW5zdGFudFByb21pc2V9LGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7dmFyIGUsdCxyPXRoaXMuX2ZyYW1lcyxuPXRoaXMuX2FuaW1hdGlvbkZyYW1lLGE9dGhpcy5fdHVydGxlcyxzPWdldFNjcmVlbigpLnNwcml0ZUxheWVyKCk7cmV0dXJuIHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsbmV3IFByb21pc2UoZnVuY3Rpb24obCl7bihmdW5jdGlvbiBwYWludCgpe2Zvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XSYmclt0XSgpO2ZvcihjbGVhckxheWVyKHMpLHQ9MDt0PGEubGVuZ3RoO3QrKyllPWFbdF0sZS5nZXRTdGF0ZSgpLnNob3duJiZkcmF3VHVydGxlKGUuZ2V0U3RhdGUoKSxzKTtsKCl9KX0pfX0pKEZyYW1lTWFuYWdlci5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2Uub25FdmVudD1mdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGNvbXB1dGVDb29yZGluYXRlcygpe2lmKCFfKXt2YXIgdD1nZXRTY3JlZW4oKSxsPXQuc3ByaXRlTGF5ZXIoKS5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZT0wfHIuY2xpZW50WC1sLmxlZnQsbj0wfHIuY2xpZW50WS1sLnRvcCxhPWUqdC54U2NhbGUrdC5sbHgscz1uKnQueVNjYWxlK3QudXJ5LF89ITB9fXZhciBlLG4sYSxzLGwsbz10aGlzLl9tYW5hZ2Vyc1t0XSxkPXRoaXMuX21hbmFnZXJzLm1vdXNlbW92ZSxfPSExO2lmKChcXFwibW91c2Vkb3duXFxcIj09PXR8fFxcXCJtb3VzZXVwXFxcIj09PXQpJiZkJiZkLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1kLmxlbmd0aDswPD0tLWw7KWRbbF0udGVzdChlLG4sYSxzKSYmZFtsXS5jYW5Nb3ZlKFxcXCJtb3VzZWRvd25cXFwiPT09dCk7aWYobyYmby5sZW5ndGgpZm9yKGNvbXB1dGVDb29yZGluYXRlcygpLGw9by5sZW5ndGg7MDw9LS1sOylcXFwibW91c2Vtb3ZlXFxcIj09PXQmJm9bbF0uY2FuTW92ZSgpJiZvW2xdLnRlc3QoZSxuLGEscyk/b1tsXS50cmlnZ2VyKFthLHNdKTpcXFwibW91c2Vkb3duXFxcIj09PXQmJm9bbF0udGVzdChlLG4sYSxzKSYmb1tsXS50cmlnZ2VyKFthLHNdKX0sZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX21hbmFnZXJzPXt9fSxlLmFkZE1hbmFnZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPVtdKSx0aGlzLl9tYW5hZ2Vyc1tlXS5wdXNoKHQpfX0oTW91c2VIYW5kbGVyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX2hhbmRsZXJzPXZvaWQgMH0sZS5jYW5Nb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiEhKHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3QpJiYodm9pZCAwIT09ZSYmKHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdD1lKSx0aGlzLl90YXJnZXQuaGl0VGVzdC5oaXQpfSxlLnRlc3Q9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3Q/dGhpcy5fdGFyZ2V0LmhpdFRlc3QoZSx0LHIsbik6ISF0aGlzLl90YXJnZXR9LGUudHJpZ2dlcj1mdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMuX2hhbmRsZXJzO2lmKHImJnIubGVuZ3RoKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XS5hcHBseSh7fSxlKX0sZS5hZGRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5faGFuZGxlcnM7aWYoIXQmJnImJnIubGVuZ3RoKWZvcig7ci5zaGlmdCgpOyk7cmV0dXJuXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/dm9pZCghciYmKHI9dGhpcy5faGFuZGxlcnM9W10pLHIucHVzaChlKSk6dm9pZChyJiYhci5sZW5ndGgmJnRoaXMucmVzZXQoKSl9fShFdmVudE1hbmFnZXIucHJvdG90eXBlKSxUdXJ0bGUuUkFESUFOUz0yKm8sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gY2lyY2xlUm90YXRlKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLCExLHthbmdsZTp0LHJhZGlhbnM6cn0pfX1mdW5jdGlvbiBjaXJjbGVTZWdtZW50KGUsdCxyLG4sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS50cmFuc2xhdGUodCxyLG4sYSxzLCEwKX19ZS5oaXRUZXN0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0U2NyZWVuKCkuaGl0VGVzdExheWVyKCk7Y2xlYXJMYXllcihyKSxkcmF3VHVydGxlKHRoaXMuZ2V0U3RhdGUoKSxyKTt2YXIgbj1yLmdldEltYWdlRGF0YShlLHQsMSwxKS5kYXRhO3JldHVybiBuWzNdfHxuWzBdfHxuWzFdfHxuWzJdfSxlLmFkZFVwZGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcyxhPXRoaXMuZ2V0U3RhdGUoKSxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxyPzI6Myk7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLmFkZEZyYW1lKGZ1bmN0aW9uKCl7aWYoZSYmZS5hcHBseShhLHMpLHIpZm9yKHZhciB0IGluIHIpYVt0XT1yW3RdfSx0KX0sZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX3N0YXRlfHwodGhpcy5fc3RhdGU9e3g6dGhpcy5feCx5OnRoaXMuX3ksYW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zLHNoYXBlOnRoaXMuX3NoYXBlLGNvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbCxmaWxsaW5nOnRoaXMuX2ZpbGxpbmcsc2l6ZTp0aGlzLl9zaXplLHNwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkLGRvd246dGhpcy5fZG93bixzaG93bjp0aGlzLl9zaG93bixjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlLGNvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRQYXBlcigpfX0pLHRoaXMuX3N0YXRlfSxlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQscixuLGEscyl7dmFyIGw9dGhpcztyZXR1cm4gdHJhbnNsYXRlKHRoaXMsZSx0LHIsbixhLHMpLnRoZW4oZnVuY3Rpb24oZSl7bC5feD1lWzBdLGwuX3k9ZVsxXX0pfSxlLnJvdGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcztyZXR1cm4gcm90YXRlKHRoaXMsZSx0LHIpLnRoZW4oZnVuY3Rpb24oZSl7bi5fYW5nbGU9ZS5hbmdsZSxuLl9yYWRpYW5zPWUucmFkaWFuc30pfSxlLnF1ZXVlTW92ZUJ5PWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPWMocikqbixzPV8ocikqbjtyZXR1cm4gdGhpcy50cmFuc2xhdGUoZSx0LGEscywhMCl9LGUucXVldWVUdXJuVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCU9dGhpcy5fZnVsbENpcmNsZSwwPnQmJih0Kz10aGlzLl9mdWxsQ2lyY2xlKSx0aGlzLnJvdGF0ZShlLHQtZSl9LGUuZ2V0TWFuYWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1uZXcgRXZlbnRNYW5hZ2VyKGUsdGhpcykpLHRoaXMuX21hbmFnZXJzW2VdfSxlLmdldFBhcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcGVyfHwodGhpcy5fcGFwZXI9Y3JlYXRlTGF5ZXIoMikpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fcmFkaWFucz0wLHRoaXMuX2FuZ2xlPTAsdGhpcy5fc2hvd249ITAsdGhpcy5fZG93bj0hMCx0aGlzLl9jb2xvcj1cXFwiYmxhY2tcXFwiLHRoaXMuX2ZpbGw9XFxcImJsYWNrXFxcIix0aGlzLl9zaXplPTEsdGhpcy5fZmlsbGluZz0hMSx0aGlzLl91bmRvQnVmZmVyPVtdLHRoaXMuX3NwZWVkPTMsdGhpcy5fY29tcHV0ZWRfc3BlZWQ9NSx0aGlzLl9jb2xvck1vZGU9MSx0aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5fbWFuYWdlcnMpdGhpcy5fbWFuYWdlcnNbZV0ucmVzZXQoKTt0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fZnVsbENpcmNsZT0zNjAsdGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGcuYnVmZmVyU2l6ZT9nLmJ1ZmZlclNpemU6MCxyZW1vdmVMYXllcih0aGlzLl9wYXBlciksdGhpcy5fcGFwZXI9dm9pZCAwfSxlLiRkZWdyZWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9zKGUpOjM2MCx0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fYW5nbGU9ZSYmdGhpcy5fZnVsbENpcmNsZT90aGlzLl9hbmdsZS90aGlzLl9mdWxsQ2lyY2xlKmU6dGhpcy5fcmFkaWFucz0wLHRoaXMuX2Z1bGxDaXJjbGU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnRoaXMuX2FuZ2xlLHJhZGlhbnM6dGhpcy5fcmFkaWFuc30pfSxlLiRkZWdyZWVzLm1pbkFyZ3M9MCxlLiRkZWdyZWVzLmNvX3Zhcm5hbWVzPVtcXFwiZnVsbGNpcmNsZVxcXCJdLGUuJGRlZ3JlZXMucmV0dXJuVHlwZT14LkZMT0FULGUuJHJhZGlhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNSYWRpYW5zfHwodGhpcy5faXNSYWRpYW5zPSEwLHRoaXMuX2FuZ2xlPXRoaXMuX3JhZGlhbnMsdGhpcy5fZnVsbENpcmNsZT1UdXJ0bGUuUkFESUFOUyksdGhpcy5fYW5nbGV9LGUuJHJhZGlhbnMucmV0dXJuVHlwZT14LkZMT0FULGUuJHBvc2l0aW9uPWUuJHBvcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLiR4Y29yKCksdGhpcy4keWNvcigpXX0sZS4kcG9zaXRpb24ucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhlWzBdKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZVsxXSldKX0sZS4kdG93YXJkcz1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCksbj1vK2QodGhpcy5feS1yLnksdGhpcy5feC1yLngpLGE9bioodGhpcy5fZnVsbENpcmNsZS9UdXJ0bGUuUkFESUFOUyk7cmV0dXJuIGF9LGUuJHRvd2FyZHMuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJHRvd2FyZHMubWluQXJncz0xLGUuJHRvd2FyZHMucmV0dXJuVHlwZT14LkZMT0FULGUuJGRpc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxhPXIueC10aGlzLl94LHM9ci55LXRoaXMuX3k7cmV0dXJuIG4oYSphK3Mqcyl9LGUuJGRpc3RhbmNlLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRkaXN0YW5jZS5taW5BcmdzPTEsZS4kZGlzdGFuY2UucmV0dXJuVHlwZT14LkZMT0FULGUuJGhlYWRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl9hbmdsZSk/MDp0aGlzLl9hbmdsZX0sZS4kaGVhZGluZy5yZXR1cm5UeXBlPXguRkxPQVQsZS4keGNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3gpPzA6dGhpcy5feH0sZS4keGNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4keWNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3kpPzA6dGhpcy5feX0sZS4keWNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZm9yd2FyZD1lLiRmZD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucyxlKX0sZS4kZm9yd2FyZC5jb192YXJuYW1lcz1lLiRmZC5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kdW5kbz1mdW5jdGlvbigpe3BvcFVuZG8odGhpcyl9LGUuJHVuZG9idWZmZXJlbnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuZG9CdWZmZXIubGVuZ3RofSxlLiRzZXR1bmRvYnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuX2J1ZmZlclNpemU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP2EocyhlKSwxZTMpOjB9LGUuJHNldHVuZG9idWZmZXIuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIl0sZS4kYmFja3dhcmQ9ZS4kYmFjaz1lLiRiaz1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucywtZSl9LGUuJGJhY2t3YXJkLmNvX3Zhcm5hbWVzPWUuJGJhY2suY29fdmFybmFtZXM9ZS4kYmsuY29fdmFybmFtZXM9W1xcXCJkaXN0YW5jZVxcXCJdLGUuJGdvdG9fJHJ3JD1lLiRzZXRwb3M9ZS4kc2V0cG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpO3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksci54LXRoaXMuX3gsci55LXRoaXMuX3ksITApfSxlLiRnb3RvXyRydyQuY29fdmFybmFtZXM9ZS4kc2V0cG9zLmNvX3Zhcm5hbWVzPWUuJHNldHBvc2l0aW9uLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRnb3RvXyRydyQubWluQXJncz1lLiRzZXRwb3MubWluQXJncz1lLiRzZXRwb3NpdGlvbi5taW5BcmdzPTEsZS4kc2V0eD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LGUtdGhpcy5feCwwLCEwKX0sZS4kc2V0eC5jb192YXJuYW1lcz1bXFxcInhcXFwiXSxlLiRzZXR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksMCxlLXRoaXMuX3ksITApfSxlLiRzZXR5LmNvX3Zhcm5hbWVzPVtcXFwieVxcXCJdLGUuJGhvbWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fYW5nbGU7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGUudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwtdGhpcy5feCwtdGhpcy5feSwhMCkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnF1ZXVlVHVyblRvKHQsMCl9KS50aGVuKGZ1bmN0aW9uKCl7fSl9LGUuJHJpZ2h0PWUuJHJ0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSwtZSl9LGUuJHJpZ2h0LmNvX3Zhcm5hbWVzPWUuJHJ0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRsZWZ0PWUuJGx0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSxlKX0sZS4kbGVmdC5jb192YXJuYW1lcz1lLiRsdC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kc2V0aGVhZGluZz1lLiRzZXRoPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlVHVyblRvKHRoaXMuX2FuZ2xlLGUpfSxlLiRzZXRoZWFkaW5nLmNvX3Zhcm5hbWVzPWUuJHNldGguY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGNpcmNsZT1mdW5jdGlvbihlLHQscil7dmFyIG4sZCx1LG0scCxnLGYsaCwkLGI9dGhpcyx2PXRoaXMuX3gsaz10aGlzLl95LFQ9dGhpcy5fYW5nbGUsQT17fSxMPTEvZ2V0U2NyZWVuKCkubGluZVNjYWxlLFM9ITA7Zm9yKHB1c2hVbmRvKHRoaXMpLHZvaWQgMD09PXQmJih0PWIuX2Z1bGxDaXJjbGUpLHZvaWQgMD09PXImJihkPXModCkvYi5fZnVsbENpcmNsZSxyPTErKDB8YSgxMStzKGUqTCkvNiw1OSkqZCkpLHU9dC9yLG09LjUqdSxwPTIqZSpfKHUqby9iLl9mdWxsQ2lyY2xlKSwwPmU/KHA9LXAsdT0tdSxtPS1tLG49VC10KTpuPVQrdCwkPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlLFQrPW0sZz0wO2c8cjtnKyspY2FsY3VsYXRlSGVhZGluZyhiLFQrdSpnLEEpLGY9YyhBLnJhZGlhbnMpKnAsaD1fKEEucmFkaWFucykqcCwkPSQudGhlbihjaXJjbGVSb3RhdGUoYixBLmFuZ2xlLEEucmFkaWFucykpLnRoZW4oY2lyY2xlU2VnbWVudChiLHYsayxmLGgsUykpLHYrPWYsays9aCxTPSExO3JldHVybiAkPSQudGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGIsbixBKSxiLl9hbmdsZT1BLmFuZ2xlLGIuX3JhZGlhbnM9QS5yYWRpYW5zLGIuYWRkVXBkYXRlKHZvaWQgMCwhMCxBKX0pLCR9LGUuJGNpcmNsZS5jb192YXJuYW1lcz1bXFxcInJhZGl1c1xcXCIsXFxcImV4dGVudFxcXCIsXFxcInN0ZXBzXFxcIl0sZS4kY2lyY2xlLm1pbkFyZ3M9MSxlLiRwZW51cD1lLiR1cD1lLiRwdT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSExLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMX0pfSxlLiRwZW5kb3duPWUuJGRvd249ZS4kcGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2Rvd246ITB9KX0sZS4kaXNkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd259LGUuJHNwZWVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NwZWVkOih0aGlzLl9zcGVlZD1yKDAsYSgxZTMsZSkpLHRoaXMuX2NvbXB1dGVkX3NwZWVkPXIoMCwyKmUtMSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtzcGVlZDp0aGlzLl9jb21wdXRlZF9zcGVlZH0pKX0sZS4kc3BlZWQubWluQXJncz0wLGUuJHNwZWVkLmNvX3Zhcm5hbWVzPVtcXFwic3BlZWRcXFwiXSxlLiRwZW5jb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yfSkpfSxlLiRwZW5jb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRwZW5jb2xvci5taW5BcmdzPTAsZS4kcGVuY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJGZpbGxjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9maWxsKToodGhpcy5fZmlsbD1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGZpbGxjb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRmaWxsY29sb3IubWluQXJncz0wLGUuJGZpbGxjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/W3RoaXMuJHBlbmNvbG9yKCksdGhpcy4kZmlsbGNvbG9yKCldOih2b2lkIDA9PT10fHx2b2lkIDAhPT1yPyh0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5fZmlsbD10aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlKSx0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0KSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvcjp0aGlzLl9jb2xvcixmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGNvbG9yLm1pbkFyZ3M9MCxlLiRjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kY29sb3IucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3guQ09MT1IoZVswXSkseC5DT0xPUihlWzFdKV0pfSxlLiRmaWxsPWZ1bmN0aW9uKGUpe3RoaXM7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fZmlsbGluZzooZT0hIWUsZT09PXRoaXMuX2ZpbGxpbmcpP3ZvaWQgMDoodGhpcy5fZmlsbGluZz1lLGU/KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZmlsbGluZzohMCxmaWxsQnVmZmVyOlt7eDp0aGlzLl94LHk6dGhpcy5feX1dfSkpOihwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe3RoaXMuZmlsbEJ1ZmZlci5wdXNoKHRoaXMpLGRyYXdGaWxsLmNhbGwodGhpcyl9LCEwLHtmaWxsaW5nOiExLGZpbGxCdWZmZXI6dm9pZCAwfSkpKX0sZS4kZmlsbC5jb192YXJuYW1lcz1bXFxcImZsYWdcXFwiXSxlLiRmaWxsLm1pbkFyZ3M9MCxlLiRiZWdpbl9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITApfSxlLiRlbmRfZmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmaWxsKCExKX0sZS4kc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXtkcmF3VHVydGxlKHRoaXMsdGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdD1mdW5jdGlvbihlLHQsbixsLGkpe3JldHVybiBwdXNoVW5kbyh0aGlzKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3IoMSwwfHMoZSkpOnIodGhpcy5fc2l6ZSs0LDIqdGhpcy5fc2l6ZSksdD12b2lkIDA9PT10P3RoaXMuX2NvbG9yOmNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0LG4sbCxpKSx0aGlzLmFkZFVwZGF0ZShkcmF3RG90LCEwLHZvaWQgMCxlLHQpfSxlLiRkb3QuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIixcXFwiY29sb3JcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiR3cml0ZT1mdW5jdGlvbihlLHQscixuKXt2YXIgYSxzLGwsaSxvLGQ9dGhpcztyZXR1cm4gcHVzaFVuZG8odGhpcyksZSs9XFxcIlxcXCIsbiYmbi5jb25zdHJ1Y3Rvcj09PUFycmF5JiYocz1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMF0/blswXTpcXFwiQXJpYWxcXFwiLGw9KG5bMV18fFxcXCIxMnB0XFxcIikrXFxcIlxcXCIsaT1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMl0/blsyXTpcXFwibm9ybWFsXFxcIiwvXlxcXFxkKyQvLnRlc3QobCkmJihsKz1cXFwicHRcXFwiKSxuPVtpLGwsc10uam9pbihcXFwiIFxcXCIpKSxyfHwocj1cXFwibGVmdFxcXCIpLGE9dGhpcy5hZGRVcGRhdGUoZHJhd1RleHQsITAsdm9pZCAwLGUscixuKSx0JiYoXFxcImxlZnRcXFwiPT09cnx8XFxcImNlbnRlclxcXCI9PT1yKSYmKG89bWVhc3VyZVRleHQoZSxuKSxcXFwiY2VudGVyXFxcIj09PXImJihvLz0yKSxhPWEudGhlbihmdW5jdGlvbigpe3ZhciBlPWQuZ2V0U3RhdGUoKTtyZXR1cm4gZC50cmFuc2xhdGUoZS54LGUueSxvLDAsITApfSkpLGF9LGUuJHdyaXRlLmNvX3Zhcm5hbWVzPVtcXFwibWVzc2FnZVxcXCIsXFxcIm1vdmVcXFwiLFxcXCJhbGlnblxcXCIsXFxcImZvbnRcXFwiXSxlLiR3cml0ZS5taW5BcmdzPTEsZS4kcGVuc2l6ZT1lLiR3aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9zaXplOih0aGlzLl9zaXplPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaXplOmV9KSl9LGUuJHBlbnNpemUubWluQXJncz1lLiR3aWR0aC5taW5BcmdzPTAsZS4kcGVuc2l6ZS5jb192YXJuYW1lcz1lLiR3aWR0aC5jb192YXJuYW1lcz1bXFxcIndpZHRoXFxcIl0sZS4kc2hvd3R1cnRsZT1lLiRzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiEwfSl9LGUuJGhpZGV0dXJ0bGU9ZS4kaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCEwLHtzaG93bjohMX0pfSxlLiRpc3Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd259LGUuJHNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZ2W2VdPyh0aGlzLl9zaGFwZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7c2hhcGU6ZX0pKTp0aGlzLl9zaGFwZX0sZS4kc2hhcGUubWluQXJncz0wLGUuJHNoYXBlLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGNvbG9ybW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9jb2xvck1vZGU6KHRoaXMuX2NvbG9yTW9kZT0yNTU9PT1lPzI1NToxLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3JNb2RlOnRoaXMuX2NvbG9yTW9kZX0pKX0sZS4kY29sb3Jtb2RlLm1pbkFyZ3M9MCxlLiRjb2xvcm1vZGUuY29fdmFybmFtZXM9W1xcXCJjbW9kZVxcXCJdLGUuJGNvbG9ybW9kZS5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiAyNTU9PT1lP25ldyBTay5idWlsdGluLmludF8oMjU1KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHdpbmRvd193aWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X2hlaWdodCgpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR0cmFjZXIoZSx0KX0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJuXFxcIixcXFwiZGVsYXlcXFwiXSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR1cGRhdGUoKX0sZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kZGVsYXkoZSl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS4kcmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJGNsZWFyKCl9LGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRtYWlubG9vcCgpfSxlLiRjbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2NsZWFyTGF5ZXIodGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdC5taW5BcmdzPTAsZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uY2xpY2subWluQXJncz0xLGUuJG9uY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbnJlbGVhc2U9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2V1cFxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25yZWxlYXNlLm1pbkFyZ3M9MSxlLiRvbnJlbGVhc2UuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbmRyYWc9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vtb3ZlXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmRyYWcubWluQXJncz0xLGUuJG9uZHJhZy5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJGdldHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoeS5TY3JlZW4pfSxlLiRnZXRzY3JlZW4uaXNTaz0hMCxlLiRjbG9uZT1mdW5jdGlvbigpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh5LlR1cnRsZSk7cmV0dXJuIGUuaW5zdGFuY2UuX3g9dGhpcy5feCxlLmluc3RhbmNlLl95PXRoaXMuX3ksZS5pbnN0YW5jZS5fYW5nbGU9dGhpcy5fYW5nbGUsZS5pbnN0YW5jZS5fcmFkaWFucz10aGlzLl9yYWRpYW5zLGUuaW5zdGFuY2UuX3NoYXBlPXRoaXMuX3NoYXBlLGUuaW5zdGFuY2UuX2NvbG9yPXRoaXMuX2NvbG9yLGUuaW5zdGFuY2UuX2ZpbGw9dGhpcy5fZmlsbCxlLmluc3RhbmNlLl9maWxsaW5nPXRoaXMuX2ZpbGxpbmcsZS5pbnN0YW5jZS5fc2l6ZT10aGlzLl9zaXplLGUuaW5zdGFuY2UuX2NvbXB1dGVkX3NwZWVkPXRoaXMuX2NvbXB1dGVkX3NwZWVkLGUuaW5zdGFuY2UuX2Rvd249dGhpcy5fZG93bixlLmluc3RhbmNlLl9zaG93bj10aGlzLl9zaG93bixlLmluc3RhbmNlLl9jb2xvck1vZGU9dGhpcy5fY29sb3JNb2RlLGUuaW5zdGFuY2UuX2lzUmFkaWFucz10aGlzLl9pc1JhZGlhbnMsZS5pbnN0YW5jZS5fZnVsbENpcmNsZT10aGlzLl9mdWxsQ2lyY2xlLGUuaW5zdGFuY2UuX2J1ZmZlclNpemU9dGhpcy5fYnVmZmVyU2l6ZSxlLmluc3RhbmNlLl91bmRvQnVmZmVyPXRoaXMuX3VuZG9CdWZmZXIsZS5fY2xvbmVkRnJvbT10aGlzLGV9LGUuJGNsb25lLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGUuJGdldHR1cnRsZT1lLiRnZXRwZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5za0luc3RhbmNlfSxlLiRnZXR0dXJ0bGUuaXNTaz0hMH0oVHVydGxlLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5zcHJpdGVMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJpdGVzfHwodGhpcy5fc3ByaXRlcz1jcmVhdGVMYXllcigzKSl9LGUuYmdMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kfHwodGhpcy5fYmFja2dyb3VuZD1jcmVhdGVMYXllcigxKSl9LGUuaGl0VGVzdExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpdFRlc3R8fCh0aGlzLl9oaXRUZXN0PWNyZWF0ZUxheWVyKDAsITApKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5fa2V5TGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9rZXlMb2dnZXIpd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fa2V5TG9nZ2VyW2VdKSx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2tleUxvZ2dlcltlXSksZGVsZXRlIHRoaXMuX2tleUxvZ2dlcltlXTtmb3IoZSBpbiB0aGlzLl9rZXlEb3duTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpLHRoaXMuX2tleURvd25MaXN0ZW5lcj12b2lkIDApLHRoaXMuX2tleVVwTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lciksdGhpcy5fa2V5VXBMaXN0ZW5lcj12b2lkIDApLHRoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIixyZW1vdmVMYXllcih0aGlzLl9zcHJpdGVzKSx0aGlzLl9zcHJpdGVzPXZvaWQgMCxyZW1vdmVMYXllcih0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLl9iYWNrZ3JvdW5kPXZvaWQgMH0sZS5zZXRVcFdvcmxkPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBsPXRoaXM7bC5sbHg9ZSxsLmxseT10LGwudXJ4PXIsbC51cnk9bixsLnhTY2FsZT0oci1lKS9nZXRXaWR0aCgpLGwueVNjYWxlPS0xKihuLXQpL2dldEhlaWdodCgpLGwubGluZVNjYWxlPWEocyhsLnhTY2FsZSkscyhsLnlTY2FsZSkpfSxlLiRzZXR1cD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gaXNOYU4ocGFyc2VGbG9hdChlKSkmJihlPWdldFdpZHRoKCkpLGlzTmFOKHBhcnNlRmxvYXQodCkpJiYodD1nZXRIZWlnaHQoKSksMT49ZSYmKGU9Z2V0V2lkdGgoKSplKSwxPj10JiYodD1nZXRIZWlnaHQoKSp0KSx0aGlzLl93aWR0aD1lLHRoaXMuX2hlaWdodD10LHRoaXMuX3hPZmZzZXQ9dm9pZCAwPT09cnx8aXNOYU4ocGFyc2VJbnQocikpPzA6cGFyc2VJbnQociksdGhpcy5feU9mZnNldD12b2lkIDA9PT1ufHxpc05hTihwYXJzZUludChuKSk/MDpwYXJzZUludChuKSxcXFwid29ybGRcXFwiPT09dGhpcy5fbW9kZT90aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKHRoaXMubGx4LHRoaXMubGx5LHRoaXMudXJ4LHRoaXMudXJ5KTp0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKC1lLzIsLXQvMixlLzIsdC8yKX0sZS4kc2V0dXAubWluQXJncz0wLGUuJHNldHVwLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiLFxcXCJoZWlnaHRcXFwiLFxcXCJzdGFydHhcXFwiLFxcXCJzdGFydHlcXFwiXSxlLiRyZWdpc3Rlcl9zaGFwZT1lLiRhZGRzaGFwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P3ZvaWQodltlXT10KTpnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKHQpe3ZbZV09dH0pfSxlLiRyZWdpc3Rlcl9zaGFwZS5taW5BcmdzPTEsZS4kZ2V0c2hhcGVzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHYpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZXx8dm9pZCAwIT09dD8oXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fZGVsYXk9dCxnZXRGcmFtZU1hbmFnZXIoKS5yZWZyZXNoSW50ZXJ2YWwodCkpLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8odGhpcy5fZnJhbWVzPWUsZ2V0RnJhbWVNYW5hZ2VyKCkuZnJhbWVCdWZmZXIoZSkpOnZvaWQgMCk6dGhpcy5fZnJhbWVzfSxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJmcmFtZXNcXFwiLFxcXCJkZWxheVxcXCJdLGUuJHRyYWNlci5taW5BcmdzPTAsZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwPT09dGhpcy5fZGVsYXk/Yjp0aGlzLl9kZWxheTp0aGlzLiR0cmFjZXIodm9pZCAwLGUpfSxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS5fc2V0d29ybGRjb29yZGluYXRlcz1mdW5jdGlvbihlLHQscixuKXt2YXIgYT10aGlzLHM9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiB0aGlzLnNldFVwV29ybGQoZSx0LHIsbiksdGhpcy5fc3ByaXRlcyYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX3Nwcml0ZXMpLHRoaXMuX2JhY2tncm91bmQmJmFwcGx5V29ybGQodGhpcyx0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLiRjbGVhcigpfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLl9tb2RlPVxcXCJ3b3JsZFxcXCIsdGhpcy5fc2V0d29ybGRjb29yZGluYXRlcyhlLHQscixuKX0sZS4kc2V0d29ybGRjb29yZGluYXRlcy5jb192YXJuYW1lcz1bXFxcImxseFxcXCIsXFxcImxseVxcXCIsXFxcInVyeFxcXCIsXFxcInVyeVxcXCJdLGUubWluQXJncz00LGUuJGNsZWFyPWUuJGNsZWFyc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXQoKSx0aGlzLiRyZXNldCgpfSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkudXBkYXRlKCl9LGUuJHJlc2V0PWUuJHJlc2V0c2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXthcHBseVdvcmxkKGUsZS5fc3ByaXRlcyksYXBwbHlXb3JsZChlLGUuX2JhY2tncm91bmQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl0ucmVzZXQoKSxhcHBseVdvcmxkKGUsdFtyXS5fcGFwZXIpfSwhMCl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiBnZXRXaWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGdldEhlaWdodCgpfSxlLiRkZWxheS5taW5BcmdzPTAsZS4kdHVydGxlcz1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCl9LGUuJHR1cnRsZXMucmV0dXJuVHlwZT14LlRVUlRMRV9MSVNULGUuJGJncGljPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlPyh0PXRoaXMsZ2V0QXNzZXQoZSkudGhlbihmdW5jdGlvbihlKXtjbGVhckxheWVyKHQuYmdMYXllcigpLHZvaWQgMCxlKX0pKTp0aGlzLl9iZ3BpY30sZS4kYmdwaWMubWluQXJncz0wLGUuJGJncGljLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGJnY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fYmdjb2xvcik6KHRoaXMuX2JnY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHZvaWQgY2xlYXJMYXllcih0aGlzLmJnTGF5ZXIoKSx0aGlzLl9iZ2NvbG9yKSl9LGUuJGJnY29sb3IubWluQXJncz0wLGUuJGJnY29sb3IuY29fdmFybmFtZXM9W1xcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGJnY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXt9LGUuJGJ5ZT1mdW5jdGlvbigpe3JldHVybiBTay5UdXJ0bGVHcmFwaGljcy5yZXNldCgpfSxlLiRleGl0b25jbGljaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leGl0T25DbGljaz0hMCx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZnVuY3Rpb24oKXtyZXNldFR1cnRsZSgpfSwhMSl9LGUuJG9uY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2V4aXRPbkNsaWNrfHx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdO3ZhciB0PXs4Oi9eYmFjayhzcGFjZSk/JC9pLDk6L150YWIkL2ksMTM6L14oZW50ZXJ8cmV0dXJuKSQvaSwxNjovXnNoaWZ0JC9pLDE3Oi9eKGN0cmx8Y29udHJvbCkkL2ksMTg6L15hbHQkL2ksMjc6L15lc2MoYXBlKT8kL2ksMzI6L15zcGFjZSQvaSwzMzovXnBhZ2VbXFxcXHNcXFxcLV0/dXAkL2ksMzQ6L15wYWdlW1xcXFxzXFxcXC1dP2Rvd24kL2ksMzU6L15lbmQkL2ksMzY6L15ob21lJC9pLDM3Oi9ebGVmdChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSwzODovXnVwKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM5Oi9ecmlnaHQoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDA6L15kb3duKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDQ1Oi9eaW5zZXJ0JC9pLDQ2Oi9eZGVsKGV0ZSk/JC9pfTtlLl9jcmVhdGVLZXlSZXBlYXRlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7ci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCksci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3IuX2tleUxpc3RlbmVyc1tlXSgpfSw1MCl9LDMzMyl9LGUuX2NyZWF0ZUtleURvd25MaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciByPXRoaXM7dGhpcy5fa2V5RG93bkxpc3RlbmVyfHwodGhpcy5fa2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKG4pe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGU7aWYoZm9jdXNUdXJ0bGUoKSl7dmFyIGEscyxsPW4uY2hhckNvZGV8fG4ua2V5Q29kZSxpPWUobCkudG9Mb3dlckNhc2UoKTtpZighci5fa2V5TG9nZ2VyW2xdKWZvcihhIGluIHIuX2tleUxpc3RlbmVycylpZihzPTE8YS5sZW5ndGgmJnRbbF0mJnRbbF0udGVzdChhKSxhPT09aXx8cyl7ci5fa2V5TGlzdGVuZXJzW2FdKCksci5fY3JlYXRlS2V5UmVwZWF0ZXIoYSxsKSxuLnByZXZlbnREZWZhdWx0KCk7YnJlYWt9fX0sZ2V0VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihcXFwia2V5ZG93blxcXCIsdGhpcy5fa2V5RG93bkxpc3RlbmVyKSl9LGUuX2NyZWF0ZUtleVVwTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2tleVVwTGlzdGVuZXJ8fCh0aGlzLl9rZXlVcExpc3RlbmVyPWZ1bmN0aW9uKHIpe3ZhciBlPXQuX2tleUxvZ2dlcltyLmNoYXJDb2RlfHxyLmtleUNvZGVdO3ZvaWQgMCE9PWUmJihyLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsZWFySW50ZXJ2YWwoZSksd2luZG93LmNsZWFyVGltZW91dChlKSxkZWxldGUgdC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV0pfSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lcikpfSxlLiRsaXN0ZW49ZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVLZXlVcExpc3RlbmVyKCksdGhpcy5fY3JlYXRlS2V5RG93bkxpc3RlbmVyKCl9LGUuJG9ua2V5PWZ1bmN0aW9uKGUsdCl7aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQpe3ZhciByPWU7ZT10LHQ9cn10PSh0K1xcXCJcXFwiKS50b0xvd2VyQ2FzZSgpLGUmJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlPyghdGhpcy5fa2V5TGlzdGVuZXJzJiYodGhpcy5fa2V5TGlzdGVuZXJzPXt9KSx0aGlzLl9rZXlMaXN0ZW5lcnNbdF09ZSk6ZGVsZXRlIHRoaXMuX2tleUxpc3RlbmVyc1t0XX0sZS4kb25rZXkubWluQXJncz0yLGUuJG9ua2V5LmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwia2V5VmFsdWVcXFwiXSxlLiRvbnNjcmVlbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25zY3JlZW5jbGljay5taW5BcmdzPTEsZS4kb25zY3JlZW5jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9udGltZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCksZSYmXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoZSxyKDAsMHx0KSkpfSxlLiRvbnRpbWVyLm1pbkFyZ3M9MCxlLiRvbnRpbWVyLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiaW50ZXJ2YWxcXFwiXX0oU2NyZWVuLnByb3RvdHlwZSk7dmFyIEw9bmV3IEltYWdlLFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIikuZ2V0Q29udGV4dChcXFwiMmRcXFwiKTtmb3IodmFyIEMgaW4gaW5pdFR1cnRsZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzaGFwZVxcXCJdLGluaXRUdXJ0bGUuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlR1cnRsZVxcXCIpLGluaXRUdXJ0bGUuY29fYXJnY291bnQ9Mixpbml0VHVydGxlLiRkZWZhdWx0cz1bU2suYnVpbHRpbi5ub25lLm5vbmUkLG5ldyBTay5idWlsdGluLnN0cihcXFwiY2xhc3NpY1xcXCIpXSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KEMpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHksQyxlbnN1cmVBbm9ueW1vdXMpO3JldHVybiBhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRtYWlubG9vcFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRkb25lXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGJ5ZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR0cmFjZXJcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkdXBkYXRlXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRlbGF5XFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd193aWR0aFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR3aW5kb3dfaGVpZ2h0XFxcIixnZXRTY3JlZW4pLHkuVHVydGxlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBUdXJ0bGVXcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhpbml0VHVydGxlKSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KHIpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHQscil9LFxcXCJUdXJ0bGVcXFwiLFtdKSx5LlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKHksZnVuY3Rpb24gU2NyZWVuV3JhcHBlcihlLHQpe2Zvcih2YXIgciBpbiB0Ll9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSl7ZS5pbnN0YW5jZT1nZXRTY3JlZW4oKX0pLFNjcmVlbi5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChTY3JlZW4sdCxyKX0sXFxcIlNjcmVlblxcXCIsW10pLHtza01vZHVsZTp5LHJlc2V0OnJlc2V0VHVydGxlLHN0b3A6c3RvcFR1cnRsZSxmb2N1czpmb2N1c1R1cnRsZSxUdXJ0bGU6VHVydGxlLFNjcmVlbjpTY3JlZW59fShlKSxTay5UdXJ0bGVHcmFwaGljcy5tb2R1bGU9ZS50dXJ0bGVJbnN0YW5jZS5za01vZHVsZSxTay5UdXJ0bGVHcmFwaGljcy5yZXNldD1lLnR1cnRsZUluc3RhbmNlLnJlc2V0LFNrLlR1cnRsZUdyYXBoaWNzLnN0b3A9ZS50dXJ0bGVJbnN0YW5jZS5zdG9wLFNrLlR1cnRsZUdyYXBoaWNzLmZvY3VzPWUudHVydGxlSW5zdGFuY2UuZm9jdXMsU2suVHVydGxlR3JhcGhpY3MucmF3PXtUdXJ0bGU6ZS50dXJ0bGVJbnN0YW5jZS5UdXJ0bGUsU2NyZWVuOmUudHVydGxlSW5zdGFuY2UuU2NyZWVufSxlLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlfTtcIixcInNyYy9saWIvdHlwZXMucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuXFxcIlxcXCJcXFwiRGVmaW5lIG5hbWVzIGZvciBhbGwgdHlwZSBzeW1ib2xzIGtub3duIGluIHRoZSBzdGFuZGFyZCBpbnRlcnByZXRlci5cXG5UeXBlcyB0aGF0IGFyZSBwYXJ0IG9mIG9wdGlvbmFsIG1vZHVsZXMgKGUuZy4gYXJyYXkpIGFyZSBub3QgbGlzdGVkLlxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCBzeXNcXG5cXG4jIEl0ZXJhdG9ycyBpbiBQeXRob24gYXJlbid0IGEgbWF0dGVyIG9mIHR5cGUgYnV0IG9mIHByb3RvY29sLiAgQSBsYXJnZVxcbiMgYW5kIGNoYW5naW5nIG51bWJlciBvZiBidWlsdGluIHR5cGVzIGltcGxlbWVudCAqc29tZSogZmxhdm9yIG9mXFxuIyBpdGVyYXRvci4gIERvbid0IGNoZWNrIHRoZSB0eXBlISAgVXNlIGhhc2F0dHIgdG8gY2hlY2sgZm9yIGJvdGhcXG4jIFxcXCJfX2l0ZXJfX1xcXCIgYW5kIFxcXCJuZXh0XFxcIiBhdHRyaWJ1dGVzIGluc3RlYWQuXFxuTWFwcGluZ1Byb3h5VHlwZSA9IHR5cGUodHlwZS5fX2RpY3RfXylcXG5XcmFwcGVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKG9iamVjdC5fX2luaXRfXylcXG5NZXRob2RXcmFwcGVyVHlwZSA9IHR5cGUob2JqZWN0KCkuX19zdHJfXylcXG5NZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoc3RyLmpvaW4pXFxuQ2xhc3NNZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoZGljdC5fX2RpY3RfX1snZnJvbWtleXMnXSlcXG5cXG5Ob25lVHlwZSA9IHR5cGUoTm9uZSlcXG5UeXBlVHlwZSA9IHR5cGVcXG5PYmplY3RUeXBlID0gb2JqZWN0XFxuSW50VHlwZSA9IGludFxcbnRyeTpcXG4gICAgTG9uZ1R5cGUgPSBsb25nXFxuZXhjZXB0OiBwYXNzXFxuRmxvYXRUeXBlID0gZmxvYXRcXG5Cb29sZWFuVHlwZSA9IGJvb2xcXG50cnk6XFxuICAgIENvbXBsZXhUeXBlID0gY29tcGxleFxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5TdHJpbmdUeXBlID0gc3RyXFxuXFxuIyBTdHJpbmdUeXBlcyBpcyBhbHJlYWR5IG91dGRhdGVkLiAgSW5zdGVhZCBvZiB3cml0aW5nIFxcXCJ0eXBlKHgpIGluXFxuIyB0eXBlcy5TdHJpbmdUeXBlc1xcXCIsIHlvdSBzaG91bGQgdXNlIFxcXCJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpXFxcIi4gIEJ1dFxcbiMgd2Uga2VlcCBhcm91bmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yLlxcbnRyeTpcXG4gICAgVW5pY29kZVR5cGUgPSB1bmljb2RlXFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlKVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsKVxcblxcbkJ1ZmZlclR5cGUgPSBidWZmZXJcXG5cXG5UdXBsZVR5cGUgPSB0dXBsZVxcbkxpc3RUeXBlID0gbGlzdFxcbkRpY3RUeXBlID0gRGljdGlvbmFyeVR5cGUgPSBkaWN0XFxuXFxuZGVmIF9mKCk6IHBhc3NcXG5GdW5jdGlvblR5cGUgPSB0eXBlKF9mKVxcbkxhbWJkYVR5cGUgPSB0eXBlKGxhbWJkYTogTm9uZSkgICAgICAgICAjIFNhbWUgYXMgRnVuY3Rpb25UeXBlXFxuI0NvZGVUeXBlID0gdHlwZShfZi5mdW5jX2NvZGUpXFxuXFxuZGVmIF9nKCk6XFxuICAgIHlpZWxkIDFcXG5HZW5lcmF0b3JUeXBlID0gdHlwZShfZygpKVxcblxcbmNsYXNzIF9DOlxcbiAgICBkZWYgX20oc2VsZik6IHBhc3NcXG5DbGFzc1R5cGUgPSB0eXBlKF9DKVxcblVuYm91bmRNZXRob2RUeXBlID0gdHlwZShfQy5fbSkgICAgICAgICAjIFNhbWUgYXMgTWV0aG9kVHlwZVxcbl94ID0gX0MoKVxcbkluc3RhbmNlVHlwZSA9IHR5cGUoX3gpXFxuTWV0aG9kVHlwZSA9IHR5cGUoX3guX20pXFxuQnVpbHRpbkZ1bmN0aW9uVHlwZSA9IHR5cGUobGVuKVxcbkJ1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZVxcblxcbk1vZHVsZVR5cGUgPSB0eXBlKHN5cylcXG5GaWxlVHlwZSA9IGZpbGVcXG50cnk6XFxuICAgIFhSYW5nZVR5cGUgPSB4cmFuZ2VcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyB0cnk6XFxuIyAgICAgcmFpc2UgVHlwZUVycm9yXFxuIyBleGNlcHQgVHlwZUVycm9yOlxcbiMgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl1cXG4jICAgICBUcmFjZWJhY2tUeXBlID0gdHlwZSh0YilcXG4jICAgICBGcmFtZVR5cGUgPSB0eXBlKHRiLnRiX2ZyYW1lKVxcbiMgICAgIGRlbCB0YlxcblxcblNsaWNlVHlwZSA9IHNsaWNlXFxuIyBFbGxpcHNpc1R5cGUgPSB0eXBlKEVsbGlwc2lzKVxcblxcbiMgRGljdFByb3h5VHlwZSA9IHR5cGUoVHlwZVR5cGUuX19kaWN0X18pXFxuTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZClcXG5cXG4jIEZvciBKeXRob24sIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGFyZSBpZGVudGljYWxcXG4jIEdldFNldERlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19jb2RlKVxcbiMgTWVtYmVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2dsb2JhbHMpXFxuXFxuZGVsIHN5cywgX2YsIF9nLCBfQywgX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0XFxuX19hbGxfXyA9IGxpc3QobiBmb3IgbiBpbiBnbG9iYWxzKCkgaWYgbls6MV0gIT0gJ18nKVxcblwiLFwic3JjL2xpYi91bml0dGVzdC9fX2luaXRfXy5weVwiOlwiX19hdXRob3JfXyA9ICdibWlsbGVyJ1xcbicnJ1xcblRoaXMgaXMgdGhlIHN0YXJ0IG9mIHNvbWV0aGluZyB0aGF0IGJlaGF2ZXMgbGlrZVxcbnRoZSB1bml0dGVzdCBtb2R1bGUgZnJvbSBjcHl0aG9uLlxcblxcbicnJ1xcbmltcG9ydCByZVxcblxcbmNsYXNzIF9Bc3NlcnRSYWlzZXNDb250ZXh0KG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkEgY29udGV4dCBtYW5hZ2VyIHVzZWQgdG8gaW1wbGVtZW50IFRlc3RDYXNlLmFzc2VydFJhaXNlcyogbWV0aG9kcy5cXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkLCB0ZXN0X2Nhc2UpOlxcbiAgICAgICAgc2VsZi50ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VcXG4gICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZFxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lXFxuXFxuICAgIGRlZiBfaXNfc3VidHlwZShzZWxmLCBleHBlY3RlZCwgYmFzZXR5cGUpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOlxcbiAgICAgICAgICAgIHJldHVybiBhbGwoc2VsZi5faXNfc3VidHlwZShlLCBiYXNldHlwZSkgZm9yIGUgaW4gZXhwZWN0ZWQpXFxuICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShleHBlY3RlZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXhwZWN0ZWQsIGJhc2V0eXBlKVxcblxcbiAgICBkZWYgaGFuZGxlKHNlbGYsIGFyZ3MsIGt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIElmIGFyZ3MgaXMgZW1wdHksIGFzc2VydFJhaXNlcyBpcyBiZWluZyB1c2VkIGFzIGFcXG4gICAgICAgIGNvbnRleHQgbWFuYWdlciwgc28gcmV0dXJuIHNlbGYuXFxuICAgICAgICBJZiBhcmdzIGlzIG5vdCBlbXB0eSwgY2FsbCBhIGNhbGxhYmxlIHBhc3NpbmcgcG9zaXRpb25hbCBhbmQga2V5d29yZFxcbiAgICAgICAgYXJndW1lbnRzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX3N1YnR5cGUoc2VsZi5leHBlY3RlZCwgQmFzZUV4Y2VwdGlvbik6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXNzZXJ0UmFpc2VzKCkgYXJnIDEgbXVzdCBiZSBhbiBleGNlcHRpb24gdHlwZSBvciB0dXBsZSBvZiBleGNlcHRpb24gdHlwZXMnKVxcbiAgICAgICAgICAgIGlmIG5vdCBhcmdzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAgICAgICAgIGNhbGxhYmxlX29iaiA9IGFyZ3NbMF1cXG4gICAgICAgICAgICBhcmdzID0gYXJnc1sxOl1cXG4gICAgICAgICAgICB3aXRoIHNlbGY6XFxuICAgICAgICAgICAgICAgIGNhbGxhYmxlX29iaigqYXJncywgKiprd2FyZ3MpIFxcblxcbiAgICAgICAgZmluYWxseTpcXG4gICAgICAgICAgICAjIGJwby0yMzg5MDogbWFudWFsbHkgYnJlYWsgYSByZWZlcmVuY2UgY3ljbGVcXG4gICAgICAgICAgICBzZWxmID0gTm9uZVxcblxcbiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKTpcXG4gICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIGZlZWRiYWNrID0gXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjX3ZhbHVlXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IGV4Y190eXBlLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IHN0cihleGNfdHlwZSlcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBleHBfZXhjID0gc2VsZi5leHBlY3RlZC5fX25hbWVfX1xcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzdHIoc2VsZi5leHBlY3RlZClcXG5cXG4gICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJ7fSBub3QgcmFpc2VkXFxcIi5mb3JtYXQoZXhwX2V4YylcXG4gICAgICAgIGVsaWYgbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuZXhwZWN0ZWQpOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQge30gYnV0IGdvdCB7fVxcXCIuZm9ybWF0KGV4cF9leGMsIGFjdF9leGMpXFxuXFxuICAgICAgICBzZWxmLnRlc3RfY2FzZS5hcHBlbmRSZXN1bHQocmVzLCBhY3RfZXhjLCBleHBfZXhjLCBmZWVkYmFjaylcXG4gICAgICAgIHJldHVybiBUcnVlXFxuXFxuXFxuY2xhc3MgVGVzdENhc2Uob2JqZWN0KTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5udW1QYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLm51bUZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IDFcXG4gICAgICAgIHNlbGYudGxpc3QgPSBbXVxcbiAgICAgICAgdGVzdE5hbWVzID0ge31cXG4gICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKTpcXG4gICAgICAgICAgICBpZiBuYW1lWzo0XSA9PSAndGVzdCcgYW5kIG5hbWUgbm90IGluIHRlc3ROYW1lczpcXG4gICAgICAgICAgICAgICAgc2VsZi50bGlzdC5hcHBlbmQoZ2V0YXR0cihzZWxmLG5hbWUpKVxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZXNbbmFtZV09VHJ1ZVxcblxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiB0ZWFyRG93bihzZWxmKTpcXG4gICAgICAgIHBhc3NcXG4gICAgXFxuICAgIGRlZiBjbGVhbk5hbWUoc2VsZixmdW5jTmFtZSk6XFxuICAgICAgICByZXR1cm4gZnVuY05hbWUuX19mdW5jX18uX19uYW1lX19cXG5cXG4gICAgZGVmIG1haW4oc2VsZik6XFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zaXR5ID4gMTpcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ1J1bm5pbmcgJXMnICUgc2VsZi5jbGVhbk5hbWUoZnVuYykpXFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkID0gMFxcbiAgICAgICAgICAgICAgICBmdW5jKClcXG4gICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXNzZXJ0RmFpbGVkID09IDA6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgICAgICBwcmludCgnVGVzdHMgZmFpbGVkIGluICVzICcgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBwcmludCgnVGVzdCB0aHJldyBleGNlcHRpb24gaW4gJXMgKCVzKScgJSAoc2VsZi5jbGVhbk5hbWUoZnVuYyksIGUpKVxcbiAgICAgICAgc2VsZi5zaG93U3VtbWFyeSgpXFxuXFxuICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWw9PWV4cGVjdGVkXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsICxleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWwgIT0gZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYm9vbCh4KSBpcyBUcnVlXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBUcnVlXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIFRydWUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgYm9vbCh4KVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgRmFsc2VcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgRmFsc2UsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXMoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90KHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGlzIG5vdCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgTm9uZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBOb25lLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90Tm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgbm90IE5vbmVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SW4oc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIG5vdCBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgaW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBhbiBpbnN0YW5jZSBvZiAlc1xcXCIgJSAoc3RyKGEpLCBzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gbm90IGlzaW5zdGFuY2UoYSxiKVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFJlZ2V4KHNlbGYsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGYWlsIHRoZSB0ZXN0IHVubGVzcyB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogI2J5dGVzXFxuICAgICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX3JlZ2V4LCBcXFwiZXhwZWN0ZWRfcmVnZXggbXVzdCBub3QgYmUgZW1wdHkuXFxcIlxcbiAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleClcXG4gICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleC5zZWFyY2godGV4dCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJSZWdleCBkaWRuJ3QgbWF0Y2g6ICVyIG5vdCBmb3VuZCBpbiAlclxcXCIgJSAoXFxuICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRfcmVnZXgpLCB0ZXh0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgPSBUcnVlXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdFJlZ2V4KHNlbGYsIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgaWYgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZSh1bmV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogIyBieXRlc1xcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKHVuZXhwZWN0ZWRfcmVnZXgpXFxuICAgICAgICBtYXRjaCA9IHVuZXhwZWN0ZWRfcmVnZXguc2VhcmNoKHRleHQpXFxuICAgICAgICBpZiBtYXRjaDpcXG4gICAgICAgICAgICBmZWVkYmFjayA9ICdSZWdleCBtYXRjaGVkOiAlciBtYXRjaGVzICVyIGluICVyJyAlIChcXG4gICAgICAgICAgICAgICAgdGV4dFttYXRjaC5zdGFydCgpIDogbWF0Y2guZW5kKCldLFxcbiAgICAgICAgICAgICAgICByZXByKHVuZXhwZWN0ZWRfcmVnZXgpLFxcbiAgICAgICAgICAgICAgICB0ZXh0KVxcbiAgICAgICAgICAgICMgX2Zvcm1hdE1lc3NhZ2UgZW5zdXJlcyB0aGUgbG9uZ01lc3NhZ2Ugb3B0aW9uIGlzIHJlc3BlY3RlZFxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQobm90IGJvb2wobWF0Y2gpLCB0ZXh0LCB1bmV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBhYnMoYS1iKSA8PSBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSA9PSAwXFxuICAgICAgICBcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBub3QgKGEgPT0gYikgYW5kIGFicyhhIC0gYikgPiBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcblxcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSAhPSAwXFxuXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0R3JlYXRlcihzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGdyZWF0ZXIgdGhhbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPj0gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgPj0gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzcyhzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDwgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgbGVzcyB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydExlc3NFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA8PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA8PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZixyZXMsYWN0dWFsLGV4cGVjdGVkLGZlZWRiYWNrKTpcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBtc2cgPSAnUGFzcydcXG4gICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgIGZlZWRiYWNrXFxuICAgICAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG5cXG4gICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLCBleHBlY3RlZF9leGNlcHRpb24sICphcmdzLCAqKmt3YXJncyk6XFxuICAgICAgICBjb250ZXh0ID0gX0Fzc2VydFJhaXNlc0NvbnRleHQoZXhwZWN0ZWRfZXhjZXB0aW9uLCBzZWxmKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmhhbmRsZShhcmdzLCBrd2FyZ3MpXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIGNvbnRleHQgPSBOb25lXFxuXFxuICAgIGRlZiBmYWlsKHNlbGYsIG1zZz1Ob25lKTpcXG4gICAgICAgIGlmIG1zZyBpcyBOb25lOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsJ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbDogJyArIG1zZ1xcbiAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBzZWxmLm51bVBhc3NlZCAvIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHByaW50KFxcXCJSYW4gJWQgdGVzdHMsIHBhc3NlZDogJWQgZmFpbGVkOiAlZFxcXFxuXFxcIiAlIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkLCBzZWxmLm51bUZhaWxlZCkpXFxuXFxuXFxuXFxuZGVmIG1haW4odmVyYm9zaXR5PTEpOlxcbiAgICBnbG9iID0gZ2xvYmFscygpICMgZ2xvYmFscygpIHN0aWxsIG5lZWRzIHdvcmtcXG4gICAgZm9yIG5hbWUgaW4gZ2xvYjpcXG4gICAgICAgIGlmIHR5cGUoZ2xvYltuYW1lXSkgPT0gdHlwZSBhbmQgaXNzdWJjbGFzcyhnbG9iW25hbWVdLCBUZXN0Q2FzZSk6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICB0YyA9IGdsb2JbbmFtZV0oKVxcbiAgICAgICAgICAgICAgICB0Yy52ZXJib3NpdHkgPSB2ZXJib3NpdHlcXG4gICAgICAgICAgICAgICAgdGMubWFpbigpXFxuICAgICAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgICAgICBwcmludChcXFwiVW5jYXVnaHQgRXJyb3IgaW46IFxcXCIsIG5hbWUpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L2d1aS5weVwiOlwiaW1wb3J0IGRvY3VtZW50XFxuZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2VcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuZnJvbSB0aW1lIGltcG9ydCBzbGVlcFxcblxcblxcbmNsYXNzIFRlc3RDYXNlR3VpKFRlc3RDYXNlKTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgVGVzdENhc2UuX19pbml0X18oc2VsZilcXG4gICAgICAgIHNlbGYuY2xvc2VzdERpdiA9IGRvY3VtZW50LmN1cnJlbnREaXYoKVxcbiAgICAgICAgc2VsZi5kaXZpZCA9IGRvY3VtZW50LmN1cnJlbnRHcmFkaW5nQ29udGFpbmVyKClcXG4gICAgICAgIHNlbGYubXlkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkKVxcbiAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXYgdGhlbiBjcmVhdGUgYSBkdW1teSB0byBhdm9pZCBlcnJvcnMgd2hlbiBydW5uaW5nXFxuICAgICAgICAjIGdyYWRpbmcgXFxcIm9mZiBzY3JlZW5cXFwiXFxuICAgICAgICBpZiBzZWxmLm15ZGl2IGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuICAgICAgICAgICAgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJib2R5XFxcIilbMF1cXG4gICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKHNlbGYubXlkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICAgICAgcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IHJlc1xcbiAgICAgICAgICAgIHJlcy5pbm5lckhUTUwgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJpZFxcXCIsIHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJ1bml0dGVzdC1yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LmFwcGVuZENoaWxkKHNlbGYucmVzZGl2KVxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG4gICAgICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0YWJsZVxcXCIpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlID0gdFxcbiAgICAgICAgeCA9IHNlbGYucmVzZGl2LmNsb3Nlc3QoXFxcIi50aW1lZENvbXBvbmVudFxcXCIpXFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNUYWJsZSlcXG4gICAgICAgIGlmIHNlbGYuaXNfdGltZWQ6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0Q1NTKFxcXCJkaXNwbGF5XFxcIiwgXFxcIm5vbmVcXFwiKVxcblxcbiAgICAgICAgaGVhZGVycyA9IFtcXFwiUmVzdWx0XFxcIiwgXFxcIkFjdHVhbCBWYWx1ZVxcXCIsIFxcXCJFeHBlY3RlZCBWYWx1ZVxcXCIsIFxcXCJOb3Rlc1xcXCJdXFxuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0clxcXCIpXFxuICAgICAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOlxcbiAgICAgICAgICAgIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0aFxcXCIpXFxuICAgICAgICAgICAgaGVhZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGl0ZW1cXG4gICAgICAgICAgICBoZWFkLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKVxcbiAgICAgICAgc2VsZi5yZXNUYWJsZS5hcHBlbmRDaGlsZChyb3cpXFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KFxcXCJFcnJvclxcXCIsIE5vbmUsIE5vbmUsIHN0cihlKS5zcGxpdChcXFwib24gbGluZVxcXCIpWzBdKVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGdldE91dHB1dChzZWxmKTpcXG4gICAgICAgIHNsZWVwKDAuMilcXG4gICAgICAgICMgc2VsZi5kaXZpZCB3aWxsIGJlIHRoZSBncmFkaW5nV3JhcHBlciB3aGVuIGluIGdyYWRpbmcgbW9kZVxcbiAgICAgICAgaWYgc2VsZi5jbG9zZXN0RGl2ICE9IHNlbGYuZGl2aWQ6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXG4gICAgICAgICAgICAgICAgXFxcIiN7fSAje31fc3Rkb3V0XFxcIi5mb3JtYXQoc2VsZi5kaXZpZCwgc2VsZi5jbG9zZXN0RGl2KVxcbiAgICAgICAgICAgIClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfc3Rkb3V0XFxcIilcXG4gICAgICAgIHJldHVybiBvdXRwdXQuaW5uZXJUZXh0XFxuXFxuICAgIGRlZiBnZXRFZGl0b3JUZXh0KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEN1cnJlbnRFZGl0b3JWYWx1ZSgpXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZiwgcmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBwYXJhbSk6XFxuICAgICAgICB0cmltQWN0dWFsID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoYWN0dWFsKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltQWN0dWFsID0gVHJ1ZVxcbiAgICAgICAgICAgIGFjdHVhbFR5cGUgPSB0eXBlKGFjdHVhbClcXG4gICAgICAgIHRyaW1FeHBlY3RlZCA9IEZhbHNlXFxuICAgICAgICBpZiBsZW4oc3RyKGV4cGVjdGVkKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltRXhwZWN0ZWQgPSBUcnVlXFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gdHlwZShleHBlY3RlZClcXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGVyciA9IEZhbHNlXFxuICAgICAgICBpZiByZXMgPT0gXFxcIkVycm9yXFxcIjpcXG4gICAgICAgICAgICBlcnIgPSBUcnVlXFxuICAgICAgICAgICAgbXNnID0gXFxcIkVycm9yOiAlc1xcXCIgJSBwYXJhbVxcbiAgICAgICAgICAgIGVycm9yRGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLmlubmVySFRNTCA9IFxcXCJFUlJPUlxcXCJcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXJyb3JEYXRhKVxcbiAgICAgICAgZWxpZiByZXM6XFxuICAgICAgICAgICAgcGFzc2VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuaW5uZXJIVE1MID0gXFxcIlBhc3NcXFwiXFxuICAgICAgICAgICAgcGFzc2VkLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjODNkMzgyXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHBhc3NlZClcXG4gICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBmYWlsLmlubmVySFRNTCA9IFxcXCJGYWlsXFxcIlxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGZhaWwpXFxuICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcblxcbiAgICAgICAgYWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgYWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgaWYgdHJpbUFjdHVhbDpcXG4gICAgICAgICAgICBhY3RIVE1MID0gc3RyKGFjdHVhbClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoYWN0dWFsKVstNTpdXFxuICAgICAgICAgICAgaWYgYWN0dWFsVHlwZSA9PSBzdHI6XFxuICAgICAgICAgICAgICAgIGFjdEhUTUwgPSByZXByKGFjdEhUTUwpXFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IGFjdEhUTUxcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IHJlcHIoYWN0dWFsKVxcbiAgICAgICAgYWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGFjdClcXG5cXG4gICAgICAgIGV4cGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGV4cGVjdC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBlY3RlZEhUTUwgPSBzdHIoZXhwZWN0ZWQpWzo1XSArIFxcXCIuLi5cXFwiICsgc3RyKGV4cGVjdGVkKVstNTpdXFxuICAgICAgICAgICAgaWYgZXhwZWN0ZWRUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRIVE1MID0gcmVwcihleHBlY3RlZEhUTUwpXFxuICAgICAgICAgICAgZXhwZWN0LmlubmVySFRNTCA9IGV4cGVjdGVkSFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gcmVwcihleHBlY3RlZClcXG4gICAgICAgIGV4cGVjdC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBlY3QpXFxuICAgICAgICBpbnAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBpbnAuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuXFxuICAgICAgICBpZiBlcnI6XFxuICAgICAgICAgICAgaW5wLmlubmVySFRNTCA9IG1zZ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gcGFyYW1cXG4gICAgICAgIGlucC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnApXFxuXFxuICAgICAgICBpZiB0cmltQWN0dWFsIG9yIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBhbmRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5pbm5lckhUTUwgPSBcXFwiRXhwYW5kIERpZmZlcmVuY2VzXFxcIlxcbiAgICAgICAgICAgIGV4cGFuZG1zZyA9IFxcXCJBY3R1YWw6IFxcXCIgKyBzdHIoYWN0dWFsKSArIFxcXCJcXFxcbkV4cGVjdGVkOiBcXFwiICsgc3RyKGV4cGVjdGVkKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInZhbHVlXFxcIiwgZXhwYW5kbXNnKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInR5cGVcXFwiLCBcXFwiYnV0dG9uXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJvbmNsaWNrXFxcIiwgXFxcImFsZXJ0KHRoaXMudmFsdWUpXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJidG4gYnRuLWluZm9cXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBhbmRidXR0b24pXFxuXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgZGVmIHNob3dTdW1tYXJ5KHNlbGYpOlxcbiAgICAgICAgcGN0ID0gZmxvYXQoc2VsZi5udW1QYXNzZWQpIC8gKHNlbGYubnVtUGFzc2VkICsgc2VsZi5udW1GYWlsZWQpICogMTAwXFxuICAgICAgICBwY3Rjb3JyZWN0ID0gKFxcbiAgICAgICAgICAgIFxcXCJwZXJjZW50OlxcXCJcXG4gICAgICAgICAgICArIHN0cihwY3QpXFxuICAgICAgICAgICAgKyBcXFwiOnBhc3NlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1QYXNzZWQpXFxuICAgICAgICAgICAgKyBcXFwiOmZhaWxlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1GYWlsZWQpXFxuICAgICAgICApXFxuICAgICAgICBwVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwicFxcXCIpXFxuICAgICAgICBpZiBub3Qgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBwVGFnLmlubmVySFRNTCA9IFxcXCJZb3UgcGFzc2VkOiBcXFwiICsgc3RyKHBjdCkgKyBcXFwiJSBvZiB0aGUgdGVzdHNcXFwiXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQocFRhZylcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBqc2V2YWwoXFxcIndpbmRvdy5lZExpc3RbJ3t9J10ucGN0X2NvcnJlY3QgPSB7fVxcXCIuZm9ybWF0KHNlbGYuY2xvc2VzdERpdiwgcGN0KSlcXG4gICAgICAgICAgICBqc2V2YWwoXFxuICAgICAgICAgICAgICAgIFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnVuaXRfcmVzdWx0cyA9ICd7fSdcXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VzdERpdiwgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzX2RpdmlkID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBzZWxmLm15ZGl2LmdldEF0dHJpYnV0ZShcXFwiaWRcXFwiKVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblxcbiAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgIHByaW50KFxcbiAgICAgICAgICAgICAgICBcXFwiZmFpbGVkIHRvIGZpbmQgb2JqZWN0IHRvIHJlY29yZCB1bml0dGVzdCByZXN1bHRzISB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblwiLFwic3JjL2xpYi91cmxsaWIvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3JldHVybnt9fTtcIixcInNyYy9saWIvdXJsbGliL3JlcXVlc3QvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O2EuUmVzcG9uc2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5kYXRhJD1iLnJlc3BvbnNlVGV4dCxhLmxpbmVMaXN0PWEuZGF0YSQuc3BsaXQoXFxcIlxcXFxuXFxcIiksYS5saW5lTGlzdD1hLmxpbmVMaXN0LnNsaWNlKDAsLTEpO2Zvcih2YXIgYz0wO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWEubGluZUxpc3RbY10rPVxcXCJcXFxcblxcXCI7YS5jdXJyZW50TGluZT0wLGEucG9zJD0wfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShcXFwiPFJlc3BvbnNlPlxcXCIpfSksYi5fX2l0ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEubGluZUxpc3Q7cmV0dXJuIFNrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcihmdW5jdGlvbigpe3JldHVybiB0aGlzLiRpbmRleD49dGhpcy4kbGluZXMubGVuZ3RoP3ZvaWQgMDpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbGluZXNbdGhpcy4kaW5kZXgrK10pfSx7JG9iajphLCRpbmRleDowLCRsaW5lczpifSl9KSxiLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGVcXFwiKTt2YXIgYz1hLmRhdGEkLmxlbmd0aDt2b2lkIDA9PT1iJiYoYj1jKTt2YXIgZD1uZXcgU2suYnVpbHRpbi5zdHIoYS5kYXRhJC5zdWJzdHIoYS5wb3MkLGIpKTtyZXR1cm4gYS5wb3MkKz1iLGEucG9zJD49YyYmKGEucG9zJD1jKSxkfSksYi5yZWFkbGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJcXFwiO3JldHVybiBhLmN1cnJlbnRMaW5lPGEubGluZUxpc3QubGVuZ3RoJiYoYj1hLmxpbmVMaXN0W2EuY3VycmVudExpbmVdLGEuY3VycmVudExpbmUrKyksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSksYi5yZWFkbGluZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9LFxcXCJSZXNwb25zZVxcXCIsW10pO3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFTay5qc29ucFNpdGVzKXJldHVybiExO2ZvcihiPTA7YjxTay5qc29ucFNpdGVzLmxlbmd0aDtiKyspaWYoYS5zdGFydHNXaXRoKFNrLmpzb25wU2l0ZXNbYl0pKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gYS51cmxvcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxkKXt2YXIgZT1iKGMudik/bmV3IFByb21pc2UoZnVuY3Rpb24oYixkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJzY3JpcHRcXFwiKTtlLnNyYz1jLnYrXFxcIiZjYWxsYmFjaz1Tay5qc29ucGNhbGxiYWNrXFxcIixlLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKFxcXCJBbiBlcnJvciBvY2N1cmVkIGdldHRpbmcgdGhlIGRhdGFcXFwiKX0sU2suanNvbnBjYWxsYmFjaz1mdW5jdGlvbihjKXt2YXIgZD17cmVzcG9uc2VUZXh0OkpTT04uc3RyaW5naWZ5KGMpfTtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtkXSkpfTt0cnl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX1jYXRjaChhKXtjb25zb2xlLmxvZyhcXFwiY2F1Z2h0IGVycm9yIGluIHVybG9wZW5cXFwiK2EpfX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtlLmFkZEV2ZW50TGlzdGVuZXIoXFxcImxvYWRlbmRcXFwiLGZ1bmN0aW9uKCl7YihTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5SZXNwb25zZSxbZV0pKX0pLGQ/KGUub3BlbihcXFwiUE9TVFxcXCIsYy52KSxlLnNldFJlcXVlc3RIZWFkZXIoXFxcIkNvbnRlbnQtdHlwZVxcXCIsXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXCIpLGUuc2VuZChkLnYpKTooZS5vcGVuKFxcXCJHRVRcXFwiLGMudiksZS5zZW5kKG51bGwpKX0pO3ZhciBmPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBmLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiByZXNvbHV0aW9ufSxmLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6ZS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiByZXNvbHV0aW9uPWEsYX0sZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249XFxcIlxcXCIsYX0pfSxmfSksYX07XCIsXCJzcmMvbGliL3VybGxpYjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVybGxpYjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91cmxwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJscGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInV1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXVpZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXVpZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhcm5pbmdzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3YXJuaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhdmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWFrcmVmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWFrcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViYnJvd3Nlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb3Blbl90YWIoYSl7cmV0dXJuKFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInVybFxcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksIWIpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6KGE9YS4kanNzdHIoKSx3aW5kb3cub3BlbihhLFxcXCJfYmxhbmtcXFwiKSxTay5idWlsdGluLmJvb2wudHJ1ZSQpfXZhciBhPXt9LGI9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cmJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93Lm5hdmlnYXRvcjtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmJyb3dzZXJcXFwiKSxhLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoKzEsMSwzKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld190YWJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEuRGVmYXVsdEJyb3dzZXI9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uIGRmbGJyb3dzZXIoYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gX19pbml0X18oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5vcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3BlbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksb3Blbl90YWIoYil9KSxiLm9wZW5fbmV3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXcoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSl9LFxcXCJEZWZhdWx0QnJvd3NlclxcXCIsW10pLGEuZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLkRlZmF1bHRCcm93c2VyLFtdKX0pLGF9O1wiLFwic3JjL2xpYi93ZWJicm93c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWJicm93c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViZ2wvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmdsXFxcIil9LGM9ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIjx0YWJsZSBzdHlsZT1cXFxcXFxcImJhY2tncm91bmQtY29sb3I6ICM4Q0U7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxcXFxcXCI+PHRyPjx0ZCBhbGlnbj1cXFxcXFxcImNlbnRlclxcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJkaXNwbGF5OiB0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJcXFxcXFxcIj5cXFwiK2ErXFxcIjwvZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPlxcXCJ9LGQ9XFxcIlRoaXMgcGFnZSByZXF1aXJlcyBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgdG8gdXBncmFkZSB5b3VyIGJyb3dzZXIuPC9hPlxcXCIsZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W1xcXCJ3ZWJnbFxcXCIsXFxcImV4cGVyaW1lbnRhbC13ZWJnbFxcXCIsXFxcIndlYmtpdC0zZFxcXCIsXFxcIm1vei13ZWJnbFxcXCJdLGM9bnVsbCxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3RyeXtjPWEuZ2V0Q29udGV4dChiW2RdKX1jYXRjaChhKXt9aWYoYylicmVha31pZihjKXtmdW5jdGlvbiByZXR1cm5GYWxzZSgpe3JldHVybiExfWEub25zZWxlY3RzdGFydD1yZXR1cm5GYWxzZSxhLm9ubW91c2Vkb3duPXJldHVybkZhbHNlfXJldHVybiBjfSxmPWZ1bmN0aW9uKGEsZil7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZnx8KGY9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcXFwiY2FudmFzXFxcIilbMF0pLCFmKXJldHVybiB2b2lkKGcuaW5uZXJIVE1MPWMoZCkpO3ZhciBoPWUoZik7aWYoIWgpe3ZhciBpPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhcXFxcdytcXFxcLy4qPyApL2cpLGo9e307dHJ5e2Zvcih2YXIgaz0wO2s8aS5sZW5ndGg7KytrKXtmb3IodmFyIGw9aVtrXS5tYXRjaCgvKFxcXFx3KykvZyksbT1bXSxuPTE7bjxsLmxlbmd0aDsrK24pbS5wdXNoKHBhcnNlSW50KGxbbl0pKTtqW2xbMF1dPW19fWNhdGNoKGEpe31nLmlubmVySFRNTD1qLkNocm9tZSYmKDc8ai5DaHJvbWVbMF18fDc9PWouQ2hyb21lWzBdJiYwPGouQ2hyb21lWzFdfHw3PT1qLkNocm9tZVswXSYmMD09ai5DaHJvbWVbMV0mJjUyMTw9ai5DaHJvbWVbMl0pP2MoXFxcIkl0IGRvZXNuJ3QgYXBwZWFyIHlvdXIgY29tcHV0ZXIgY2FuIHN1cHBvcnQgV2ViR0wuPGJyLz48YSBocmVmPVxcXFxcXFwiaHR0cDovL2dldC53ZWJnbC5vcmdcXFxcXFxcIj5DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvYT5cXFwiKTpjKGQpfXJldHVybiBofTtyZXR1cm4gYS5Db250ZXh0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIudiksZD1mKGIudixjKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoXFxcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBXZWJHTC5cXFwiKTtmb3IodmFyIGUgaW4gYS5nbD1kLGQuX19wcm90b19fKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxkLl9fcHJvdG9fX1tlXSk7ZWxzZSBpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pc3dpdGNoKGUpe2Nhc2VcXFwiYnVmZmVyRGF0YVxcXCI6YnJlYWs7Y2FzZVxcXCJjbGVhckNvbG9yXFxcIjpicmVhaztjYXNlXFxcImRyYXdBcnJheXNcXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0QXR0cmliTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0VW5pZm9ybUxvY2F0aW9uXFxcIjpicmVhaztjYXNlXFxcInNoYWRlclNvdXJjZVxcXCI6YnJlYWs7Y2FzZVxcXCJ1bmlmb3JtTWF0cml4NGZ2XFxcIjpicmVhaztjYXNlXFxcInZlcnRleEF0dHJpYlBvaW50ZXJcXFwiOmJyZWFrO2Nhc2VcXFwidmlld3BvcnRcXFwiOmJyZWFrO2RlZmF1bHQ6KGZ1bmN0aW9uKGIpe1NrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoZSksbmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPWQuX19wcm90b19fW2JdO3JldHVybiBhLmFwcGx5KGQsYXJndW1lbnRzKX0pKX0pKGUpO31kLmNsZWFyQ29sb3IoMTAwLzI1NSwxNDkvMjU1LDIzNy8yNTUsMSksZC5jbGVhcihkLkNPTE9SX0JVRkZFUl9CSVQpfSksYi50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixiLmJ1ZmZlckRhdGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmJ1ZmZlckRhdGEoYixjLnYsZCl9KSxiLmNsZWFyQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wuY2xlYXJDb2xvcihTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxTay5idWlsdGluLmFzbnVtJChlKSl9KSxiLmdldEF0dHJpYkxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldEF0dHJpYkxvY2F0aW9uKGIsYy52KX0pLGIuZ2V0VW5pZm9ybUxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihiLGMudil9KSxiLnNoYWRlclNvdXJjZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLmdsLnNoYWRlclNvdXJjZShiLGMudil9KSxiLmRyYXdBcnJheXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmRyYXdBcnJheXMoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCkpfSksYi52ZXJ0ZXhBdHRyaWJQb2ludGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YS5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGIsU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksZSxTay5idWlsdGluLmFzbnVtJChmKSxTay5idWlsdGluLmFzbnVtJChnKSl9KSxiLnZpZXdwb3J0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXthLmdsLnZpZXdwb3J0KFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIudW5pZm9ybU1hdHJpeDRmdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wudW5pZm9ybU1hdHJpeDRmdihTay5idWlsdGluLmFzbnVtJChiKSxjLGQudil9KSxiLnNldERyYXdGdW5jPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgRGF0ZSgpLmdldFRpbWUoKSxkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbmV3IERhdGUoKS5nZXRUaW1lKCktY10pfSwxZTMvNjApfSl9LFxcXCJDb250ZXh0XFxcIixbXSksYS5GbG9hdDMyQXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PVxcXCJudW1iZXJcXFwiPT10eXBlb2YgYj9uZXcgRmxvYXQzMkFycmF5KGIpOm5ldyBGbG9hdDMyQXJyYXkoU2suZmZpLnJlbWFwVG9KcyhiKSl9KSxiLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEudi5sZW5ndGg7KytjKWIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltcXFwiK2Iuam9pbihcXFwiLCBcXFwiKStcXFwiXVxcXCIpfSl9LFxcXCJGbG9hdDMyQXJyYXlcXFwiLFtdKSxhLk1hdHJpeDR4ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7YlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xfSksYi5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGg9TWF0aC50YW4saT1NYXRoLlBJLGo9aCguNSppLS41KihTay5idWlsdGluLmFzbnVtJChjKSppLzE4MCkpLGw9U2suYnVpbHRpbi5hc251bSQoZCksYT1Tay5idWlsdGluLmFzbnVtJChlKSxuPVNrLmJ1aWx0aW4uYXNudW0kKGcpLGY9MS8oYS1uKSxrPWIudjtrWzBdPWovbCxrWzFdPTAsa1syXT0wLGtbM109MCxrWzRdPTAsa1s1XT1qLGtbNl09MCxrWzddPTAsa1s4XT0wLGtbOV09MCxrWzEwXT0oYStuKSpmLGtbMTFdPS0xLGtbMTJdPTAsa1sxM109MCxrWzE0XT0yKihhKm4qZiksa1sxNV09MH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZD1Tay5mZmkucmVtYXBUb0pzKGIpO2NbMF09MSxjWzFdPTAsY1syXT0wLGNbM109MCxjWzRdPTAsY1s1XT0xLGNbNl09MCxjWzddPTAsY1s4XT0wLGNbOV09MCxjWzEwXT0xLGNbMTFdPTAsY1sxMl09ZFswXSxjWzEzXT1kWzFdLGNbMTRdPWRbMl0sY1sxNV09MX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIk1hdHJpeDR4NFxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi93ZWJnbC9tYXRoLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5NYXQ0ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXt2YXIgZD1NYXRoLnNxcnQ7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLmxvYWRJZGVudGl0eSxbYV0pLGEuc3RhY2s9W119KSxjLnB1c2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnN0YWNrLnB1c2goYS5lbGVtZW50cy5zbGljZSgwKSl9KSxjLnBvcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9YS5zdGFjay5wb3AoKX0pLGMubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19KSxjLnRyYW5zZm9ybTM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3ZhciBkPWIuZWxlbWVudHM7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2RbMF0qYy54K2RbNF0qYy55K2RbOF0qYy56LGRbMV0qYy54K2RbNV0qYy55K2RbOV0qYy56LGRbMl0qYy54K2RbNl0qYy55K2RbMTBdKmMuel0pfSksYy5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzBdKj1iLGEuZWxlbWVudHNbMV0qPWIsYS5lbGVtZW50c1syXSo9YixhLmVsZW1lbnRzWzNdKj1iLGEuZWxlbWVudHNbNF0qPWMsYS5lbGVtZW50c1s1XSo9YyxhLmVsZW1lbnRzWzZdKj1jLGEuZWxlbWVudHNbN10qPWMsYS5lbGVtZW50c1s4XSo9ZCxhLmVsZW1lbnRzWzldKj1kLGEuZWxlbWVudHNbMTBdKj1kLGEuZWxlbWVudHNbMTFdKj1kLGF9KSxjLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzEyXSs9YS5lbGVtZW50c1swXSpiK2EuZWxlbWVudHNbNF0qYythLmVsZW1lbnRzWzhdKmQsYS5lbGVtZW50c1sxM10rPWEuZWxlbWVudHNbMV0qYithLmVsZW1lbnRzWzVdKmMrYS5lbGVtZW50c1s5XSpkLGEuZWxlbWVudHNbMTRdKz1hLmVsZW1lbnRzWzJdKmIrYS5lbGVtZW50c1s2XSpjK2EuZWxlbWVudHNbMTBdKmQsYS5lbGVtZW50c1sxNV0rPWEuZWxlbWVudHNbM10qYithLmVsZW1lbnRzWzddKmMrYS5lbGVtZW50c1sxMV0qZCxhfSksYy5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcpe3ZhciBoPU1hdGguY29zLGk9TWF0aC5zaW4saj1NYXRoLlBJLGs9ZChlKmUrZipmK2cqZyksbD1pKGMqai8xODApLG09aChjKmovMTgwKTtpZigwPGspe3ZhciBuLG8scCxxLHIscyx0LHUsdix3LEE7ZS89ayxmLz1rLGcvPWssbj1lKmUsbz1mKmYscD1nKmcscT1lKmYscj1mKmcscz1nKmUsdD1lKmwsdT1mKmwsdj1nKmwsdz0xLW0sQT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksQS5lbGVtZW50c1swXT13Km4rbSxBLmVsZW1lbnRzWzFdPXcqcS12LEEuZWxlbWVudHNbMl09dypzK3UsQS5lbGVtZW50c1szXT0wLEEuZWxlbWVudHNbNF09dypxK3YsQS5lbGVtZW50c1s1XT13Km8rbSxBLmVsZW1lbnRzWzZdPXcqci10LEEuZWxlbWVudHNbN109MCxBLmVsZW1lbnRzWzhdPXcqcy11LEEuZWxlbWVudHNbOV09dypyK3QsQS5lbGVtZW50c1sxMF09dypwK20sQS5lbGVtZW50c1sxMV09MCxBLmVsZW1lbnRzWzEyXT0wLEEuZWxlbWVudHNbMTNdPTAsQS5lbGVtZW50c1sxNF09MCxBLmVsZW1lbnRzWzE1XT0xLEE9QS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPUEuZWxlbWVudHN9cmV0dXJuIGJ9KSxjLm11bHRpcGx5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpLGU9MDs0PmU7ZSsrKWQuZWxlbWVudHNbNCplKzBdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMF0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s0XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzhdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTJdLGQuZWxlbWVudHNbNCplKzFdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMV0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s1XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzldK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTNdLGQuZWxlbWVudHNbNCplKzJdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMl0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s2XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzEwXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE0XSxkLmVsZW1lbnRzWzQqZSszXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzNdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbN10rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1sxMV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxNV07cmV0dXJuIGIuZWxlbWVudHM9ZC5lbGVtZW50cyxifSksYy5sb29rQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcsaCxpLGosayxsKXt2YXIgbT1bYy1nLGUtaCxmLWldLG49ZChtWzBdKm1bMF0rbVsxXSptWzFdK21bMl0qbVsyXSk7biYmKG1bMF0vPW4sbVsxXS89bixtWzJdLz1uKTt2YXIgbz1baixrLGxdLHA9W107cFswXT1vWzFdKm1bMl0tb1syXSptWzFdLHBbMV09LW9bMF0qbVsyXStvWzJdKm1bMF0scFsyXT1vWzBdKm1bMV0tb1sxXSptWzBdLG9bMF09bVsxXSpwWzJdLW1bMl0qcFsxXSxvWzFdPS1tWzBdKnBbMl0rbVsyXSpwWzBdLG9bMl09bVswXSpwWzFdLW1bMV0qcFswXSxuPWQocFswXSpwWzBdK3BbMV0qcFsxXStwWzJdKnBbMl0pLG4mJihwWzBdLz1uLHBbMV0vPW4scFsyXS89biksbj1kKG9bMF0qb1swXStvWzFdKm9bMV0rb1syXSpvWzJdKSxuJiYob1swXS89bixvWzFdLz1uLG9bMl0vPW4pO3ZhciBxPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KTtyZXR1cm4gcS5lbGVtZW50c1swXT1wWzBdLHEuZWxlbWVudHNbNF09cFsxXSxxLmVsZW1lbnRzWzhdPXBbMl0scS5lbGVtZW50c1sxMl09MCxxLmVsZW1lbnRzWzFdPW9bMF0scS5lbGVtZW50c1s1XT1vWzFdLHEuZWxlbWVudHNbOV09b1syXSxxLmVsZW1lbnRzWzEzXT0wLHEuZWxlbWVudHNbMl09bVswXSxxLmVsZW1lbnRzWzZdPW1bMV0scS5lbGVtZW50c1sxMF09bVsyXSxxLmVsZW1lbnRzWzE0XT0wLHEuZWxlbWVudHNbM109MCxxLmVsZW1lbnRzWzddPTAscS5lbGVtZW50c1sxMV09MCxxLmVsZW1lbnRzWzE1XT0xLHE9cS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPXEuZWxlbWVudHMsYi50cmFuc2xhdGUoLWMsLWUsLWYpLGJ9KX0sXFxcIk1hdDQ0XFxcIixbXSksYS5NYXQzMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIubG9hZElkZW50aXR5LFthXSl9KSxiLmxvYWRJZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXX0pfSxcXFwiTWF0MzNcXFwiLFtdKSxhLlZlYzM9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGIsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EueD1iLGEueT1jLGEuej1kfSksYy5fX3N1Yl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbYi54LWMueCxiLnktYy55LGIuei1jLnpdKX0pfSxcXFwiVmVjM1xcXCIsW10pLGEuY3Jvc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5hc3NlcnRzLmFzc2VydChiIGluc3RhbmNlb2YgYS5WZWMzJiZjIGluc3RhbmNlb2YgYS5WZWMzKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLnkqYy56LWIueipjLnksYi56KmMueC1iLngqYy56LGIueCpjLnktYi55KmMueF0pfSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdHJpeDQuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGguUEksYj17fSxjPW5ldyBGbG9hdDMyQXJyYXkoMyksZD1uZXcgRmxvYXQzMkFycmF5KDMpLGU9bmV3IEZsb2F0MzJBcnJheSgzKSxmPW5ldyBGbG9hdDMyQXJyYXkoNCksZz1uZXcgRmxvYXQzMkFycmF5KDQpLGg9bmV3IEZsb2F0MzJBcnJheSg0KSxpPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGo9bmV3IEZsb2F0MzJBcnJheSgxNiksaz1uZXcgRmxvYXQzMkFycmF5KDE2KSxsPWZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPU1hdGguc3FydCxkPTAsZT1jLmxlbmd0aCxmPTA7ZjxlOysrZilkKz1jW2ZdKmNbZl07aWYoZD1hKGQpLDFlLTU8ZClmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09Y1tmXS9kO2Vsc2UgZm9yKHZhciBmPTA7ZjxlOysrZiliW2ZdPTA7cmV0dXJuIGJ9LG09ZnVuY3Rpb24oYyxkLGEpe3JldHVybiBjWzBdPWRbMV0qYVsyXS1kWzJdKmFbMV0sY1sxXT1kWzJdKmFbMF0tZFswXSphWzJdLGNbMl09ZFswXSphWzFdLWRbMV0qYVswXSxjfSxuPWZ1bmN0aW9uKGMsZCxhKXtmb3IodmFyIGI9ZC5sZW5ndGgsZT0wO2U8YjsrK2UpY1tlXT1kW2VdLWFbZV07cmV0dXJuIGN9LG89ZnVuY3Rpb24oYyxhKXtyZXR1cm4gY1swXSphWzBdK2NbMV0qYVsxXStjWzJdKmFbMl19O3JldHVybiBiLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixmLGcpe3ZhciBoPWMsaT1kLGo9bChoLG4oaCxiLnYsZi52KSksaz1sKGksbShpLGcudixqKSkscD1tKGUsaixrKSxxPWEudjtyZXR1cm4gcVswXT1rWzBdLHFbMV09cFswXSxxWzJdPWpbMF0scVszXT0wLHFbNF09a1sxXSxxWzVdPXBbMV0scVs2XT1qWzFdLHFbN109MCxxWzhdPWtbMl0scVs5XT1wWzJdLHFbMTBdPWpbMl0scVsxMV09MCxxWzEyXT0tbyhrLGIudikscVsxM109LW8ocCxiLnYpLHFbMTRdPS1vKGosYi52KSxxWzE1XT0xLGF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPWgoLjUqYS0uNSooYyphLzE4MCkpLGY9MS8oZS1nKSxqPWIudjtyZXR1cm4galswXT1pL2QsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0wLGpbNV09aSxqWzZdPTAsals3XT0wLGpbOF09MCxqWzldPTAsalsxMF09KGUrZykqZixqWzExXT0tMSxqWzEyXT0wLGpbMTNdPTAsalsxNF09MiooZSpnKmYpLGpbMTVdPTAsYn0pLGIucm90YXRpb25ZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixkKXt2YXIgZT1NYXRoLnNpbixmPU1hdGguY29zLGc9Yi52LGg9ZihkKmEvMTgwKSxjPWUoZCphLzE4MCk7cmV0dXJuIGdbMF09aCxnWzFdPTAsZ1syXT0tYyxnWzNdPTAsZ1s0XT0wLGdbNV09MSxnWzZdPTAsZ1s3XT0wLGdbOF09YyxnWzldPTAsZ1sxMF09aCxnWzExXT0wLGdbMTJdPTAsZ1sxM109MCxnWzE0XT0wLGdbMTVdPTEsYn0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7cmV0dXJuIGJbMF09MSxiWzFdPTAsYlsyXT0wLGJbM109MCxiWzRdPTAsYls1XT0xLGJbNl09MCxiWzddPTAsYls4XT0wLGJbOV09MCxiWzEwXT0xLGJbMTFdPTAsYlsxMl09MCxiWzEzXT0wLGJbMTRdPTAsYlsxNV09MSxhfSksYi5tdWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQsZSl7dmFyIGY9Yy52LGc9ZC52LGE9ZS52LGI9Z1swXSxoPWdbMV0saT1nWzJdLGo9Z1szXSxrPWdbNF0sbD1nWzVdLG09Z1s2XSxuPWdbN10sbz1nWzhdLHA9Z1s5XSxxPWdbMTBdLHI9Z1sxMV0scz1nWzEyXSx0PWdbMTNdLHU9Z1sxNF0sdj1nWzE1XSx3PWFbMF0seD1hWzFdLHk9YVsyXSx6PWFbM10sQT1hWzRdLEI9YVs1XSxDPWFbNl0sRD1hWzddLEU9YVs4XSxGPWFbOV0sRz1hWzEwXSxIPWFbMTFdLEk9YVsxMl0sSj1hWzEzXSxLPWFbMTRdLEw9YVsxNV07cmV0dXJuIGZbMF09Yip3K2gqQStpKkUraipJLGZbMV09Yip4K2gqQitpKkYraipKLGZbMl09Yip5K2gqQytpKkcraipLLGZbM109Yip6K2gqRCtpKkgraipMLGZbNF09ayp3K2wqQSttKkUrbipJLGZbNV09ayp4K2wqQittKkYrbipKLGZbNl09ayp5K2wqQyttKkcrbipLLGZbN109ayp6K2wqRCttKkgrbipMLGZbOF09byp3K3AqQStxKkUrcipJLGZbOV09byp4K3AqQitxKkYrcipKLGZbMTBdPW8qeStwKkMrcSpHK3IqSyxmWzExXT1vKnorcCpEK3EqSCtyKkwsZlsxMl09cyp3K3QqQSt1KkUrdipJLGZbMTNdPXMqeCt0KkIrdSpGK3YqSixmWzE0XT1zKnkrdCpDK3UqRyt2KkssZlsxNV09cyp6K3QqRCt1KkgrdipMLGN9KSxiLmludmVydD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LGU9Yi52LGY9ZVswXSxnPWVbMV0saD1lWzJdLGk9ZVszXSxqPWVbNF0saz1lWzVdLGw9ZVs2XSxtPWVbN10sbj1lWzhdLG89ZVs5XSxwPWVbMTBdLHE9ZVsxMV0scj1lWzEyXSxzPWVbMTNdLHQ9ZVsxNF0sdT1lWzE1XSx2PXAqdSx3PXQqcSx4PWwqdSx5PXQqbSx6PWwqcSxBPXAqbSxCPWgqdSxDPXQqaSxEPWgqcSxFPXAqaSxGPWgqbSxHPWwqaSxIPW4qcyxJPXIqbyxKPWoqcyxLPXIqayxMPWoqbyxNPW4qayxOPWYqcyxPPXIqZyxQPWYqbyxRPW4qZyxSPWYqayxTPWoqZyxUPXYqayt5Km8reipzLSh3KmsreCpvK0EqcyksVT13KmcrQipvK0Uqcy0odipnK0MqbytEKnMpLFY9eCpnK0MqaytGKnMtKHkqZytCKmsrRypzKSxXPUEqZytEKmsrRypvLSh6KmcrRSprK0YqbyksWD0xLyhmKlQraipVK24qVityKlcpO3JldHVybiBjWzBdPVgqVCxjWzFdPVgqVSxjWzJdPVgqVixjWzNdPVgqVyxjWzRdPVgqKHcqait4Km4rQSpyLSh2KmoreSpuK3oqcikpLGNbNV09WCoodipmK0MqbitEKnItKHcqZitCKm4rRSpyKSksY1s2XT1YKih5KmYrQipqK0cqci0oeCpmK0MqaitGKnIpKSxjWzddPVgqKHoqZitFKmorRipuLShBKmYrRCpqK0cqbikpLGNbOF09WCooSCptK0sqcStMKnUtKEkqbStKKnErTSp1KSksY1s5XT1YKihJKmkrTipxK1EqdS0oSCppK08qcStQKnUpKSxjWzEwXT1YKihKKmkrTyptK1IqdS0oSyppK04qbStTKnUpKSxjWzExXT1YKihNKmkrUCptK1MqcS0oTCppK1EqbStSKnEpKSxjWzEyXT1YKihKKnArTSp0K0kqbC0oTCp0K0gqbCtLKnApKSxjWzEzXT1YKihQKnQrSCpoK08qcC0oTipwK1EqdCtJKmgpKSxjWzE0XT1YKihOKmwrUyp0K0sqaC0oUip0K0oqaCtPKmwpKSxjWzE1XT1YKihSKnArTCpoK1EqbC0oUCpsK1MqcCtNKmgpKSxhfSksYi50cmFuc3Bvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLnYsZD1iLnYsZT0wOzQ+ZTsrK2UpZm9yKHZhciBmPTA7ND5mOysrZiljWzQqZStmXT1kWzQqZitlXTtyZXR1cm4gY30pLGJ9O1wiLFwic3JjL2xpYi93ZWJnbC9tb2RlbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYz17fSxkPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y3x8Z2wuQVJSQVlfQlVGRkVSLGU9Z2wuY3JlYXRlQnVmZmVyKCk7aWYodGhpcy50YXJnZXQ9ZCx0aGlzLmJ1Zj1lLHRoaXMuc2V0KGEpLHRoaXMubnVtQ29tcG9uZW50c189YS5udW1Db21wb25lbnRzLHRoaXMubnVtRWxlbWVudHNfPWEubnVtRWxlbWVudHMsdGhpcy50b3RhbENvbXBvbmVudHNfPXRoaXMubnVtQ29tcG9uZW50c18qdGhpcy5udW1FbGVtZW50c18sYS5idWZmZXIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpdGhpcy50eXBlXz1nbC5GTE9BVDtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDhBcnJheSl0aGlzLnR5cGVfPWdsLl9CWVRFO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBJbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuU0hPUlQ7ZWxzZSB0aHJvd1xcXCJ1bmhhbmRsZWQgdHlwZTpcXFwiK3R5cGVvZiBhLmJ1ZmZlcn07cmV0dXJuIGQucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXtnbC5iaW5kQnVmZmVyKHRoaXMudGFyZ2V0LHRoaXMuYnVmKSxnbC5idWZmZXJEYXRhKHRoaXMudGFyZ2V0LGEuYnVmZmVyLGdsLlNUQVRJQ19EUkFXKX0sZC5wcm90b3R5cGUudHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGVffSxkLnByb3RvdHlwZS5udW1Db21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ29tcG9uZW50c199LGQucHJvdG90eXBlLm51bUVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtRWxlbWVudHNffSxkLnByb3RvdHlwZS50b3RhbENvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbENvbXBvbmVudHNffSxkLnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZ9LGQucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxkLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYy5Nb2RlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGMsZnVuY3Rpb24oYyxlKXtlLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxlLGYsZyl7Yy5idWZmZXJzPXt9O3ZhciBoPWZ1bmN0aW9uKGEsZSl7dmFyIGY9XFxcImluZGljZXNcXFwiPT1hP2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSOmdsLkFSUkFZX0JVRkZFUjtiPWMuYnVmZmVyc1thXSxiP2Iuc2V0KGUpOmI9bmV3IGQoZSxmKSxjLmJ1ZmZlcnNbYV09Yn07Zm9yKGEgaW4gZiloKGEsZlthXSk7dmFyIGk9e30saj0wO2Zvcih2YXIgayBpbiBnKWlba109aisrO2MubW9kZT1nbC5UUklBTkdMRVMsYy50ZXh0dXJlcz1nLnYsYy50ZXh0dXJlVW5pdHM9aSxjLnNoYWRlcj1lfSksZS5kcmF3UHJlcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5zaGFkZXIsZT1hLmJ1ZmZlcnMsZj1hLnRleHR1cmVzO2Zvcih2YXIgZyBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQudXNlLFtkXSksZSl7dmFyIGg9ZVtnXTtpZihcXFwiaW5kaWNlc1xcXCI9PWcpZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixoLmJ1ZmZlcigpKTtlbHNle3ZhciBpPWQuYXR0cmliW2ddO2kmJmkoaCl9fWZvcih2YXIgaiBpbiBmKXt2YXIgaz1hLnRleHR1cmVVbml0c1tqXTtkLnNldFVuaWZvcm0kaW1wbChkLHRleHR1ZXIsayksZltqXS5iaW5kVG9Vbml0KGspfWZvcih2YXIgbCBpbiBjKWQuc2V0VW5pZm9ybSRpbXBsKGQsbCxjW2xdKX0pLGUuZHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNoYWRlcjtmb3IodW5pZm9ybSBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksYyllLnNldFVuaWZvcm0kaW1wbChlLHVuaWZvcm0sY1t1bmlmb3JtXSk7aWYoZClmb3IodmFyIGYgaW4gZCl7dmFyIGc9YS50ZXh0dXJlVW5pdHNbZl07ZS5zZXRVbmlmb3JtJGltcGwoZSxmLGcpLGRbZl0uYmluZFRvVW5pdChnKX12YXIgaD1hLmJ1ZmZlcnM7Z2wuZHJhd0VsZW1lbnRzKGEubW9kZSxoLmluZGljZXMudG90YWxDb21wb25lbnRzKCksZ2wuVU5TSUdORURfU0hPUlQsMCl9KX0sXFxcIk1vZGVsXFxcIixbXSksY307XCIsXCJzcmMvbGliL3dlYmdsL3ByaW1pdGl2ZXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8XFxcIkZsb2F0MzJBcnJheVxcXCI7dmFyIGQ9d2luZG93W2NdO2IubGVuZ3RoPyh0aGlzLmJ1ZmZlcj1uZXcgZChiKSxiPXRoaXMuYnVmZmVyLmxlbmd0aC9hLHRoaXMuY3Vyc29yPWIpOih0aGlzLmJ1ZmZlcj1uZXcgZChhKmIpLHRoaXMuY3Vyc29yPTApLHRoaXMubnVtQ29tcG9uZW50cz1hLHRoaXMubnVtRWxlbWVudHM9Yix0aGlzLnR5cGU9Y307cmV0dXJuIGIucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYi5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YSp0aGlzLm51bUNvbXBvbmVudHMsYz1bXSxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKWMucHVzaCh0aGlzLmJ1ZmZlcltiK2RdKTtyZXR1cm4gY30sYi5wcm90b3R5cGUuc2V0RWxlbWVudD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hKnRoaXMubnVtQ29tcG9uZW50cyxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKXRoaXMuYnVmZmVyW2MrZF09YltkXX0sYi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgYih0aGlzLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50cyx0aGlzLnR5cGUpO3JldHVybiBhLnB1c2hBcnJheSh0aGlzKSxhfSxiLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXMuc2V0RWxlbWVudCh0aGlzLmN1cnNvcisrLGEpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLm51bUVsZW1lbnRzOysrYil0aGlzLnB1c2goYS5nZXRFbGVtZW50KGIpKX0sYi5wcm90b3R5cGUucHVzaEFycmF5V2l0aE9mZnNldD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTA7ZDxhLm51bUVsZW1lbnRzOysrZCl7Yz1hLmdldEVsZW1lbnQoZCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDsrK2UpY1tlXSs9YltlXTt0aGlzLnB1c2goYyl9fSxiLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgYT1NYXRoLm1heCxiPU1hdGgubWluLGMsZD10aGlzLm51bUVsZW1lbnRzLGU9dGhpcy5udW1Db21wb25lbnRzLGY9dGhpcy5nZXRFbGVtZW50KDApLGc9dGhpcy5nZXRFbGVtZW50KDApLGg9MTtoPGQ7KytoKXtjPXRoaXMuZ2V0RWxlbWVudChoKTtmb3IodmFyIGk9MDtpPGU7KytpKWZbaV09YihmW2ldLGNbaV0pLGdbaV09YShnW2ldLGNbaV0pfXJldHVybnttaW46ZixtYXg6Z319LGEuY3JlYXRlQ3ViZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtbMyw3LDUsMV0sWzAsNCw2LDJdLFs2LDcsMywyXSxbMCwxLDUsNF0sWzUsNyw2LDRdLFsyLDMsMSwwXV0sZT1hLzIsZz1bWy1lLC1lLC1lXSxbK2UsLWUsLWVdLFstZSwrZSwtZV0sWytlLCtlLC1lXSxbLWUsLWUsK2VdLFsrZSwtZSwrZV0sWy1lLCtlLCtlXSxbK2UsK2UsK2VdXSxoPVtbMSwwLDBdLFstMSwwLDBdLFswLDEsMF0sWzAsLTEsMF0sWzAsMCwxXSxbMCwwLC0xXV0saT1bWzAsMF0sWzEsMF0sWzEsMV0sWzAsMV1dLGo9MjQsaz1uZXcgYigzLGopLGw9bmV3IGIoMyxqKSxtPW5ldyBiKDIsaiksbj1uZXcgYigzLDEyLFxcXCJVaW50MTZBcnJheVxcXCIpLG89MDs2Pm87KytvKXtjPWRbb107Zm9yKHZhciBwPTA7ND5wOysrcCl7dmFyIHE9Z1tjW3BdXSxyPWhbb10scz1pW3BdO2sucHVzaChxKSxsLnB1c2gociksbS5wdXNoKHMpfXZhciB0PTQqbztuLnB1c2goW3QrMCx0KzEsdCsyXSksbi5wdXNoKFt0KzAsdCsyLHQrM10pfXJldHVybntwb3NpdGlvbjprLG5vcm1hbDpsLHRleENvb3JkOm0saW5kaWNlczpufX0pLGF9O1wiLFwic3JjL2xpYi93aGljaGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3aGljaGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd3NnaXJlZi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid3NnaXJlZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3hkcmxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieGRybGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZG9tL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkb20gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZXRyZWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImV0cmVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL3BhcnNlcnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBhcnNlcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvc2F4L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzYXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbHJwY2xpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1scnBjbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvemlwZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiemlwZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCJ9fSIsIihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0Jzt2YXIgJGpzY29tcD0kanNjb21wfHx7fTskanNjb21wLnNjb3BlPXt9OyRqc2NvbXAuQVNTVU1FX0VTNT0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfTUFQPSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9TRVQ9ITE7JGpzY29tcC5TSU1QTEVfRlJPVU5EX1BPTFlGSUxMPSExOyRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24obSxxLGEpe20hPUFycmF5LnByb3RvdHlwZSYmbSE9T2JqZWN0LnByb3RvdHlwZSYmKG1bcV09YS52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKG0pe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PW0/bTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOm19OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpO1xuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihtLHEsYSxjKXtpZihxKXthPSRqc2NvbXAuZ2xvYmFsO209bS5zcGxpdChcIi5cIik7Zm9yKGM9MDtjPG0ubGVuZ3RoLTE7YysrKXt2YXIgYj1tW2NdO2IgaW4gYXx8KGFbYl09e30pO2E9YVtiXX1tPW1bbS5sZW5ndGgtMV07Yz1hW21dO3E9cShjKTtxIT1jJiZudWxsIT1xJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGEsbSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0sYSl7dmFyIGM9dGhpcztjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO3ZhciBiPWMubGVuZ3RoO2E9YXx8MDtmb3IoMD5hJiYoYT1NYXRoLm1heChhK2IsMCkpO2E8YjthKyspe3ZhciBlPWNbYV07aWYoZT09PW18fE9iamVjdC5pcyhlLG0pKXJldHVybiEwfXJldHVybiExfX0sXCJlczdcIixcImVzM1wiKTtcbiRqc2NvbXAub3ducz1mdW5jdGlvbihtLHEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxxKX07JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC5lbnRyaWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtKXt2YXIgYT1bXSxjO2ZvcihjIGluIG0pJGpzY29tcC5vd25zKG0sYykmJmEucHVzaChbYyxtW2NdXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpO1xuJGpzY29tcC5jaGVja1N0cmluZ0FyZ3M9ZnVuY3Rpb24obSxxLGEpe2lmKG51bGw9PW0pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtpZihxIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCB0byBTdHJpbmcucHJvdG90eXBlLlwiK2ErXCIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb25cIik7cmV0dXJuIG0rXCJcIn07JGpzY29tcC5zdHJpbmdQYWRkaW5nPWZ1bmN0aW9uKG0scSl7bT12b2lkIDAhPT1tP1N0cmluZyhtKTpcIiBcIjtyZXR1cm4gMDxxJiZtP20ucmVwZWF0KE1hdGguY2VpbChxL20ubGVuZ3RoKSkuc3Vic3RyaW5nKDAscSk6XCJcIn07XG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydFwiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz0kanNjb21wLmNoZWNrU3RyaW5nQXJncyh0aGlzLG51bGwsXCJwYWRTdGFydFwiKTtyZXR1cm4gJGpzY29tcC5zdHJpbmdQYWRkaW5nKGEsbS1jLmxlbmd0aCkrY319LFwiZXM4XCIsXCJlczNcIik7JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKG1bY10pO3JldHVybiBhfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLmFycmF5SXRlcmF0b3JJbXBsPWZ1bmN0aW9uKG0pe3ZhciBxPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHE8bS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6bVtxKytdfTp7ZG9uZTohMH19fTskanNjb21wLmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24obSl7cmV0dXJue25leHQ6JGpzY29tcC5hcnJheUl0ZXJhdG9ySW1wbChtKX19O1xuJGpzY29tcC5TWU1CT0xfUFJFRklYPVwianNjb21wX3N5bWJvbF9cIjskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXt9OyRqc2NvbXAuZ2xvYmFsLlN5bWJvbHx8KCRqc2NvbXAuZ2xvYmFsLlN5bWJvbD0kanNjb21wLlN5bWJvbCl9OyRqc2NvbXAuU3ltYm9sQ2xhc3M9ZnVuY3Rpb24obSxxKXt0aGlzLiRqc2NvbXAkc3ltYm9sJGlkXz1tOyRqc2NvbXAuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlc2NyaXB0aW9uXCIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpxfSl9OyRqc2NvbXAuU3ltYm9sQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGpzY29tcCRzeW1ib2wkaWRffTtcbiRqc2NvbXAuU3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShhKXtpZih0aGlzIGluc3RhbmNlb2YgbSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3JldHVybiBuZXcgJGpzY29tcC5TeW1ib2xDbGFzcygkanNjb21wLlNZTUJPTF9QUkVGSVgrKGF8fFwiXCIpK1wiX1wiK3ErKyxhKX12YXIgcT0wO3JldHVybiBtfSgpO1xuJGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3I9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2woKTt2YXIgbT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLml0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5pdGVyYXRvclwiKSk7XCJmdW5jdGlvblwiIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW21dJiYkanNjb21wLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvclByb3RvdHlwZSgkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKHRoaXMpKX19KTskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpe319O1xuJGpzY29tcC5pbml0U3ltYm9sQXN5bmNJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yO218fChtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5hc3luY0l0ZXJhdG9yXCIpKTskanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07JGpzY29tcC5pdGVyYXRvclByb3RvdHlwZT1mdW5jdGlvbihtKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO209e25leHQ6bX07bVskanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBtfTtcbiRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXk9ZnVuY3Rpb24obSxxKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO20gaW5zdGFuY2VvZiBTdHJpbmcmJihtKz1cIlwiKTt2YXIgYT0wLGM9e25leHQ6ZnVuY3Rpb24oKXtpZihhPG0ubGVuZ3RoKXt2YXIgYj1hKys7cmV0dXJue3ZhbHVlOnEoYixtW2JdKSxkb25lOiExfX1jLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTtyZXR1cm4gYy5uZXh0KCl9fTtjW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gY307cmV0dXJuIGN9OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUudmFsdWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yRnJvbUFycmF5KHRoaXMsZnVuY3Rpb24obSxhKXtyZXR1cm4gYX0pfX0sXCJlczhcIixcImVzM1wiKTtcbihmdW5jdGlvbihtKXtmdW5jdGlvbiBxKGMpe2lmKGFbY10pcmV0dXJuIGFbY10uZXhwb3J0czt2YXIgYj1hW2NdPXtpOmMsbDohMSxleHBvcnRzOnt9fTttW2NdLmNhbGwoYi5leHBvcnRzLGIsYi5leHBvcnRzLHEpO2IubD0hMDtyZXR1cm4gYi5leHBvcnRzfXZhciBhPXt9O3EubT1tO3EuYz1hO3EuZD1mdW5jdGlvbihhLGIsZSl7cS5vKGEsYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6ITAsZ2V0OmV9KX07cS5yPWZ1bmN0aW9uKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTtxLnQ9ZnVuY3Rpb24oYSxiKXtiJjEmJihhPXEoYSkpO2lmKGImOHx8YiY0JiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTtcbnZhciBjPU9iamVjdC5jcmVhdGUobnVsbCk7cS5yKGMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmF9KTtpZihiJjImJlwic3RyaW5nXCIhPXR5cGVvZiBhKWZvcih2YXIgZiBpbiBhKXEuZChjLGYsZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19LmJpbmQobnVsbCxmKSk7cmV0dXJuIGN9O3Eubj1mdW5jdGlvbihhKXt2YXIgYj1hJiZhLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gYVtcImRlZmF1bHRcIl19OmZ1bmN0aW9uKCl7cmV0dXJuIGF9O3EuZChiLFwiYVwiLGIpO3JldHVybiBifTtxLm89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O3EucD1cIlwiO3JldHVybiBxKHEucz0xKX0pKFtmdW5jdGlvbihtLHEpe3E9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cT1xfHwobmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikpKCl9Y2F0Y2goYSl7XCJvYmplY3RcIj09PVxudHlwZW9mIHdpbmRvdyYmKHE9d2luZG93KX1tLmV4cG9ydHM9cX0sZnVuY3Rpb24obSxxLGEpe2EoMik7U2suZ2xvYmFsLnN0cmZ0aW1lPWEoMyk7U2suZ2xvYmFsLnN0cnB0aW1lPWEoNCk7YSg1KTthKDcpO2EoOSk7YSgxMCk7YSgxMSk7YSgxMik7YSgxMyk7YSgxNCk7YSgxNSk7YSgxNik7YSgxNyk7YSgxOCk7W1NrLmJ1aWx0aW4ub2JqZWN0LFNrLmJ1aWx0aW4udHlwZV0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSk7YSgxOSk7YSgyMCk7YSgyMSk7W1NrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4ubm9uZSxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLFNrLmJ1aWx0aW4ub2JqZWN0XS5mb3JFYWNoKGE9PnthPWEucHJvdG90eXBlO2EuX19kb2NfXz1hLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpP25ldyBTay5idWlsdGluLnN0cihhLnRwJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5hKDIyKTthKDIzKTthKDI0KTthKDI1KTthKDI2KTthKDI3KTthKDI4KTthKDI5KTthKDMxKTthKDMyKTthKDMzKTthKDM0KTthKDM1KTthKDM2KTthKDM3KTthKDM4KTthKDM5KTthKDQwKTthKDQxKTthKDQyKTthKDQzKTthKDQ0KTthKDQ1KTthKDQ2KTthKDQ3KTthKDQ4KTthKDQ5KTthKDUwKTthKDUxKTthKDUyKTthKDUzKTthKDU0KTthKDU1KTthKDU2KTthKDU3KTthKDU4KTthKDU5KTthKDYwKTthKDYxKTthKDYyKTthKDYzKTthKDY0KTthKDY1KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhKXt2YXIgYj17YnVpbGQ6e2dpdGhhc2g6XCIzNDg0N2VjNzVjZTIxMjc0MTM5MzgyNzI1ODA2NTAxMDA0NjMyODE5XCIsZGF0ZTpcIjIwMjEtMDYtMDdUMTU6NDY6MDAuODA0WlwifX07Yi5nbG9iYWw9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2IuZXhwb3J0U3ltYm9sPVxuZnVuY3Rpb24oYSxjKXthPWEuc3BsaXQoXCIuXCIpO3ZhciBlPWIuZ2xvYmFsLGY7Zm9yKGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZD1hW2ZdO2U9ZS5oYXNPd25Qcm9wZXJ0eShkKT9lW2RdOmVbZF09e319XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiYoZD1hW2ZdLGVbZF09Yyl9O2IuaXNBcnJheUxpa2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheXx8YSYmYS5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aD8hMDohMX07Yi5qc19iZWF1dGlmeT1mdW5jdGlvbihhKXtyZXR1cm4gYX07Yi5leHBvcnRTeW1ib2woXCJTa1wiLGIpO2IuZXhwb3J0U3ltYm9sKFwiU2suZ2xvYmFsXCIsYi5nbG9iYWwpO2IuZXhwb3J0U3ltYm9sKFwiU2suYnVpbGRcIixiLmJ1aWxkKTtiLmV4cG9ydFN5bWJvbChcIlNrLmV4cG9ydFN5bWJvbFwiLGIuZXhwb3J0U3ltYm9sKTtiLmV4cG9ydFN5bWJvbChcIlNrLmlzQXJyYXlMaWtlXCIsYi5pc0FycmF5TGlrZSk7Yi5leHBvcnRTeW1ib2woXCJTay5qc19iZWF1dGlmeVwiLFxuYi5qc19iZWF1dGlmeSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShrLG4sQSl7ZnVuY3Rpb24gcChhLGQsayxnKXtmb3IodmFyIHk9XCJcIixuPW51bGwsdj0hMSxMPWEubGVuZ3RoLEc9ITEsRT0wO0U8TDtFKyspe3ZhciBBPWEuY2hhckNvZGVBdChFKTtpZighMD09PXYpaWYoNDU9PT1BKW49XCJcIjtlbHNlIGlmKDk1PT09QSluPVwiIFwiO2Vsc2UgaWYoNDg9PT1BKW49XCIwXCI7ZWxzZSBpZig1OD09PUEpRyYmaChcIltXQVJOSU5HXSBkZXRlY3RlZCB1c2Ugb2YgdW5zdXBwb3J0ZWQgJTo6IG9yICU6OjogbW9kaWZpZXJzIHRvIHN0cmZ0aW1lXCIpLEc9ITA7ZWxzZXtzd2l0Y2goQSl7Y2FzZSAzNzp5Kz1cIiVcIjticmVhaztjYXNlIDY1OnkrPWsuZGF5c1tkLmdldERheSgpXTticmVhaztjYXNlIDY2OnkrPWsubW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA2Nzp5Kz1jKE1hdGguZmxvb3IoZC5nZXRGdWxsWWVhcigpLzEwMCksbik7XG5icmVhaztjYXNlIDY4OnkrPXAoay5mb3JtYXRzLkQsZCxrLGcpO2JyZWFrO2Nhc2UgNzA6eSs9cChrLmZvcm1hdHMuRixkLGssZyk7YnJlYWs7Y2FzZSA3Mjp5Kz1jKGQuZ2V0SG91cnMoKSxuKTticmVhaztjYXNlIDczOnkrPWMoZShkLmdldEhvdXJzKCkpLG4pO2JyZWFrO2Nhc2UgNzY6eSs9YihNYXRoLmZsb29yKGclMUUzKSk7YnJlYWs7Y2FzZSA3Nzp5Kz1jKGQuZ2V0TWludXRlcygpLG4pO2JyZWFrO2Nhc2UgODA6eSs9MTI+ZC5nZXRIb3VycygpP2suYW06ay5wbTticmVhaztjYXNlIDgyOnkrPXAoay5mb3JtYXRzLlIsZCxrLGcpO2JyZWFrO2Nhc2UgODM6eSs9YyhkLmdldFNlY29uZHMoKSxuKTticmVhaztjYXNlIDg0OnkrPXAoay5mb3JtYXRzLlQsZCxrLGcpO2JyZWFrO2Nhc2UgODU6eSs9YyhmKGQsXCJzdW5kYXlcIiksbik7YnJlYWs7Y2FzZSA4Nzp5Kz1jKGYoZCxcIm1vbmRheVwiKSxuKTticmVhaztjYXNlIDg4OnkrPXAoay5mb3JtYXRzLlgsZCxrLGcpO2JyZWFrO2Nhc2UgODk6eSs9XG5kLmdldEZ1bGxZZWFyKCk7YnJlYWs7Y2FzZSA5MDpEJiYwPT09Qj95Kz1cIkdNVFwiOihuPWQudG9TdHJpbmcoKS5tYXRjaCgvXFwoKFtcXHdcXHNdKylcXCkvKSx5Kz1uJiZuWzFdfHxcIlwiKTticmVhaztjYXNlIDk3OnkrPWsuc2hvcnREYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgOTg6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgOTk6eSs9cChrLmZvcm1hdHMuYyxkLGssZyk7YnJlYWs7Y2FzZSAxMDA6eSs9YyhkLmdldERhdGUoKSxuKTticmVhaztjYXNlIDEwMTp5Kz1jKGQuZ2V0RGF0ZSgpLG51bGw9PW4/XCIgXCI6bik7YnJlYWs7Y2FzZSAxMDQ6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgMTA2Om49bmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLDAsMSk7bj1NYXRoLmNlaWwoKGQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpKS84NjRFNSk7eSs9YihuKTticmVhaztjYXNlIDEwNzp5Kz1jKGQuZ2V0SG91cnMoKSxudWxsPT1uP1wiIFwiOm4pO1xuYnJlYWs7Y2FzZSAxMDg6eSs9YyhlKGQuZ2V0SG91cnMoKSksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwOTp5Kz1jKGQuZ2V0TW9udGgoKSsxLG4pO2JyZWFrO2Nhc2UgMTEwOnkrPVwiXFxuXCI7YnJlYWs7Y2FzZSAxMTE6bj1kLmdldERhdGUoKTt5PWsub3JkaW5hbFN1ZmZpeGVzP3krKFN0cmluZyhuKSsoay5vcmRpbmFsU3VmZml4ZXNbbi0xXXx8bChuKSkpOnkrKFN0cmluZyhuKStsKG4pKTticmVhaztjYXNlIDExMjp5Kz0xMj5kLmdldEhvdXJzKCk/ay5BTTprLlBNO2JyZWFrO2Nhc2UgMTE0OnkrPXAoay5mb3JtYXRzLnIsZCxrLGcpO2JyZWFrO2Nhc2UgMTE1OnkrPU1hdGguZmxvb3IoZy8xRTMpO2JyZWFrO2Nhc2UgMTE2OnkrPVwiXFx0XCI7YnJlYWs7Y2FzZSAxMTc6bj1kLmdldERheSgpO3krPTA9PT1uPzc6bjticmVhaztjYXNlIDExODp5Kz1wKGsuZm9ybWF0cy52LGQsayxnKTticmVhaztjYXNlIDExOTp5Kz1kLmdldERheSgpO2JyZWFrO2Nhc2UgMTIwOnkrPXAoay5mb3JtYXRzLngsXG5kLGssZyk7YnJlYWs7Y2FzZSAxMjE6eSs9KFwiXCIrZC5nZXRGdWxsWWVhcigpKS5zbGljZSgyKTticmVhaztjYXNlIDEyMjpEJiYwPT09Qj95Kz1HP1wiKzAwOjAwXCI6XCIrMDAwMFwiOihuPTAhPT1CP0IvNkU0Oi1kLmdldFRpbWV6b25lT2Zmc2V0KCksdj1HP1wiOlwiOlwiXCIsQT1NYXRoLmFicyhuJTYwKSx5Kz0oMD5uP1wiLVwiOlwiK1wiKStjKE1hdGguZmxvb3IoTWF0aC5hYnMobi82MCkpKSt2K2MoQSkpO2JyZWFrO2RlZmF1bHQ6diYmKHkrPVwiJVwiKSx5Kz1hW0VdfW49bnVsbDt2PSExfWVsc2UgMzc9PT1BP3Y9ITA6eSs9YVtFXX1yZXR1cm4geX12YXIgdj1rfHxnLEI9bnx8MCxEPUF8fCExLEU9MCx1LG09ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgZD1iLmdldFRpbWUoKTtpZihEKXt2YXIgYz02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCk7Yj1uZXcgRGF0ZShkK2MrQik7NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fDApIT09YyYmKGI9NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fFxuMCksYj1uZXcgRGF0ZShkK2IrQikpfX1lbHNlIGQ9RGF0ZS5ub3coKSxkPkU/KEU9ZCx1PW5ldyBEYXRlKEUpLGQ9RSxEJiYodT1uZXcgRGF0ZShFKzZFNCoodS5nZXRUaW1lem9uZU9mZnNldCgpfHwwKStCKSkpOmQ9RSxiPXU7cmV0dXJuIHAoYSxiLHYsZCl9O20ubG9jYWxpemU9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGJ8fHYsQixEKX07bS5sb2NhbGl6ZUJ5SWRlbnRpZmllcj1mdW5jdGlvbihhKXt2YXIgYj1kW2FdO3JldHVybiBiP20ubG9jYWxpemUoYik6KGgoJ1tXQVJOSU5HXSBObyBsb2NhbGUgZm91bmQgd2l0aCBpZGVudGlmaWVyIFwiJythKydcIi4nKSxtKX07bS50aW1lem9uZT1mdW5jdGlvbihiKXt2YXIgZD1CLGM9RCxlPXR5cGVvZiBiO2lmKFwibnVtYmVyXCI9PT1lfHxcInN0cmluZ1wiPT09ZSljPSEwLFwic3RyaW5nXCI9PT1lPyhkPVwiLVwiPT09YlswXT8tMToxLGU9cGFyc2VJbnQoYi5zbGljZSgxLDMpLDEwKSxiPXBhcnNlSW50KGIuc2xpY2UoMyw1KSwxMCksZD1kKig2MCpcbmUrYikqNkU0KTpcIm51bWJlclwiPT09ZSYmKGQ9NkU0KmIpO3JldHVybiBuZXcgYSh2LGQsYyl9O20udXRjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBhKHYsQiwhMCl9O3JldHVybiBtfWZ1bmN0aW9uIGMoYSxiKXtpZihcIlwiPT09Ynx8OTxhKXJldHVybiBhO251bGw9PWImJihiPVwiMFwiKTtyZXR1cm4gYithfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIDk5PGE/YTo5PGE/XCIwXCIrYTpcIjAwXCIrYX1mdW5jdGlvbiBlKGEpe3JldHVybiAwPT09YT8xMjoxMjxhP2EtMTI6YX1mdW5jdGlvbiBmKGEsYil7Yj1ifHxcInN1bmRheVwiO3ZhciBkPWEuZ2V0RGF5KCk7XCJtb25kYXlcIj09PWImJigwPT09ZD9kPTY6ZC0tKTtiPURhdGUuVVRDKGEuZ2V0RnVsbFllYXIoKSwwLDEpO2E9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSk7cmV0dXJuIE1hdGguZmxvb3IoKE1hdGguZmxvb3IoKGEtYikvODY0RTUpKzctZCkvNyl9ZnVuY3Rpb24gbChhKXt2YXIgYj1hJTEwO2ElPTEwMDtcbmlmKDExPD1hJiYxMz49YXx8MD09PWJ8fDQ8PWIpcmV0dXJuXCJ0aFwiO3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuXCJzdFwiO2Nhc2UgMjpyZXR1cm5cIm5kXCI7Y2FzZSAzOnJldHVyblwicmRcIn19ZnVuY3Rpb24gaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGEpfXZhciBkPXtkZV9ERTp7ZGF5czpcIlNvbm50YWcgTW9udGFnIERpZW5zdGFnIE1pdHR3b2NoIERvbm5lcnN0YWcgRnJlaXRhZyBTYW1zdGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlNvIE1vIERpIE1pIERvIEZyIFNhXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhciBGZWJydWFyIE1cXHUwMGU0cnogQXByaWwgTWFpIEp1bmkgSnVsaSBBdWd1c3QgU2VwdGVtYmVyIE9rdG9iZXIgTm92ZW1iZXIgRGV6ZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1cXHUwMGU0ciBBcHIgTWFpIEp1biBKdWwgQXVnIFNlcCBPa3QgTm92IERlelwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQuJW0uJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGVuX0NBOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVuX1VTOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVzX01YOntkYXlzOlwiZG9taW5nbyBsdW5lcyBtYXJ0ZXMgbWlcXHUwMGU5cmNvbGVzIGp1ZXZlcyB2aWVybmVzIHNcXHUwMGUxYmFkb1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtaVxcdTAwZTkganVlIHZpZSBzXFx1MDBlMWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZW5lcm87ZmVicmVybzttYXJ6bzthYnJpbDttYXlvO2p1bmlvO2p1bGlvO2Fnb3N0bztzZXB0aWVtYnJlO29jdHVicmU7bm92aWVtYnJlOyBkaWNpZW1icmVcIi5zcGxpdChcIjtcIiksc2hvcnRNb250aHM6XCJlbmUgZmViIG1hciBhYnIgbWF5IGp1biBqdWwgYWdvIHNlcCBvY3Qgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLFxuYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGZyX0ZSOntkYXlzOlwiZGltYW5jaGUgbHVuZGkgbWFyZGkgbWVyY3JlZGkgamV1ZGkgdmVuZHJlZGkgc2FtZWRpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRpbS4gbHVuLiBtYXIuIG1lci4gamV1LiB2ZW4uIHNhbS5cIi5zcGxpdChcIiBcIiksbW9udGhzOlwiamFudmllciBmXFx1MDBlOXZyaWVyIG1hcnMgYXZyaWwgbWFpIGp1aW4ganVpbGxldCBhb1xcdTAwZmJ0IHNlcHRlbWJyZSBvY3RvYnJlIG5vdmVtYnJlIGRcXHUwMGU5Y2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiamFudi4gZlxcdTAwZTl2ci4gbWFycyBhdnJpbCBtYWkganVpbiBqdWlsLiBhb1xcdTAwZmJ0IHNlcHQuIG9jdC4gbm92LiBkXFx1MDBlOWMuXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixcblBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0saXRfSVQ6e2RheXM6XCJkb21lbmljYSBsdW5lZFxcdTAwZWMgbWFydGVkXFx1MDBlYyBtZXJjb2xlZFxcdTAwZWMgZ2lvdmVkXFx1MDBlYyB2ZW5lcmRcXHUwMGVjIHNhYmF0b1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtZXIgZ2lvIHZlbiBzYWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZ2VubmFpbyBmZWJicmFpbyBtYXJ6byBhcHJpbGUgbWFnZ2lvIGdpdWdubyBsdWdsaW8gYWdvc3RvIHNldHRlbWJyZSBvdHRvYnJlIG5vdmVtYnJlIGRpY2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwicHIgbWFnIGdpdSBsdWcgYWdvIHNldCBvdHQgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixcbnBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LG5sX05MOntkYXlzOlwiem9uZGFnIG1hYW5kYWcgZGluc2RhZyB3b2Vuc2RhZyBkb25kZXJkYWcgdnJpamRhZyB6YXRlcmRhZ1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJ6byBtYSBkaSB3byBkbyB2ciB6YVwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW51YXJpIGZlYnJ1YXJpIG1hYXJ0IGFwcmlsIG1laSBqdW5pIGp1bGkgYXVndXN0dXMgc2VwdGVtYmVyIG9rdG9iZXIgbm92ZW1iZXIgZGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW4gZmViIG1ydCBhcHIgbWVpIGp1biBqdWwgYXVnIHNlcCBva3Qgbm92IGRlY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsXG5EOlwiJWQtJW0tJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHB0X0JSOntkYXlzOlwiZG9taW5nbyBzZWd1bmRhIHRlclxcdTAwZTdhIHF1YXJ0YSBxdWludGEgc2V4dGEgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIkRvbSBTZWcgVGVyIFF1YSBRdWkgU2V4IFNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW5laXJvIGZldmVyZWlybyBtYXJcXHUwMGU3byBhYnJpbCBtYWlvIGp1bmhvIGp1bGhvIGFnb3N0byBzZXRlbWJybyBvdXR1YnJvIG5vdmVtYnJvIGRlemVtYnJvXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiSmFuIEZldiBNYXIgQWJyIE1haSBKdW4gSnVsIEFnbyBTZXQgT3V0IE5vdiBEZXpcIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFxuUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxydV9SVTp7ZGF5czpcIlxcdTA0MTJcXHUwNDNlXFx1MDQ0MVxcdTA0M2FcXHUwNDQwXFx1MDQzNVxcdTA0NDFcXHUwNDM1XFx1MDQzZFxcdTA0NGNcXHUwNDM1IFxcdTA0MWZcXHUwNDNlXFx1MDQzZFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0MzhcXHUwNDNhIFxcdTA0MTJcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQyMVxcdTA0NDBcXHUwNDM1XFx1MDQzNFxcdTA0MzAgXFx1MDQyN1xcdTA0MzVcXHUwNDQyXFx1MDQzMlxcdTA0MzVcXHUwNDQwXFx1MDQzMyBcXHUwNDFmXFx1MDQ0ZlxcdTA0NDJcXHUwNDNkXFx1MDQzOFxcdTA0NDZcXHUwNDMwIFxcdTA0MjFcXHUwNDQzXFx1MDQzMVxcdTA0MzFcXHUwNDNlXFx1MDQ0MlxcdTA0MzBcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1MDQxMlxcdTA0NDEgXFx1MDQxZlxcdTA0M2QgXFx1MDQxMlxcdTA0NDIgXFx1MDQyMVxcdTA0NDAgXFx1MDQyN1xcdTA0NDIgXFx1MDQxZlxcdTA0NDIgXFx1MDQyMVxcdTA0MzFcIi5zcGxpdChcIiBcIiksXG5tb250aHM6XCJcXHUwNDJmXFx1MDQzZFxcdTA0MzJcXHUwNDMwXFx1MDQ0MFxcdTA0NGMgXFx1MDQyNFxcdTA0MzVcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0NDBcXHUwNDQyIFxcdTA0MTBcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0MzkgXFx1MDQxOFxcdTA0NGVcXHUwNDNkXFx1MDQ0YyBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2JcXHUwNDRjIFxcdTA0MTBcXHUwNDMyXFx1MDQzM1xcdTA0NDNcXHUwNDQxXFx1MDQ0MiBcXHUwNDIxXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDFlXFx1MDQzYVxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWRcXHUwNDNlXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDE0XFx1MDQzNVxcdTA0M2FcXHUwNDMwXFx1MDQzMVxcdTA0NDBcXHUwNDRjXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiXFx1MDQ0ZlxcdTA0M2RcXHUwNDMyIFxcdTA0NDRcXHUwNDM1XFx1MDQzMiBcXHUwNDNjXFx1MDQzMFxcdTA0NDAgXFx1MDQzMFxcdTA0M2ZcXHUwNDQwIFxcdTA0M2NcXHUwNDMwXFx1MDQzOSBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2QgXFx1MDQzOFxcdTA0NGVcXHUwNDNiIFxcdTA0MzBcXHUwNDMyXFx1MDQzMyBcXHUwNDQxXFx1MDQzNVxcdTA0M2QgXFx1MDQzZVxcdTA0M2FcXHUwNDQyIFxcdTA0M2RcXHUwNDNlXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzNVxcdTA0M2FcIi5zcGxpdChcIiBcIiksXG5BTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYXCIsRDpcIiVkLiVtLiV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx0cl9UUjp7ZGF5czpcIlBhemFyIFBhemFydGVzaSBTYWxcXHUwMTMxIFxcdTAwYzdhclxcdTAxNWZhbWJhIFBlclxcdTAxNWZlbWJlIEN1bWEgQ3VtYXJ0ZXNpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlBheiBQenQgU2FsIFxcdTAwYzdyXFx1MDE1ZiBQclxcdTAxNWYgQ3VtIEN0c1wiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJPY2FrIFxcdTAxNWV1YmF0IE1hcnQgTmlzYW4gTWF5XFx1MDEzMXMgSGF6aXJhbiBUZW1tdXogQVxcdTAxMWZ1c3RvcyBFeWxcXHUwMGZjbCBFa2ltIEthc1xcdTAxMzFtIEFyYWxcXHUwMTMxa1wiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIk9jYSBcXHUwMTVldWIgTWFyIE5pcyBNYXkgSGF6IFRlbSBBXFx1MDExZnUgRXlsIEVraSBLYXMgQXJhXCIuc3BsaXQoXCIgXCIpLFxuQU06XCJcXHUwMGQ2XFx1MDBkNlwiLFBNOlwiXFx1MDBkNlNcIixhbTpcIlxcdTAwZDZcXHUwMGQ2XCIscG06XCJcXHUwMGQ2U1wiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0semhfQ046e2RheXM6XCJcXHU2NjFmXFx1NjcxZlxcdTY1ZTUgXFx1NjYxZlxcdTY3MWZcXHU0ZTAwIFxcdTY2MWZcXHU2NzFmXFx1NGU4YyBcXHU2NjFmXFx1NjcxZlxcdTRlMDkgXFx1NjYxZlxcdTY3MWZcXHU1NmRiIFxcdTY2MWZcXHU2NzFmXFx1NGU5NCBcXHU2NjFmXFx1NjcxZlxcdTUxNmRcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1NjVlNVxcdTRlMDBcXHU0ZThjXFx1NGUwOVxcdTU2ZGJcXHU0ZTk0XFx1NTE2ZFwiLnNwbGl0KFwiXCIpLG1vbnRoczpcIlxcdTRlMDBcXHU2NzA4XFx1NGVmZCBcXHU0ZThjXFx1NjcwOFxcdTRlZmQgXFx1NGUwOVxcdTY3MDhcXHU0ZWZkIFxcdTU2ZGJcXHU2NzA4XFx1NGVmZCBcXHU0ZTk0XFx1NjcwOFxcdTRlZmQgXFx1NTE2ZFxcdTY3MDhcXHU0ZWZkIFxcdTRlMDNcXHU2NzA4XFx1NGVmZCBcXHU1MTZiXFx1NjcwOFxcdTRlZmQgXFx1NGU1ZFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZThjXFx1NjcwOFxcdTRlZmRcIi5zcGxpdChcIiBcIiksXG5zaG9ydE1vbnRoczpcIlxcdTRlMDBcXHU2NzA4IFxcdTRlOGNcXHU2NzA4IFxcdTRlMDlcXHU2NzA4IFxcdTU2ZGJcXHU2NzA4IFxcdTRlOTRcXHU2NzA4IFxcdTUxNmRcXHU2NzA4IFxcdTRlMDNcXHU2NzA4IFxcdTUxNmJcXHU2NzA4IFxcdTRlNWRcXHU2NzA4IFxcdTUzNDFcXHU2NzA4IFxcdTUzNDFcXHU0ZTAwXFx1NjcwOCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcIi5zcGxpdChcIiBcIiksQU06XCJcXHU0ZTBhXFx1NTM0OFwiLFBNOlwiXFx1NGUwYlxcdTUzNDhcIixhbTpcIlxcdTRlMGFcXHU1MzQ4XCIscG06XCJcXHU0ZTBiXFx1NTM0OFwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX19LGc9ZC5lbl9VUyxuPW5ldyBhKGcsMCwhMSk7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtKXZhciBrPW0uZXhwb3J0cz1uO2Vsc2Ugaz1mdW5jdGlvbigpe3JldHVybiB0aGlzfHwoMCxldmFsKShcInRoaXNcIil9KCksXG5rLnN0cmZ0aW1lPW47XCJmdW5jdGlvblwiIT09dHlwZW9mIERhdGUubm93JiYoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KX0pKCl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihiLGMsZil7cmV0dXJuIGEucGFyc2UoYixjLGYpfTthLnZlcnNpb249XCIwLjAuMVwiOyhtLmV4cG9ydHM9YSkuc3RycHRpbWU9YTthLmxvY2FsZT17YTpcIlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdFwiLnNwbGl0KFwiIFwiKSxBOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksYjpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLEI6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGY6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLFxuYzpcIiVZLSVtLSVkICVIOiVNOiVTXCIsUDpbXCJhbVwiLFwicG1cIl0scjpcIiVJOiVNOiVTICVwXCIseDpcIiVtLyVkLyV5XCIsWDpcIiVIOiVNOiVTXCIsZGF5OltcIlllc3RlcmRheVwiLFwiVG9kYXlcIixcIlRvbW9ycm93XCJdLGJnOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQmc6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGZnOlwiSmFuLiBGZWIuIE1hci4gQXByLiBNYXkgSnVuLiBKdWwuIEF1Zy4gU2VwLiBPY3QuIE5vdi4gRGVjLlwiLnNwbGl0KFwiIFwiKSxEYXRlX2RCWV95ZWFyX2luX0hNOlwiJSNCICUtZCwgJVkgYXQgJS1IOiVNXCIsRGF0ZV9kQllfeWVhcjpcIiUjQiAlLWQsICVZXCIsRGF0ZV9kQlk6XCIlI0IgJS1kLCAlWVwiLERhdGVfQWRCWTpcIiVBLCAlI0IgJS1kLCAlWVwiLERhdGVfZEJBOlwiJSNCICUtZCwgJUFcIixcbkRhdGVfZGZfaW5fSE06XCIlI2YsICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmWTpcIiUtZCAlI2YgJVlcIixEYXRlX2RCX2luX0hNOlwiJSNCICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmOlwiJS1kICUjZlwifTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGMsZSxmLGgsbCl7Yz1TdHJpbmcoYyk7ZT1TdHJpbmcoZSk7Yz1jLnJlcGxhY2UoL15bI18wXFxeXFwtIX5dKy8sXCJcIik7Zj1kW2NdO2lmKCFmKXJldHVybiBhO3ZhciBrPSExOy0xPT09ZS5pbmRleE9mKFwiIVwiKSYmMT09PWMubGVuZ3RoJiYoLTE8ZS5pbmRleE9mKFwiflwiKXx8LTE8XCJiQmZcIi5pbmRleE9mKGMpJiYvJVswXFwtX10/ZFtcXHNdKyQvLnRlc3QobC5zdWJzdHIoMCxoKSkpJiYoaz0hMCk7aWYoKFwiSVwiPT09Y3x8XCJsXCI9PT1jKSYmIS8lW3BQXS8udGVzdChsKSl0aHJvdyBFcnJvcihcIlVuZGVmaW5lZCBBTS9QTVwiKTtzd2l0Y2godHlwZW9mIGYpe2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiBmKCk7Y2FzZSBcInN0cmluZ1wiOnJldHVybiBmO2Nhc2UgXCJvYmplY3RcIjpyZXR1cm4gYi5tYWtlLnB1c2goW2YubWFrZSxcbmUsa10pLFwiKFwiK2YucmVnK1wiKVwiO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGMoYSxiKXthPVN0cmluZyhhKTtiPVN0cmluZyhiKTtyZXR1cm4tMSE9PWIuaW5kZXhPZihcIiNcIik/YS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpOi0xIT09Yi5pbmRleE9mKFwiXlwiKT9hLnN1YnN0cigwLDEpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk6YX12YXIgbD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMubGVuZ3RoLGQ9MDtkPGI7KXtpZihhPT10aGlzW2RdKXJldHVybiBkO2QrK31yZXR1cm4tMX0saD1hLmxvY2FsZSxkPXtcIiVcIjpcIlxcXFwlXCIsYTpcIlxcXFxTK1wiLEE6XCJcXFxcUytcIixiOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGg6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxcbmIsZCxlKXtiPWwuY2FsbChlP2guYmc6aC5iLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxCOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5CZzpoLkIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGY6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmZnOmguZixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sRzp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsXG5iKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxkOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sZTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwzMTxiKXJldHVybiExO2Euc2V0VVRDRGF0ZShiKTtyZXR1cm4hMH19LEg6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8MjM8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGIpO3JldHVybiEwfX0sSTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwxMjxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpK2IpO3JldHVybiEwfX0sbTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsXG5tYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENNb250aChiLTEpO3JldHVybiEwfX0sTTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw1OTxiKXJldHVybiExO2Euc2V0VVRDTWludXRlcyhiKTtyZXR1cm4hMH19LG46XCJcXFxcblwiLHA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFM6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw2MDxiKXJldHVybiExO2Euc2V0VVRDU2Vjb25kcyhiKTtyZXR1cm4hMH19LHQ6XCJcXFxcdFwiLHU6XCJcXFxcZFwiLFU6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix3OlwiXFxcXGRcIixXOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIseTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sWTp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sejp7cmVnOlwiWytcXFxcLV1cXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWIubWF0Y2goL14oWytcXC1dKShcXGR7Mn0pKFxcZHsyfSkkLyk7aWYoIWIpcmV0dXJuITE7dmFyIGQ9NkU0Kig2MCpwYXJzZUludChiWzJdLDEwKStcbnBhcnNlSW50KGJbM10sMTApKTtcIitcIj09PWJbMV0mJihkPS1kKTthLnNldFRpbWUoYS5nZXRUaW1lKCkrZCk7cmV0dXJuITB9fSxsOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxzOntyZWc6XCJcXFxcZCtcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFRpbWUoMUUzKmIpO3JldHVybiEwfX0sYzpoLmMscjpoLnIsUjpcIiVIOiVNXCIsVDpcIiVIOiVNOiVTXCIseDpoLngsWDpoLlgsRDpcIiVtLyVkLyV5XCIsRjpcIiVZLSVtLSVkXCIsRGF0ZV9pc286XCIlWS0lbS0lZFQlSDolTTolU1wiLERhdGVfZEJZX3llYXJfaW5fSE06aC5EYXRlX2RCWV95ZWFyX2luX0hNLERhdGVfZEJZX3llYXI6aC5EYXRlX2RCWV95ZWFyLERhdGVfZEJZOmguRGF0ZV9kQlksRGF0ZV9kQkE6aC5EYXRlX2RCQSxEYXRlX0FkQlk6aC5EYXRlX0FkQlksXG5EYXRlX2RmX2luX0hNOmguRGF0ZV9kZl9pbl9ITSxEYXRlX2RmWTpoLkRhdGVfZGZZLERhdGVfZEJfaW5fSE06aC5EYXRlX2RCX2luX0hNLERhdGVfZG1ZX19kb3Q6XCIlZC4lbS4lWVwiLERhdGVfZGY6aC5EYXRlX2RmLERhdGVfRlQ6XCIlRiAlVFwiLERhdGVfZG1ZX19taW51czpcIiVkLSVtLSVZXCJ9O2EucGFyc2U9ZnVuY3Rpb24oYSxkLGMpe2E9U3RyaW5nKGEpO2Q9U3RyaW5nKGQpO2Zvcih2YXIgZT01Oy8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS9nLnRlc3QoZCkmJmU7KWQ9ZC5yZXBsYWNlKC8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS8sYiksZS0tO2IubWFrZT1bXTtkPWQucmVwbGFjZSgvJSgoWyNcXF4hfl17MCwyfSlbYUFiQmZoXXwoWzBcXC1fXT8pW2RlZ0hJbU1TVld5bF18W0ducFB0dVV3WXpacyVdKS9nLGIpO2E9YS5tYXRjaChuZXcgUmVnRXhwKGQpKTtpZighYXx8IWIubWFrZS5sZW5ndGgpcmV0dXJuIG51bGw7ZD1uZXcgRGF0ZShEYXRlLlVUQygwLFxuMCkpO2U9MDtmb3IodmFyIGs9Yi5tYWtlLmxlbmd0aDtlPGs7ZSsrKXt2YXIgZj1iLm1ha2VbZV07aWYoIWZbMF0oZCxhW2UrMV0sZlsxXSxmWzJdKSlyZXR1cm4gbnVsbH1jJiZkLnNldFRpbWUoZC5nZXRUaW1lKCkrNkU0KmQuZ2V0VGltZXpvbmVPZmZzZXQoKSk7cmV0dXJuIGR9fSkoYSl9KSgpfSxmdW5jdGlvbihtLHEsYSl7bT1hKDYpO2NvbnN0IGM9U2suZ2xvYmFsLkpTQkk9dm9pZCAwIT09U2suZ2xvYmFsLkJpZ0ludD97fTptO2lmKHZvaWQgMD09PVNrLmdsb2JhbC5CaWdJbnQpe2NvbnN0IGE9Yy5fX2lzQmlnSW50O2MuX19pc0JpZ0ludD1hP2I9Pm51bGwhPT1iJiZhKGIpOmE9PmEgaW5zdGFuY2VvZiBjO2MucG93ZXJtb2Q9KGEsYixsKT0+e2NvbnN0IGU9Yy5CaWdJbnQoMSk7bGV0IGQ9ZTtmb3IoYj1jLmdyZWF0ZXJUaGFuKGIsYy5fX1pFUk8pP2I6Yy51bmFyeU1pbnVzKGIpO2MuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk7KWMuYml0d2lzZUFuZChiLGUpJiYoZD1jLnJlbWFpbmRlcihjLm11bHRpcGx5KGQsXG5hKSxsKSksYj1jLnNpZ25lZFJpZ2h0U2hpZnQoYixlKSxhPWMucmVtYWluZGVyKGMubXVsdGlwbHkoYSxhKSxsKTtyZXR1cm4gZH19ZWxzZSBPYmplY3QuYXNzaWduKGMse0JpZ0ludDpTay5nbG9iYWwuQmlnSW50LHRvTnVtYmVyOmE9Pk51bWJlcihhKSx0b1N0cmluZzphPT5hLnRvU3RyaW5nKCksX19pc0JpZ0ludDphPT5cImJpZ2ludFwiPT09dHlwZW9mIGEsdW5hcnlNaW51czphPT4tYSxiaXR3aXNlTm90OmE9Pn5hLGJpdHdpc2VBbmQ6KGEsYyk9PmEmYyxiaXR3aXNlT3I6KGEsYyk9PmF8YyxiaXR3aXNlWG9yOihhLGMpPT5hXmMsZXhwb25lbnRpYXRlOihhLGUpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgbD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJmImJihsKj1hKSxlPj49YixhKj1hO3JldHVybiBsfSxwb3dlcm1vZDooYSxlLGYpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgaD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJlxuYiYmKGg9aCphJWYpLGU+Pj1iLGE9YSphJWY7cmV0dXJuIGh9LG11bHRpcGx5OihhLGMpPT5hKmMsZGl2aWRlOihhLGMpPT5hL2MscmVtYWluZGVyOihhLGMpPT5hJWMsYWRkOihhLGMpPT5hK2Msc3VidHJhY3Q6KGEsYyk9PmEtYyxsZWZ0U2hpZnQ6KGEsYyk9PmE8PGMsc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+Yyx1bnNpZ25lZFJpZ2h0U2hpZnQ6KGEsYyk9PmE+Pj5jLGxlc3NUaGFuOihhLGMpPT5hPGMsbGVzc1RoYW5PckVxdWFsOihhLGMpPT5hPD1jLGdyZWF0ZXJUaGFuOihhLGMpPT5hPmMsZ3JlYXRlclRoYW5PckVxdWFsOihhLGMpPT5hPj1jLGVxdWFsOihhLGMpPT5hPT09Yyxub3RFcXVhbDooYSxjKT0+YSE9PWN9KTtjLl9fWkVSTz1jLkJpZ0ludCgwKTtjLl9fTUFYX1NBRkU9Yy5CaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MuX19NSU5fU0FGRT1jLkJpZ0ludCgtTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MubnVtYmVySWZTYWZlPWE9PmMubGVzc1RoYW4oYSxcbmMuX19NQVhfU0FGRSkmJmMuZ3JlYXRlclRoYW4oYSxjLl9fTUlOX1NBRkUpP2MudG9OdW1iZXIoYSk6YX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpe20uZXhwb3J0cz1iKCl9KSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7cmV0dXJuIGE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX0sYShiKX1mdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBkLGM9MDtjPGIubGVuZ3RoO2MrKylkPWJbY10sZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gZCYmKGQud3JpdGFibGU9XG4hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9ZnVuY3Rpb24gZShhLGQsYyl7cmV0dXJuIGQmJmIoYS5wcm90b3R5cGUsZCksYyYmYihhLGMpLGF9ZnVuY3Rpb24gZihhLGIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGImJm51bGwhPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGImJmIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6YSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7YiYmaChhLGIpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihhKX0sbChhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihhLFxuYil7cmV0dXJuIGEuX19wcm90b19fPWIsYX0saChhLGIpfWZ1bmN0aW9uIGQoKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKEQpe3JldHVybiExfX1mdW5jdGlvbiBnKCl7cmV0dXJuIGc9ZCgpP1JlZmxlY3QuY29uc3RydWN0OmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1bbnVsbF07Yy5wdXNoLmFwcGx5KGMsYik7YT1uZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoYSxjKSk7cmV0dXJuIGQmJmgoYSxkLnByb3RvdHlwZSksYX0sZy5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihhKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7XG5yZXR1cm4gbj1mdW5jdGlvbihhKXtmdW5jdGlvbiBkKCl7cmV0dXJuIGcoYSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9aWYobnVsbD09PWF8fC0xPT09RnVuY3Rpb24udG9TdHJpbmcuY2FsbChhKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSlyZXR1cm4gYTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgYil7aWYoYi5oYXMoYSkpcmV0dXJuIGIuZ2V0KGEpO2Iuc2V0KGEsZCl9cmV0dXJuIGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpkLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgoZCxhKX0sbihhKX1mdW5jdGlvbiBrKGEpe3ZhciBiPWQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1sKGEpO2lmKGIpe3ZhciBjPVxubCh0aGlzKS5jb25zdHJ1Y3RvcjtkPVJlZmxlY3QuY29uc3RydWN0KGQsYXJndW1lbnRzLGMpfWVsc2UgZD1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighZHx8XCJvYmplY3RcIiE9dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQpe2lmKHZvaWQgMD09PXRoaXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO2Q9dGhpc31yZXR1cm4gZH19ZnVuY3Rpb24gcChhLGIpe2lmKGEpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiB1KGEsYik7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1kJiZhLmNvbnN0cnVjdG9yJiYoZD1hLmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1kfHxcIlNldFwiPT09ZD9BcnJheS5mcm9tKGEpOlwiQXJndW1lbnRzXCI9PT1kfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChkKT9cbnUoYSxiKTp2b2lkIDB9fWZ1bmN0aW9uIHUoYSxiKXsobnVsbD09Ynx8Yj5hLmxlbmd0aCkmJihiPWEubGVuZ3RoKTtmb3IodmFyIGQ9MCxjPUFycmF5KGIpO2Q8YjtkKyspY1tkXT1hW2RdO3JldHVybiBjfWZ1bmN0aW9uIEEoYSxiKXt2YXIgZDtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1hW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoYSl8fChkPXAoYSkpfHxiJiZhJiZcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGgpe2QmJihhPWQpO3ZhciBjPTA7Yj1mdW5jdGlvbigpe307cmV0dXJue3M6YixuOmZ1bmN0aW9uKCl7cmV0dXJuIGM+PWEubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTphW2MrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGE7fSxmOmJ9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn12YXIgZSxrPSEwLGY9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtkPWFbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9ZC5uZXh0KCk7cmV0dXJuIGs9YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7Zj0hMDtlPWF9LGY6ZnVuY3Rpb24oKXt0cnl7a3x8bnVsbD09ZC5yZXR1cm58fGQucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IGU7fX19fXZhciB0PU1hdGguaW11bCx2PU1hdGguY2x6MzIsQj1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEsYil7dmFyIGM7aWYoISh0aGlzIGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtpZihhPmQuX19rTWF4TGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZFwiKTtyZXR1cm4gYz1oLmNhbGwodGhpcyxhKSxjLnNpZ249YixjfXZhciBjPU1hdGguYWJzLGc9TWF0aC5tYXg7ZihkLGIpO3ZhciBoPWsoZCk7XG5yZXR1cm4gZShkLFt7a2V5OlwidG9EZWJ1Z1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJCaWdJbnRbXCJdLGQ9QSh0aGlzKTt0cnl7Zm9yKGQucygpOyEoYT1kLm4oKSkuZG9uZTspe3ZhciBjPWEudmFsdWU7Yi5wdXNoKChjPyhjPj4+MCkudG9TdHJpbmcoMTYpOmMpK1wiLCBcIil9fWNhdGNoKFApe2QuZShQKX1maW5hbGx5e2QuZigpfXJldHVybiBiLnB1c2goXCJdXCIpLGIuam9pbihcIlwiKX19LHtrZXk6XCJ0b1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjEwO2lmKDI+YXx8MzY8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRvU3RyaW5nKCkgcmFkaXggYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpO3JldHVybiAwPT09dGhpcy5sZW5ndGg/XCIwXCI6MD09KGEmYS0xKT9kLl9fdG9TdHJpbmdCYXNlUG93ZXJPZlR3byh0aGlzLGEpOmQuX190b1N0cmluZ0dlbmVyaWModGhpcyxcbmEsITEpfX0se2tleTpcIl9fY29weVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBkKHRoaXMubGVuZ3RoLHRoaXMuc2lnbiksYj0wO2I8dGhpcy5sZW5ndGg7YisrKWFbYl09dGhpc1tiXTtyZXR1cm4gYX19LHtrZXk6XCJfX3RyaW1cIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmxlbmd0aCxiPXRoaXNbYS0xXTswPT09YjspYS0tLGI9dGhpc1thLTFdLHRoaXMucG9wKCk7cmV0dXJuIDA9PT1hJiYodGhpcy5zaWduPSExKSx0aGlzfX0se2tleTpcIl9faW5pdGlhbGl6ZURpZ2l0c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmxlbmd0aDthKyspdGhpc1thXT0wfX0se2tleTpcIl9fY2x6bXNkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZC5fX2NsejMyKHRoaXNbdGhpcy5sZW5ndGgtMV0pfX0se2tleTpcIl9faW5wbGFjZU11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2M+dGhpcy5sZW5ndGgmJihjPXRoaXMubGVuZ3RoKTt2YXIgZT1cbjY1NTM1JmE7YT4+Pj0xNjt2YXIgaz0wLGY9NjU1MzUmYjtiPj4+PTE2O2Zvcih2YXIgZz0wO2c8YztnKyspe3ZhciBoPXRoaXMuX19kaWdpdChnKSxwPTY1NTM1JmgsbD1oPj4+MTY7aD1kLl9faW11bChwLGUpO3A9ZC5fX2ltdWwocCxhKTt2YXIgdj1kLl9faW11bChsLGUpO2w9ZC5fX2ltdWwobCxhKTt2YXIgeT1mKyg2NTUzNSZoKTtoPWIraysoeT4+PjE2KSsoaD4+PjE2KSsoNjU1MzUmcCkrKDY1NTM1JnYpO2Y9KHA+Pj4xNikrKHY+Pj4xNikrKDY1NTM1JmwpKyhoPj4+MTYpO2s9Zj4+PjE2O2YmPTY1NTM1O2I9bD4+PjE2O3RoaXMuX19zZXREaWdpdChnLDY1NTM1Jnl8aDw8MTYpfWlmKDAhPT1rfHwwIT09Znx8MCE9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9faW5wbGFjZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGMsZT0wLGs9MDtrPGQ7aysrKWM9dGhpcy5fX2hhbGZEaWdpdChiK2spK2EuX19oYWxmRGlnaXQoaykrXG5lLGU9Yz4+PjE2LHRoaXMuX19zZXRIYWxmRGlnaXQoYitrLGMpO3JldHVybiBlfX0se2tleTpcIl9faW5wbGFjZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0wO2lmKDEmYil7Yj4+PTE7Zm9yKHZhciBlPXRoaXMuX19kaWdpdChiKSxrPTY1NTM1JmUsZj0wO2Y8ZC0xPj4+MTtmKyspe3ZhciBnPWEuX19kaWdpdChmKTtlPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZlPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixlPDwxNnw2NTUzNSZrKTtlPXRoaXMuX19kaWdpdChiK2YrMSk7az0oNjU1MzUmZSktKGc+Pj4xNiktYztjPTEmaz4+PjE2fWc9YS5fX2RpZ2l0KGYpO3ZhciBoPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZoPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixoPDwxNnw2NTUzNSZrKTtpZihiK2YrMT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgYm91bmRzXCIpOzA9PSgxJmQpJiYoZT10aGlzLl9fZGlnaXQoYitmKzEpLGs9KDY1NTM1JlxuZSktKGc+Pj4xNiktYyxjPTEmaz4+PjE2LHRoaXMuX19zZXREaWdpdChiK2EubGVuZ3RoLDQyOTQ5MDE3NjAmZXw2NTUzNSZrKSl9ZWxzZXtiPj49MTtmb3Ioaz0wO2s8YS5sZW5ndGgtMTtrKyspZT10aGlzLl9fZGlnaXQoYitrKSxnPWEuX19kaWdpdChrKSxmPSg2NTUzNSZlKS0oNjU1MzUmZyktYyxjPTEmZj4+PjE2LGU9KGU+Pj4xNiktKGc+Pj4xNiktYyxjPTEmZT4+PjE2LHRoaXMuX19zZXREaWdpdChiK2ssZTw8MTZ8NjU1MzUmZik7Zj10aGlzLl9fZGlnaXQoYitrKTthPWEuX19kaWdpdChrKTtlPSg2NTUzNSZmKS0oNjU1MzUmYSktYztjPTEmZT4+PjE2O2c9MDswPT0oMSZkKSYmKGc9KGY+Pj4xNiktKGE+Pj4xNiktYyxjPTEmZz4+PjE2KTt0aGlzLl9fc2V0RGlnaXQoYitrLGc8PDE2fDY1NTM1JmUpfXJldHVybiBjfX0se2tleTpcIl9faW5wbGFjZVJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwIT09YSl7Zm9yKHZhciBiLGQ9dGhpcy5fX2RpZ2l0KDApPj4+YSxcbmM9dGhpcy5sZW5ndGgtMSxlPTA7ZTxjO2UrKyliPXRoaXMuX19kaWdpdChlKzEpLHRoaXMuX19zZXREaWdpdChlLGI8PDMyLWF8ZCksZD1iPj4+YTt0aGlzLl9fc2V0RGlnaXQoYyxkKX19fSx7a2V5OlwiX19kaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdfX0se2tleTpcIl9fdW5zaWduZWREaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdPj4+MH19LHtrZXk6XCJfX3NldERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX3NldERpZ2l0R3Jvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpc1thXT0wfGJ9fSx7a2V5OlwiX19oYWxmRGlnaXRMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGVuZ3RoO3JldHVybiA2NTUzNT49dGhpcy5fX3Vuc2lnbmVkRGlnaXQoYS0xKT8yKmEtMToyKmF9fSx7a2V5OlwiX19oYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gNjU1MzUmdGhpc1thPj4+MV0+Pj5cbigoMSZhKTw8NCl9fSx7a2V5OlwiX19zZXRIYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWE+Pj4xLGM9dGhpcy5fX2RpZ2l0KGQpO3RoaXMuX19zZXREaWdpdChkLDEmYT82NTUzNSZjfGI8PDE2OjQyOTQ5MDE3NjAmY3w2NTUzNSZiKX19XSxbe2tleTpcIkJpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguZmxvb3IsZT1OdW1iZXIuaXNGaW5pdGU7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKDA9PT1iKXJldHVybiBkLl9femVybygpO2lmKCgwfGIpPT09YilyZXR1cm4gMD5iP2QuX19vbmVEaWdpdCgtYiwhMCk6ZC5fX29uZURpZ2l0KGIsITEpO2lmKCFlKGIpfHxjKGIpIT09Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBudW1iZXIgXCIrYitcIiBjYW5ub3QgYmUgY29udmVydGVkIHRvIEJpZ0ludCBiZWNhdXNlIGl0IGlzIG5vdCBhbiBpbnRlZ2VyXCIpO3JldHVybiBkLl9fZnJvbURvdWJsZShiKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1kLl9fZnJvbVN0cmluZyhiKTtcbmlmKG51bGw9PT1jKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7cmV0dXJuIGN9aWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXJldHVybiEwPT09Yj9kLl9fb25lRGlnaXQoMSwhMSk6ZC5fX3plcm8oKTtpZihcIm9iamVjdFwiPT09YShiKSl7aWYoYi5jb25zdHJ1Y3Rvcj09PWQpcmV0dXJuIGI7Yj1kLl9fdG9QcmltaXRpdmUoYik7cmV0dXJuIGQuQmlnSW50KGIpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBcIitiK1wiIHRvIGEgQmlnSW50XCIpO319LHtrZXk6XCJ0b051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA9PT1iKXJldHVybiAwO2lmKDE9PT1iKXt2YXIgYz1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYS5zaWduPy1jOmN9dmFyIGU9YS5fX2RpZ2l0KGItMSksaz1kLl9fY2x6MzIoZSk7Yz0zMipiLWs7aWYoMTAyNDxjKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDstLWM7XG52YXIgZj1iLTEsZz1rKzE7az0oMzI9PT1nPzA6ZTw8Zyk+Pj4xMjt2YXIgaD1nLTEyO2I9MTI8PWc/MDplPDwyMCtnO2c9MjArZzswPGgmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxrfD1lPj4+MzItaCxiPWU8PGgsZz1oKTswPGcmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxifD1lPj4+MzItZyxnLT0zMik7ZT1kLl9fZGVjaWRlUm91bmRpbmcoYSxnLGYsZSk7aWYoKDE9PT1lfHwwPT09ZSYmMT09KDEmYikpJiYoYj1iKzE+Pj4wLDA9PT1iJiYoaysrLDAhPWs+Pj4yMCYmKGs9MCxjKyssMTAyMzxjKSkpKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDthPWEuc2lnbj8tMjE0NzQ4MzY0ODowO3JldHVybiBjPWMrMTAyMzw8MjAsZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT1hfGN8ayxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzBdPWIsZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdfX0se2tleTpcInVuYXJ5TWludXNcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7XG52YXIgYj1hLl9fY29weSgpO3JldHVybiBiLnNpZ249IWEuc2lnbixifX0se2tleTpcImJpdHdpc2VOb3RcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5zaWduP2QuX19hYnNvbHV0ZVN1Yk9uZShhKS5fX3RyaW0oKTpkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCl9fSx7a2V5OlwiZXhwb25lbnRpYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiLnNpZ24pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFeHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlXCIpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZC5fX29uZURpZ2l0KDEsITEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigxPT09YS5sZW5ndGgmJjE9PT1hLl9fZGlnaXQoMCkpcmV0dXJuIGEuc2lnbiYmMD09KDEmYi5fX2RpZ2l0KDApKT9kLnVuYXJ5TWludXMoYSk6YTtpZigxPGIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09YilyZXR1cm4gYTtpZihiPj1cbmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2lmKDE9PT1hLmxlbmd0aCYmMj09PWEuX19kaWdpdCgwKSl7dmFyIGM9MSsoYj4+PjUpO2E9bmV3IGQoYyxhLnNpZ24mJjAhPSgxJmIpKTthLl9faW5pdGlhbGl6ZURpZ2l0cygpO3JldHVybiBhLl9fc2V0RGlnaXQoYy0xLDE8PCgzMSZiKSksYX1jPW51bGw7dmFyIGU9YTswIT0oMSZiKSYmKGM9YSk7Zm9yKGI+Pj0xOzAhPT1iO2I+Pj0xKWU9ZC5tdWx0aXBseShlLGUpLDAhPSgxJmIpJiYobnVsbD09PWM/Yz1lOmM9ZC5tdWx0aXBseShjLGUpKTtyZXR1cm4gY319LHtrZXk6XCJtdWx0aXBseVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjt2YXIgYz1hLmxlbmd0aCtiLmxlbmd0aDszMjw9YS5fX2Nsem1zZCgpK2IuX19jbHptc2QoKSYmYy0tO2M9bmV3IGQoYyxhLnNpZ24hPT1iLnNpZ24pO2MuX19pbml0aWFsaXplRGlnaXRzKCk7XG5mb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLl9fbXVsdGlwbHlBY2N1bXVsYXRlKGIsYS5fX2RpZ2l0KGUpLGMsZSk7cmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiZGl2aWRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO2lmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBkLl9femVybygpO3ZhciBjPWEuc2lnbiE9PWIuc2lnbixlPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWUpe2lmKDE9PT1lKXJldHVybiBjPT09YS5zaWduP2E6ZC51bmFyeU1pbnVzKGEpO2E9ZC5fX2Fic29sdXRlRGl2U21hbGwoYSxlLG51bGwpfWVsc2UgYT1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITAsITEpO3JldHVybiBhLnNpZ249YyxhLl9fdHJpbSgpfX0se2tleTpcInJlbWFpbmRlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiRGl2aXNpb24gYnkgemVyb1wiKTtcbmlmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBhO3ZhciBjPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWMpe2lmKDE9PT1jKXJldHVybiBkLl9femVybygpO2I9ZC5fX2Fic29sdXRlTW9kU21hbGwoYSxjKTtyZXR1cm4gMD09PWI/ZC5fX3plcm8oKTpkLl9fb25lRGlnaXQoYixhLnNpZ24pfWI9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCExLCEwKTtyZXR1cm4gYi5zaWduPWEuc2lnbixiLl9fdHJpbSgpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduP2QuX19hYnNvbHV0ZUFkZChhLGIsYyk6MDw9ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyl9fSx7a2V5Olwic3VidHJhY3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtyZXR1cm4gYz09PWIuc2lnbj8wPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsXG5iKT9kLl9fYWJzb2x1dGVTdWIoYSxiLGMpOmQuX19hYnNvbHV0ZVN1YihiLGEsIWMpOmQuX19hYnNvbHV0ZUFkZChhLGIsYyl9fSx7a2V5OlwibGVmdFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX3JpZ2h0U2hpZnRCeUFic29sdXRlKGEsYik6ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJzaWduZWRSaWdodFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJ1bnNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJCaWdJbnRzIGhhdmUgbm8gdW5zaWduZWQgcmlnaHQgc2hpZnQ7IHVzZSA+PiBpbnN0ZWFkXCIpO319LHtrZXk6XCJsZXNzVGhhblwiLFxudmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD5kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwibGVzc1RoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD49ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImdyZWF0ZXJUaGFuXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxkLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDw9ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhLnNpZ24hPT1iLnNpZ258fGEubGVuZ3RoIT09Yi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYS5fX2RpZ2l0KGQpIT09Yi5fX2RpZ2l0KGQpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm5vdEVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5lcXVhbChhLFxuYil9fSx7a2V5OlwiYml0d2lzZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlQW5kKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpKzE7YT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKTtyZXR1cm4gYT1kLl9fYWJzb2x1dGVPcihhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCl9YS5zaWduJiYoYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtyZXR1cm4gZC5fX2Fic29sdXRlQW5kTm90KGEsZC5fX2Fic29sdXRlU3ViT25lKGIpKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7YT1cbmQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiLGEpLl9fdHJpbSgpfWM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlWG9yKGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpO2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZU9yKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pcmV0dXJuIGE9ZC5fX2Fic29sdXRlU3ViT25lKGEsYyksYj1kLl9fYWJzb2x1dGVTdWJPbmUoYiksYT1kLl9fYWJzb2x1dGVBbmQoYSxiLGEpLGQuX19hYnNvbHV0ZUFkZE9uZShhLCEwLGEpLl9fdHJpbSgpO2Euc2lnbiYmXG4oYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiLGMpO3JldHVybiBiPWQuX19hYnNvbHV0ZUFuZE5vdChiLGEsYiksZC5fX2Fic29sdXRlQWRkT25lKGIsITAsYikuX190cmltKCl9fSx7a2V5OlwiYXNJbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYT49ZC5fX2tNYXhMZW5ndGhCaXRzKXJldHVybiBiO3ZhciBjPWErMzE+Pj41O2lmKGIubGVuZ3RoPGMpcmV0dXJuIGI7dmFyIGU9Yi5fX3Vuc2lnbmVkRGlnaXQoYy0xKSxrPTE8PCgzMSZhLTEpO2lmKGIubGVuZ3RoPT09YyYmZTxrKXJldHVybiBiO2lmKChlJmspIT09aylyZXR1cm4gZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpO2lmKCFiLnNpZ24pcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMCk7aWYoMD09KGUmay0xKSl7Zm9yKHZhciBmPWMtMjswPD1mO2YtLSlpZigwIT09XG5iLl9fZGlnaXQoZikpcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSk7cmV0dXJuIGIubGVuZ3RoPT09YyYmZT09PWs/YjpkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYil9cmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSl9fSx7a2V5OlwiYXNVaW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGIuc2lnbil7aWYoYT5kLl9fa01heExlbmd0aEJpdHMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX1pZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT0zMSZhO3JldHVybiBiLmxlbmd0aCE9Y3x8MCE9PWUmJjAhPWIuX19kaWdpdChjLTEpPj4+XG5lP2QuX190cnVuY2F0ZVRvTkJpdHMoYSxiKTpifX0se2tleTpcIkFERFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYT1kLl9fdG9QcmltaXRpdmUoYSksYj1kLl9fdG9QcmltaXRpdmUoYiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGImJihiPWIudG9TdHJpbmcoKSksYStiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBhLnRvU3RyaW5nKCkrYjtpZihhPWQuX190b051bWVyaWMoYSksYj1kLl9fdG9OdW1lcmljKGIpLGQuX19pc0JpZ0ludChhKSYmZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLmFkZChhLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhJiZcIm51bWJlclwiPT10eXBlb2YgYilyZXR1cm4gYStiO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgbWl4IEJpZ0ludCBhbmQgb3RoZXIgdHlwZXMsIHVzZSBleHBsaWNpdCBjb252ZXJzaW9uc1wiKTt9fSx7a2V5OlwiTFRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsXG4wKX19LHtrZXk6XCJMRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwxKX19LHtrZXk6XCJHVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwyKX19LHtrZXk6XCJHRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwzKX19LHtrZXk6XCJFUVwiLHZhbHVlOmZ1bmN0aW9uKGIsYyl7Zm9yKDs7KXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19pc0JpZ0ludChjKT9kLmVxdWFsKGIsYyk6ZC5FUShjLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsYik7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLmVxdWFsKGIsYyk7XG5pZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLCtiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3ltYm9sXCI9PT1hKGIpKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuITE7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcIm9iamVjdFwiPT09YShiKSl7aWYoXCJvYmplY3RcIj09PWEoYykmJmMuY29uc3RydWN0b3IhPT1kKXJldHVybiBiPT1jO2I9ZC5fX3RvUHJpbWl0aXZlKGIpfWVsc2UgcmV0dXJuIGI9PWN9fX0se2tleTpcIk5FXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5FUShhLGIpfX0se2tleTpcIl9femVyb1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkKDAsITEpfX0sXG57a2V5OlwiX19vbmVEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Yj1uZXcgZCgxLGIpO3JldHVybiBiLl9fc2V0RGlnaXQoMCxhKSxifX0se2tleTpcIl9fZGVjaWRlUm91bmRpbmdcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCxjKXtpZigwPGIpcmV0dXJuLTE7aWYoMD5iKWI9LWItMTtlbHNle2lmKDA9PT1kKXJldHVybi0xO2QtLTtjPWEuX19kaWdpdChkKTtiPTMxfWI9MTw8YjtpZigwPT0oYyZiKSlyZXR1cm4tMTtpZigtLWIsMCE9KGMmYikpcmV0dXJuIDE7Zm9yKDswPGQ7KWlmKGQtLSwwIT09YS5fX2RpZ2l0KGQpKXJldHVybiAxO3JldHVybiAwfX0se2tleTpcIl9fZnJvbURvdWJsZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1hO3ZhciBiPSgyMDQ3JmQuX19rQml0Q29udmVyc2lvbkludHNbMV0+Pj4yMCktMTAyMzt2YXIgYz0oYj4+PjUpKzE7YT1uZXcgZChjLDA+YSk7dmFyIGU9MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdfDEwNDg1NzYsXG5rPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07YiY9MzE7aWYoMjA+Yil7dmFyIGY9MjAtYjt2YXIgZz1mKzMyO2I9ZT4+PmY7ZT1lPDwzMi1mfGs+Pj5mO2s8PD0zMi1mfWVsc2UgMjA9PT1iPyhnPTMyLGI9ZSxlPWspOihmPWItMjAsZz0zMi1mLGI9ZTw8ZnxrPj4+MzItZixlPWs8PGYpO2EuX19zZXREaWdpdChjLTEsYik7Zm9yKGMtPTI7MDw9YztjLS0pMDxnPyhnLT0zMixiPWUsZT1rKTpiPTAsYS5fX3NldERpZ2l0KGMsYik7cmV0dXJuIGEuX190cmltKCl9fSx7a2V5OlwiX19pc1doaXRlc3BhY2VcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hISgxMz49YSYmOTw9YSl8fCgxNTk+PWE/MzI9PWE6MTMxMDcxPj1hPzE2MD09YXx8NTc2MD09YToxOTY2MDc+PWE/KGEmPTEzMTA3MSwxMD49YXx8NDA9PWF8fDQxPT1hfHw0Nz09YXx8OTU9PWF8fDQwOTY9PWEpOjY1Mjc5PT1hKX19LHtrZXk6XCJfX2Zyb21TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj0xPGFyZ3VtZW50cy5sZW5ndGgmJlxudm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGM9MCxlPWEubGVuZ3RoLGs9MDtpZihrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtmb3IodmFyIGY9YS5jaGFyQ29kZUF0KGspO2QuX19pc1doaXRlc3BhY2UoZik7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfWlmKDQzPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPTF9ZWxzZSBpZig0NT09PWYpe2lmKCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayk7Yz0tMX1pZigwPT09Yil7aWYoYj0xMCw0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZihiPTE2LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig3OT09PWZ8fDExMT09PWYpe2lmKGI9OCwrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfWVsc2UgaWYoNjY9PT1cbmZ8fDk4PT09Zil7aWYoYj0yLCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9fX1lbHNlIGlmKDE2PT09YiYmNDg9PT1mKXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2lmKGY9YS5jaGFyQ29kZUF0KGspLDg4PT09Znx8MTIwPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19Zm9yKDs0OD09PWY7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfXZhciBnPWUtayxoPWQuX19rTWF4Qml0c1BlckNoYXJbYl0scD1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyLTE7aWYoZz4xMDczNzQxODI0L2gpcmV0dXJuIG51bGw7Zz1uZXcgZCgoaCpnK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCkrMzE+Pj41LCExKTt2YXIgbD0xMD5iP2I6MTAsdj0xMDxiP2ItMTA6MDtpZigwPT0oYiZiLTEpKXtoPj49ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ7dmFyIEI9W10sbj1bXSxBPVxuITE7ZG97Zm9yKHZhciBELHU9cD0wOzspe2lmKGYtNDg+Pj4wPGwpRD1mLTQ4O2Vsc2UgaWYoKDMyfGYpLTk3Pj4+MDx2KUQ9KDMyfGYpLTg3O2Vsc2V7QT0hMDticmVha31pZih1Kz1oLHA9cDw8aHxELCsraz09PWUpe0E9ITA7YnJlYWt9aWYoZj1hLmNoYXJDb2RlQXQoayksMzI8dStoKWJyZWFrfUIucHVzaChwKTtuLnB1c2godSl9d2hpbGUoIUEpO2QuX19maWxsRnJvbVBhcnRzKGcsQixuKX1lbHNle2cuX19pbml0aWFsaXplRGlnaXRzKCk7Qj0hMTtuPTA7ZG97QT0wO2ZvcihEPTE7Oyl7aWYoZi00OD4+PjA8bClwPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpcD0oMzJ8ZiktODc7ZWxzZXtCPSEwO2JyZWFrfXU9RCpiO2lmKDQyOTQ5NjcyOTU8dSlicmVhaztpZihEPXUsQT1BKmIrcCxuKyssKytrPT09ZSl7Qj0hMDticmVha31mPWEuY2hhckNvZGVBdChrKX1wPTMyKmQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtnLl9faW5wbGFjZU11bHRpcGx5QWRkKEQsXG5BLGgqbitwPj4+ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQrNSl9d2hpbGUoIUIpfWlmKGshPT1lKXtpZighZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbDtmb3IoaysrO2s8ZTtrKyspaWYoZj1hLmNoYXJDb2RlQXQoayksIWQuX19pc1doaXRlc3BhY2UoZikpcmV0dXJuIG51bGx9cmV0dXJuIDAhPT1jJiYxMCE9PWI/bnVsbDooZy5zaWduPS0xPT09YyxnLl9fdHJpbSgpKX19LHtrZXk6XCJfX2ZpbGxGcm9tUGFydHNcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjPTAsZT0wLGs9MCxmPWIubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBnPWJbZl0saD1kW2ZdO2V8PWc8PGs7ays9aDszMj09PWs/KGEuX19zZXREaWdpdChjKyssZSksaz0wLGU9MCk6MzI8ayYmKGEuX19zZXREaWdpdChjKyssZSksay09MzIsZT1nPj4+aC1rKX1pZigwIT09ZSl7aWYoYz49YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7YS5fX3NldERpZ2l0KGMrKyxlKX1mb3IoO2M8XG5hLmxlbmd0aDtjKyspYS5fX3NldERpZ2l0KGMsMCl9fSx7a2V5OlwiX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxlPWItMTtlPSg4NSZlPj4+MSkrKDg1JmUpO2U9KDUxJmU+Pj4yKSsoNTEmZSk7ZT0oMTUmZT4+PjQpKygxNSZlKTstLWI7dmFyIGs9YS5fX2RpZ2l0KGMtMSksZj1kLl9fY2x6MzIoayksZz0wfCgzMipjLWYrZS0xKS9lO2lmKGEuc2lnbiYmZysrLDI2ODQzNTQ1NjxnKXRocm93IEVycm9yKFwic3RyaW5nIHRvbyBsb25nXCIpO2Y9QXJyYXkoZyk7LS1nO2Zvcih2YXIgaD0wLHA9MCxsPTA7bDxjLTE7bCsrKXt2YXIgdj1hLl9fZGlnaXQobCk7aD0oaHx2PDxwKSZiO2ZbZy0tXT1kLl9fa0NvbnZlcnNpb25DaGFyc1toXTtwPWUtcDtoPXY+Pj5wO2ZvcihwPTMyLXA7cD49ZTspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lLHAtPWV9ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzWyhofGs8PFxucCkmYl07Zm9yKGg9az4+PmUtcDswIT09aDspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lO2lmKGEuc2lnbiYmKGZbZy0tXT1cIi1cIiksLTEhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBmLmpvaW4oXCJcIil9fSx7a2V5OlwiX190b1N0cmluZ0dlbmVyaWNcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGg7aWYoMD09PWUpcmV0dXJuXCJcIjtpZigxPT09ZSlyZXR1cm4gYj1hLl9fdW5zaWduZWREaWdpdCgwKS50b1N0cmluZyhiKSwhMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYjt2YXIgaz0zMiplLWQuX19jbHozMihhLl9fZGlnaXQoZS0xKSk7ZT1kLl9fa01heEJpdHNQZXJDaGFyW2JdLTE7ayo9ZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcjtlPSgwfChrKyhlLTEpKS9lKSsxPj4xO2s9ZC5leHBvbmVudGlhdGUoZC5fX29uZURpZ2l0KGIsITEpLGQuX19vbmVEaWdpdChlLCExKSk7dmFyIGY9ay5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5pZigxPT09ay5sZW5ndGgmJjY1NTM1Pj1mKXtrPW5ldyBkKGEubGVuZ3RoLCExKTtrLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBnPTA7Zm9yKHZhciBoPTIqYS5sZW5ndGgtMTswPD1oO2gtLSlnPWc8PDE2fGEuX19oYWxmRGlnaXQoaCksay5fX3NldEhhbGZEaWdpdChoLDB8Zy9mKSxnPTB8ZyVmO2Y9Zy50b1N0cmluZyhiKX1lbHNlIGY9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxrLCEwLCEwKSxrPWYucXVvdGllbnQsZj1mLnJlbWFpbmRlci5fX3RyaW0oKSxmPWQuX190b1N0cmluZ0dlbmVyaWMoZixiLCEwKTtrLl9fdHJpbSgpO2ZvcihiPWQuX190b1N0cmluZ0dlbmVyaWMoayxiLCEwKTtmLmxlbmd0aDxlOylmPVwiMFwiK2Y7cmV0dXJuITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGIrZn19LHtrZXk6XCJfX3VuZXF1YWxTaWduXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/LTE6MX19LHtrZXk6XCJfX2Fic29sdXRlR3JlYXRlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP1xuLTE6MX19LHtrZXk6XCJfX2Fic29sdXRlTGVzc1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhPzE6LTF9fSx7a2V5OlwiX19jb21wYXJlVG9CaWdJbnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtpZihjIT09Yi5zaWduKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oYyk7YT1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik7cmV0dXJuIDA8YT9kLl9fYWJzb2x1dGVHcmVhdGVyKGMpOjA+YT9kLl9fYWJzb2x1dGVMZXNzKGMpOjB9fSx7a2V5OlwiX19jb21wYXJlVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDF8Yil7dmFyIGU9YS5zaWduLGs9MD5iO2lmKGUhPT1rKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oZSk7aWYoMD09PWEubGVuZ3RoKXtpZihrKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiAwPT09Yj8wOi0xfWlmKDE8YS5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoZSk7Yj1jKGIpO2E9YS5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5yZXR1cm4gYT5iP2QuX19hYnNvbHV0ZUdyZWF0ZXIoZSk6YTxiP2QuX19hYnNvbHV0ZUxlc3MoZSk6MH1yZXR1cm4gZC5fX2NvbXBhcmVUb0RvdWJsZShhLGIpfX0se2tleTpcIl9fY29tcGFyZVRvRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiIT09YilyZXR1cm4gYjtpZihiPT09MS8wKXJldHVybi0xO2lmKC1JbmZpbml0eT09PWIpcmV0dXJuIDE7dmFyIGM9YS5zaWduO2lmKGMhPT0wPmIpcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTtpZigwPT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Zzogc2hvdWxkIGJlIGhhbmRsZWQgZWxzZXdoZXJlXCIpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4tMTtkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF09YjtiPTIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwO2lmKDIwNDc9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWc6IGhhbmRsZWQgZWxzZXdoZXJlXCIpO3ZhciBlPWItMTAyMztpZigwPmUpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoYyk7XG5iPWEubGVuZ3RoO3ZhciBrPWEuX19kaWdpdChiLTEpLGY9ZC5fX2NsejMyKGspLGc9MzIqYi1mO2UrPTE7aWYoZzxlKXJldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpO2lmKGc+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtlPTEwNDg1NzZ8MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdO3ZhciBoPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07Zj0zMS1mO2lmKGYhPT0oZy0xKSUzMSl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtpZigyMD5mKXt2YXIgcD0yMC1mO2Y9cCszMjtnPWU+Pj5wO2U9ZTw8MzItcHxoPj4+cDtoPDw9MzItcH1lbHNlIDIwPT09Zj8oZj0zMixnPWUsZT1oKToocD1mLTIwLGY9MzItcCxnPWU8PHB8aD4+PjMyLXAsZT1oPDxwKTtpZihrPj4+PTAsZz4+Pj0wLGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7Zm9yKGItPTI7MDw9YjtiLS0pezA8Zj8oZi09XG4zMixnPWU+Pj4wLGU9aCxoPTApOmc9MDtrPWEuX191bnNpZ25lZERpZ2l0KGIpO2lmKGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyl9aWYoMCE9PWV8fDAhPT1oKXtpZigwPT09Zil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1yZXR1cm4gMH19LHtrZXk6XCJfX2VxdWFsVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBifDA9PT1iPzA9PT1iPzA9PT1hLmxlbmd0aDoxPT09YS5sZW5ndGgmJmEuc2lnbj09PTA+YiYmYS5fX3Vuc2lnbmVkRGlnaXQoMCk9PT1jKGIpOjA9PT1kLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJpc29uUmVzdWx0VG9Cb29sXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiAwPmE7Y2FzZSAxOnJldHVybiAwPj1hO2Nhc2UgMjpyZXR1cm4gMDxhO2Nhc2UgMzpyZXR1cm4gMDw9XG5hfXRocm93IEVycm9yKFwidW5yZWFjaGFibGVcIik7fX0se2tleTpcIl9fY29tcGFyZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSYmXCJzdHJpbmdcIj09dHlwZW9mIGIpc3dpdGNoKGMpe2Nhc2UgMDpyZXR1cm4gYTxiO2Nhc2UgMTpyZXR1cm4gYTw9YjtjYXNlIDI6cmV0dXJuIGE+YjtjYXNlIDM6cmV0dXJuIGE+PWJ9aWYoZC5fX2lzQmlnSW50KGEpJiZcInN0cmluZ1wiPT10eXBlb2YgYilyZXR1cm4gYj1kLl9fZnJvbVN0cmluZyhiKSxudWxsIT09YiYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGE9ZC5fX2Zyb21TdHJpbmcoYSksbnVsbCE9PWEmJmQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtcbmlmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpKXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihhLGIpLGMpfWlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihiLGEpLDJeYyk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1jP2E8YjoxPT09Yz9hPD1iOjI9PT1jP2E+YjozPT09Yz9hPj1iOlxudm9pZCAwfX0se2tleTpcIl9fYWJzb2x1dGVBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYS5sZW5ndGg8Yi5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUFkZChiLGEsYyk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTt2YXIgZT1hLmxlbmd0aDsoMD09PWEuX19jbHptc2QoKXx8Yi5sZW5ndGg9PT1hLmxlbmd0aCYmMD09PWIuX19jbHptc2QoKSkmJmUrKztjPW5ldyBkKGUsYyk7Zm9yKHZhciBrPWU9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9Yi5fX2RpZ2l0KGspLGc9YS5fX2RpZ2l0KGspLGg9KDY1NTM1JmcpKyg2NTUzNSZmKStlO2Y9KGc+Pj4xNikrKGY+Pj4xNikrKGg+Pj4xNik7ZT1mPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKStlLGg9KGg+Pj4xNikrKGI+Pj4xNiksZT1oPj4+XG4xNixjLl9fc2V0RGlnaXQoayw2NTUzNSZifGg8PDE2KTtyZXR1cm4gazxjLmxlbmd0aCYmYy5fX3NldERpZ2l0KGssZSksYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEuc2lnbj09PWM/YTpkLnVuYXJ5TWludXMoYSk7Yz1uZXcgZChhLmxlbmd0aCxjKTtmb3IodmFyIGU9MCxrPTA7azxiLmxlbmd0aDtrKyspe3ZhciBmPWEuX19kaWdpdChrKSxnPWIuX19kaWdpdChrKSxoPSg2NTUzNSZmKS0oNjU1MzUmZyktZTtlPTEmaD4+PjE2O2Y9KGY+Pj4xNiktKGc+Pj4xNiktZTtlPTEmZj4+PjE2O2MuX19zZXREaWdpdChrLDY1NTM1Jmh8Zjw8MTYpfWZvcig7azxhLmxlbmd0aDtrKyspaD1hLl9fZGlnaXQoayksYj0oNjU1MzUmaCktZSxlPTEmYj4+PjE2LGg9KGg+Pj4xNiktZSxlPTEmaD4+PjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO1xucmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZE9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aDtudWxsPT09Yz9jPW5ldyBkKGUsYik6Yy5zaWduPWI7Zm9yKHZhciBrLGY9ITAsZz0wO2c8ZTtnKyspe2lmKGs9YS5fX2RpZ2l0KGcpLGYpZj0tMT09PWssaz0wfGsrMTtjLl9fc2V0RGlnaXQoZyxrKX1yZXR1cm4gZiYmYy5fX3NldERpZ2l0R3JvdyhlLDEpLGN9fSx7a2V5OlwiX19hYnNvbHV0ZVN1Yk9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGg7Yj1ifHxjO2Zvcih2YXIgZSxrPW5ldyBkKGIsITEpLGY9ITAsZz0wO2c8YztnKyspe2lmKGU9YS5fX2RpZ2l0KGcpLGYpZj0wPT09ZSxlPTB8ZS0xO2suX19zZXREaWdpdChnLGUpfWlmKGYpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7Zm9yKGE9YzthPFxuYjthKyspay5fX3NldERpZ2l0KGEsMCk7cmV0dXJuIGt9fSx7a2V5OlwiX19hYnNvbHV0ZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztlPGsmJihmPWUsZT1hLGE9YixiPWUpO2U9ZjtudWxsPT09Yz9jPW5ldyBkKGUsITEpOmU9Yy5sZW5ndGg7Zm9yKGs9MDtrPGY7aysrKWMuX19zZXREaWdpdChrLGEuX19kaWdpdChrKSZiLl9fZGlnaXQoaykpO2Zvcig7azxlO2srKyljLl9fc2V0RGlnaXQoaywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlQW5kTm90XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSk7az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6XG5rPWMubGVuZ3RoO2Zvcih2YXIgZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpJn5iLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyl8Yi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSxcbntrZXk6XCJfX2Fic29sdXRlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpXmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVDb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aC1iLmxlbmd0aDtpZigwIT1kKXJldHVybiBkO2ZvcihkPWEubGVuZ3RoLTE7MDw9ZCYmYS5fX2RpZ2l0KGQpPT09Yi5fX2RpZ2l0KGQpOylkLS07cmV0dXJuIDA+ZD8wOmEuX191bnNpZ25lZERpZ2l0KGQpPlxuYi5fX3Vuc2lnbmVkRGlnaXQoZCk/MTotMX19LHtrZXk6XCJfX211bHRpcGx5QWNjdW11bGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUpe2lmKDAhPT1iKXtmb3IodmFyIGs9NjU1MzUmYixmPWI+Pj4xNixnPWI9MCxoPTAscD0wO3A8YS5sZW5ndGg7cCsrLGUrKyl7dmFyIGw9Yy5fX2RpZ2l0KGUpLHY9NjU1MzUmbDtsPj4+PTE2O3ZhciBCPWEuX19kaWdpdChwKSxuPTY1NTM1JkIsQT1CPj4+MTY7Qj1kLl9faW11bChuLGspO249ZC5fX2ltdWwobixmKTt2YXIgRD1kLl9faW11bChBLGspO0E9ZC5fX2ltdWwoQSxmKTt2Kz1nKyg2NTUzNSZCKTtsKz1oK2IrKHY+Pj4xNikrKEI+Pj4xNikrKDY1NTM1Jm4pKyg2NTUzNSZEKTtiPWw+Pj4xNjtnPShuPj4+MTYpKyhEPj4+MTYpKyg2NTUzNSZBKStiO2I9Zz4+PjE2O2cmPTY1NTM1O2g9QT4+PjE2O2w9NjU1MzUmdnxsPDwxNjtjLl9fc2V0RGlnaXQoZSxsKX1mb3IoOzAhPT1ifHwwIT09Z3x8MCE9PWg7ZSsrKWs9Yy5fX2RpZ2l0KGUpLGE9XG4oNjU1MzUmaykrZyxrPShrPj4+MTYpKyhhPj4+MTYpK2grYixoPWc9MCxiPWs+Pj4xNixrPTY1NTM1JmF8azw8MTYsYy5fX3NldERpZ2l0KGUsayl9fX0se2tleTpcIl9faW50ZXJuYWxNdWx0aXBseUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUsayl7Zm9yKHZhciBmPTAsZz0wO2c8ZTtnKyspe3ZhciBoPWEuX19kaWdpdChnKSxwPWQuX19pbXVsKDY1NTM1JmgsYiksbD0oNjU1MzUmcCkrZitjO2M9bD4+PjE2O2Y9ZC5fX2ltdWwoaD4+PjE2LGIpO3A9KDY1NTM1JmYpKyhwPj4+MTYpK2M7Yz1wPj4+MTY7Zj4+Pj0xNjtrLl9fc2V0RGlnaXQoZyxwPDwxNnw2NTUzNSZsKX1pZihrLmxlbmd0aD5lKWZvcihrLl9fc2V0RGlnaXQoZSsrLGMrZik7ZTxrLmxlbmd0aDspay5fX3NldERpZ2l0KGUrKywwKTtlbHNlIGlmKDAhPT1jK2YpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9fYWJzb2x1dGVEaXZTbWFsbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtudWxsPT09XG5jJiYoYz1uZXcgZChhLmxlbmd0aCwhMSkpO2Zvcih2YXIgZT0wLGs9MiphLmxlbmd0aC0xOzA8PWs7ay09Mil7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrKSk+Pj4wO3ZhciBmPTB8ZS9iO2U9MHxlJWI7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrLTEpKT4+PjA7dmFyIGc9MHxlL2I7ZT0wfGUlYjtjLl9fc2V0RGlnaXQoaz4+PjEsZjw8MTZ8Zyl9cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU1vZFNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wO2Zvcih2YXIgYz0yKmEubGVuZ3RoLTE7MDw9YztjLS0pZD0oZDw8MTZ8YS5fX2hhbGZEaWdpdChjKSk+Pj4wLGQ9MHxkJWI7cmV0dXJuIGR9fSx7a2V5OlwiX19hYnNvbHV0ZURpdkxhcmdlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGs9Yi5fX2hhbGZEaWdpdExlbmd0aCgpLGY9Yi5sZW5ndGgsZz1hLl9faGFsZkRpZ2l0TGVuZ3RoKCktayxoPW51bGw7YyYmKGg9bmV3IGQoZysyPj4+MSwhMSksaC5fX2luaXRpYWxpemVEaWdpdHMoKSk7XG52YXIgcD1uZXcgZChrKzI+Pj4xLCExKTtwLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBsPWQuX19jbHoxNihiLl9faGFsZkRpZ2l0KGstMSkpOzA8bCYmKGI9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYixsLDApKTthPWQuX19zcGVjaWFsTGVmdFNoaWZ0KGEsbCwxKTtmb3IodmFyIHY9Yi5fX2hhbGZEaWdpdChrLTEpLEI9MDswPD1nO2ctLSl7dmFyIG49NjU1MzUsQT1hLl9faGFsZkRpZ2l0KGcrayk7aWYoQSE9PXYpe0E9KEE8PDE2fGEuX19oYWxmRGlnaXQoZytrLTEpKT4+PjA7bj0wfEEvdjtBPTB8QSV2O2Zvcih2YXIgRD1iLl9faGFsZkRpZ2l0KGstMiksdT1hLl9faGFsZkRpZ2l0KGcray0yKTtkLl9faW11bChuLEQpPj4+MD4oQTw8MTZ8dSk+Pj4wJiYobi0tLEErPXYsISg2NTUzNTxBKSk7KTt9ZC5fX2ludGVybmFsTXVsdGlwbHlBZGQoYixuLDAsZixwKTtBPWEuX19pbnBsYWNlU3ViKHAsZyxrKzEpOzAhPT1BJiYoQT1hLl9faW5wbGFjZUFkZChiLGcsayksYS5fX3NldEhhbGZEaWdpdChnK1xuayxhLl9faGFsZkRpZ2l0KGcraykrQSksbi0tKTtjJiYoMSZnP0I9bjw8MTY6aC5fX3NldERpZ2l0KGc+Pj4xLEJ8bikpfXJldHVybiBlPyhhLl9faW5wbGFjZVJpZ2h0U2hpZnQobCksYz97cXVvdGllbnQ6aCxyZW1haW5kZXI6YX06YSk6Yz9oOnZvaWQgMH19LHtrZXk6XCJfX2NsejE2XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX19jbHozMihhKS0xNn19LHtrZXk6XCJfX3NwZWNpYWxMZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGgsaz1uZXcgZChlK2MsITEpO2lmKDA9PT1iKXtmb3IoYj0wO2I8ZTtiKyspay5fX3NldERpZ2l0KGIsYS5fX2RpZ2l0KGIpKTtyZXR1cm4gMDxjJiZrLl9fc2V0RGlnaXQoZSwwKSxrfWZvcih2YXIgZixnPTAsaD0wO2g8ZTtoKyspZj1hLl9fZGlnaXQoaCksay5fX3NldERpZ2l0KGgsZjw8YnxnKSxnPWY+Pj4zMi1iO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLGcpLGt9fSx7a2V5OlwiX19sZWZ0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQuX190b1NoaWZ0QW1vdW50KGIpO2lmKDA+Yyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2I9Yz4+PjU7dmFyIGU9MzEmYyxrPWEubGVuZ3RoLGY9MCE9PWUmJjAhPWEuX19kaWdpdChrLTEpPj4+MzItZSxnPWsrYisoZj8xOjApO2M9bmV3IGQoZyxhLnNpZ24pO2lmKDA9PT1lKXtmb3IoZT0wO2U8YjtlKyspYy5fX3NldERpZ2l0KGUsMCk7Zm9yKDtlPGc7ZSsrKWMuX19zZXREaWdpdChlLGEuX19kaWdpdChlLWIpKX1lbHNle2Zvcih2YXIgaD1nPTA7aDxiO2grKyljLl9fc2V0RGlnaXQoaCwwKTtmb3IodmFyIHA9MDtwPGs7cCsrKWg9YS5fX2RpZ2l0KHApLGMuX19zZXREaWdpdChwK2IsaDw8ZXxnKSxnPWg+Pj4zMi1lO2lmKGYpYy5fX3NldERpZ2l0KGsrYixnKTtlbHNlIGlmKDAhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO31yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9YS5zaWduLGs9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5rKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtiPWs+Pj41O3ZhciBmPTMxJmssZz1jLWI7aWYoMD49ZylyZXR1cm4gZC5fX3JpZ2h0U2hpZnRCeU1heGltdW0oZSk7az0hMTtpZihlKWlmKDAhPShhLl9fZGlnaXQoYikmKDE8PGYpLTEpKWs9ITA7ZWxzZSBmb3IodmFyIGg9MDtoPGI7aCsrKWlmKDAhPT1hLl9fZGlnaXQoaCkpe2s9ITA7YnJlYWt9ayYmMD09PWYmJjA9PX5hLl9fZGlnaXQoYy0xKSYmZysrO2U9bmV3IGQoZyxlKTtpZigwPT09Zilmb3IoZj1iO2Y8YztmKyspZS5fX3NldERpZ2l0KGYtYixhLl9fZGlnaXQoZikpO2Vsc2V7Zz1hLl9fZGlnaXQoYik+Pj5mO2g9Yy1iLTE7Zm9yKHZhciBwPTA7cDxoO3ArKyljPWEuX19kaWdpdChwK2IrMSksZS5fX3NldERpZ2l0KHAsYzw8MzItZnxnKSxnPWM+Pj5mO2UuX19zZXREaWdpdChoLGcpfXJldHVybiBrJiZcbihlPWQuX19hYnNvbHV0ZUFkZE9uZShlLCEwLGUpKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5TWF4aW11bVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP2QuX19vbmVEaWdpdCgxLCEwKTpkLl9femVybygpfX0se2tleTpcIl9fdG9TaGlmdEFtb3VudFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDE8YS5sZW5ndGgpcmV0dXJuLTE7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYT5kLl9fa01heExlbmd0aEJpdHM/LTE6YX19LHtrZXk6XCJfX3RvUHJpbWl0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwiZGVmYXVsdFwiO2lmKFwib2JqZWN0XCIhPT1hKGIpfHxiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjt2YXIgZT1iW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYoZSl7Yz1lKGMpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufWlmKGM9Yi52YWx1ZU9mKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO2lmKGM9Yi50b1N0cmluZylpZihjPWMuY2FsbChiKSxcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTt9fSx7a2V5OlwiX190b051bWVyaWNcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2lzQmlnSW50KGEpP2E6K2F9fSx7a2V5OlwiX19pc0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVyblwib2JqZWN0XCI9PT1hKGIpJiZiLmNvbnN0cnVjdG9yPT09ZH19LHtrZXk6XCJfX3RydW5jYXRlVG9OQml0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YSszMT4+PjUsZT1uZXcgZChjLGIuc2lnbik7LS1jO2Zvcih2YXIgaz0wO2s8YztrKyspZS5fX3NldERpZ2l0KGssYi5fX2RpZ2l0KGspKTtiPWIuX19kaWdpdChjKTswIT0oMzEmYSkmJihhPTMyLSgzMSZhKSxiPWI8PGE+Pj5cbmEpO3JldHVybiBlLl9fc2V0RGlnaXQoYyxiKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3b1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1NYXRoLm1pbixrPWErMzE+Pj41O2M9bmV3IGQoayxjKTt2YXIgZj0wOy0tazt2YXIgZz0wO2ZvcihlPWUoayxiLmxlbmd0aCk7ZjxlO2YrKyl7dmFyIGg9Yi5fX2RpZ2l0KGYpLHA9LSg2NTUzNSZoKS1nO2c9MSZwPj4+MTY7aD0tKGg+Pj4xNiktZztnPTEmaD4+PjE2O2MuX19zZXREaWdpdChmLDY1NTM1JnB8aDw8MTYpfWZvcig7ZjxrO2YrKyljLl9fc2V0RGlnaXQoZiwwfC1nKTtiPWs8Yi5sZW5ndGg/Yi5fX2RpZ2l0KGspOjA7YSY9MzE7MD09PWE/KGc9LSg2NTUzNSZiKS1nLGc9NjU1MzUmZ3wtKGI+Pj4xNiktKDEmZz4+PjE2KTw8MTYpOihhPTMyLWEsYj1iPDxhPj4+YSxhPTE8PDMyLWEsZz0oNjU1MzUmYSktKDY1NTM1JmIpLWcsZz0oNjU1MzUmZ3woYT4+PjE2KS0oYj4+PjE2KS0oMSZnPj4+XG4xNik8PDE2KSZhLTEpO3JldHVybiBjLl9fc2V0RGlnaXQoayxnKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fZGlnaXRQb3dcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0xOzA8YjspMSZiJiYoZCo9YSksYj4+Pj0xLGEqPWE7cmV0dXJuIGR9fV0pLGR9KG4oQXJyYXkpKTtyZXR1cm4gQi5fX2tNYXhMZW5ndGg9MzM1NTQ0MzIsQi5fX2tNYXhMZW5ndGhCaXRzPUIuX19rTWF4TGVuZ3RoPDw1LEIuX19rTWF4Qml0c1BlckNoYXI9WzAsMCwzMiw1MSw2NCw3NSw4Myw5MCw5NiwxMDIsMTA3LDExMSwxMTUsMTE5LDEyMiwxMjYsMTI4LDEzMSwxMzQsMTM2LDEzOSwxNDEsMTQzLDE0NSwxNDcsMTQ5LDE1MSwxNTMsMTU0LDE1NiwxNTgsMTU5LDE2MCwxNjIsMTYzLDE2NSwxNjZdLEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0PTUsQi5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcj0xPDxCLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCxCLl9fa0NvbnZlcnNpb25DaGFycz1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLnNwbGl0KFwiXCIpLFxuQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig4KSxCLl9fa0JpdENvbnZlcnNpb25Eb3VibGU9bmV3IEZsb2F0NjRBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19rQml0Q29udmVyc2lvbkludHM9bmV3IEludDMyQXJyYXkoQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyKSxCLl9fY2x6MzI9dnx8ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5MTjIsZD1NYXRoLmxvZztyZXR1cm4gMD09PWE/MzI6MHwzMS0oMHxkKGE+Pj4wKS9iKX0sQi5fX2ltdWw9dHx8ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMHxhKmJ9LEJ9KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoYSl7ZGVsZXRlIHRbYV19ZnVuY3Rpb24gZihhKXtpZih2KXNldFRpbWVvdXQoZiwwLGEpO2Vsc2V7dmFyIGI9dFthXTtpZihiKXt2PSEwO3RyeXt2YXIgZD1iLmNhbGxiYWNrLGs9Yi5hcmdzO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAwOmQoKTtcbmJyZWFrO2Nhc2UgMTpkKGtbMF0pO2JyZWFrO2Nhc2UgMjpkKGtbMF0sa1sxXSk7YnJlYWs7Y2FzZSAzOmQoa1swXSxrWzFdLGtbMl0pO2JyZWFrO2RlZmF1bHQ6ZC5hcHBseShjLGspfX1maW5hbGx5e2UoYSksdj0hMX19fX1mdW5jdGlvbiBkKCl7RD1mdW5jdGlvbihhKXtiLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZihhKX0pfX1mdW5jdGlvbiBnKCl7aWYoYS5wb3N0TWVzc2FnZSYmIWEuaW1wb3J0U2NyaXB0cyl7dmFyIGI9ITAsZD1hLm9ubWVzc2FnZTthLm9ubWVzc2FnZT1mdW5jdGlvbigpe2I9ITF9O2EucG9zdE1lc3NhZ2UoXCJcIixcIipcIik7YS5vbm1lc3NhZ2U9ZDtyZXR1cm4gYn19ZnVuY3Rpb24gbigpe3ZhciBiPVwic2V0SW1tZWRpYXRlJFwiK01hdGgucmFuZG9tKCkrXCIkXCIsZD1mdW5jdGlvbihkKXtkLnNvdXJjZT09PWEmJlwic3RyaW5nXCI9PT10eXBlb2YgZC5kYXRhJiYwPT09ZC5kYXRhLmluZGV4T2YoYikmJmYoK2QuZGF0YS5zbGljZShiLmxlbmd0aCkpfTthLmFkZEV2ZW50TGlzdGVuZXI/XG5hLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsZCwhMSk6YS5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLGQpO0Q9ZnVuY3Rpb24oZCl7YS5wb3N0TWVzc2FnZShiK2QsXCIqXCIpfX1mdW5jdGlvbiBrKCl7dmFyIGE9bmV3IE1lc3NhZ2VDaGFubmVsO2EucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKGEpe2YoYS5kYXRhKX07RD1mdW5jdGlvbihiKXthLnBvcnQyLnBvc3RNZXNzYWdlKGIpfX1mdW5jdGlvbiBwKCl7dmFyIGE9Qi5kb2N1bWVudEVsZW1lbnQ7RD1mdW5jdGlvbihiKXt2YXIgZD1CLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtmKGIpO2Qub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7YS5yZW1vdmVDaGlsZChkKTtkPW51bGx9O2EuYXBwZW5kQ2hpbGQoZCl9fWZ1bmN0aW9uIHUoKXtEPWZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZiwwLGEpfX1pZighYS5zZXRJbW1lZGlhdGUpe3ZhciBBPTEsdD17fSx2PSExLEI9YS5kb2N1bWVudCxcbkQsRT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtFPUUmJkUuc2V0VGltZW91dD9FOmE7XCJbb2JqZWN0IHByb2Nlc3NdXCI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/ZCgpOmcoKT9uKCk6YS5NZXNzYWdlQ2hhbm5lbD9rKCk6QiYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIEIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9wKCk6dSgpO0Uuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiYoYT1uZXcgRnVuY3Rpb24oXCJcIithKSk7Zm9yKHZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF09YXJndW1lbnRzW2QrMV07dFtBXT17Y2FsbGJhY2s6YSxhcmdzOmJ9O0QoQSk7cmV0dXJuIEErK307RS5jbGVhckltbWVkaWF0ZT1lfX0pKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/dGhpczphOnNlbGYpfSkuY2FsbCh0aGlzLFxuYSgwKSxhKDgpKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7dGhyb3cgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpO31mdW5jdGlvbiBjKCl7dGhyb3cgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGIoYil7aWYoZz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYiwwKTtpZigoZz09PWF8fCFnKSYmc2V0VGltZW91dClyZXR1cm4gZz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYiwwKTt0cnl7cmV0dXJuIGcoYiwwKX1jYXRjaCh2KXt0cnl7cmV0dXJuIGcuY2FsbChudWxsLGIsMCl9Y2F0Y2goQil7cmV0dXJuIGcuY2FsbCh0aGlzLGIsMCl9fX1mdW5jdGlvbiBlKGEpe2lmKG49PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigobj09PWN8fCFuKSYmY2xlYXJUaW1lb3V0KXJldHVybiBuPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBuKGEpfWNhdGNoKHYpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsXG5hKX1jYXRjaChCKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBmKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/az11LmNvbmNhdChrKTpBPS0xLGsubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighcCl7dmFyIGE9YihmKTtwPSEwO2Zvcih2YXIgZD1rLmxlbmd0aDtkOyl7dT1rO2ZvcihrPVtdOysrQTxkOyl1JiZ1W0FdLnJ1bigpO0E9LTE7ZD1rLmxlbmd0aH11PW51bGw7cD0hMTtlKGEpfX1mdW5jdGlvbiBoKGEsYil7dGhpcy5mdW49YTt0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gZCgpe31tPW0uZXhwb3J0cz17fTt0cnl7dmFyIGc9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDphfWNhdGNoKHQpe2c9YX10cnl7dmFyIG49XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6Y31jYXRjaCh0KXtuPWN9dmFyIGs9W10scD0hMSx1LEE9LTE7bS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLVxuMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZFtjLTFdPWFyZ3VtZW50c1tjXTtrLnB1c2gobmV3IGgoYSxkKSk7MSE9PWsubGVuZ3RofHxwfHxiKGwpfTtoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTttLnRpdGxlPVwiYnJvd3NlclwiO20uYnJvd3Nlcj0hMDttLmVudj17fTttLmFyZ3Y9W107bS52ZXJzaW9uPVwiXCI7bS52ZXJzaW9ucz17fTttLm9uPWQ7bS5hZGRMaXN0ZW5lcj1kO20ub25jZT1kO20ub2ZmPWQ7bS5yZW1vdmVMaXN0ZW5lcj1kO20ucmVtb3ZlQWxsTGlzdGVuZXJzPWQ7bS5lbWl0PWQ7bS5wcmVwZW5kTGlzdGVuZXI9ZDttLnByZXBlbmRPbmNlTGlzdGVuZXI9ZDttLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm5bXX07bS5iaW5kaW5nPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLmN3ZD1cbmZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9O20uY2hkaXI9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihtLHEpe1NrLmFzc2VydHM9e307U2suYXNzZXJ0cy5hc3NlcnQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5hc3NlcnRcIixTay5hc3NlcnRzLmFzc2VydCk7U2suYXNzZXJ0cy5mYWlsPWZ1bmN0aW9uKGEpe307U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5mYWlsXCIsU2suYXNzZXJ0cy5mYWlsKX0sZnVuY3Rpb24obSxxKXtTay5ib29sX2NoZWNrPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fFwiYm9vbGVhblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJtdXN0IHNwZWNpZnkgXCIrYytcIiBhbmQgaXQgbXVzdCBiZSBhIGJvb2xlYW5cIik7fTtTay5weXRob24yPXtwcmludF9mdW5jdGlvbjohMSxcbmRpdmlzaW9uOiExLGFic29sdXRlX2ltcG9ydDpudWxsLHVuaWNvZGVfbGl0ZXJhbHM6ITEscHl0aG9uMzohMSxjbGFzc19yZXByOiExLGluaGVyaXRfZnJvbV9vYmplY3Q6ITEsc3VwZXJfYXJnczohMSxvY3RhbF9udW1iZXJfbGl0ZXJhbDohMSxiYW5rZXJzX3JvdW5kaW5nOiExLHB5dGhvbl92ZXJzaW9uOiExLGR1bmRlcl9yb3VuZDohMSxleGNlcHRpb25zOiExLG5vX2xvbmdfdHlwZTohMSxjZWlsX2Zsb29yX2ludDohMSxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMH07U2sucHl0aG9uMz17cHJpbnRfZnVuY3Rpb246ITAsZGl2aXNpb246ITAsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMCxweXRob24zOiEwLGNsYXNzX3JlcHI6ITAsaW5oZXJpdF9mcm9tX29iamVjdDohMCxzdXBlcl9hcmdzOiEwLG9jdGFsX251bWJlcl9saXRlcmFsOiEwLGJhbmtlcnNfcm91bmRpbmc6ITAscHl0aG9uX3ZlcnNpb246ITAsZHVuZGVyX3JvdW5kOiEwLGV4Y2VwdGlvbnM6ITAsXG5ub19sb25nX3R5cGU6ITAsY2VpbF9mbG9vcl9pbnQ6ITAsc2lsZW50X29jdGFsX2xpdGVyYWw6ITF9O1NrLmNvbmZpZ3VyZT1mdW5jdGlvbihhKXtTay5vdXRwdXQ9YS5vdXRwdXR8fFNrLm91dHB1dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub3V0cHV0KTtTay5maWxld3JpdGVyPWEuZmlsZXdyaXRlcnx8U2suZmlsZXdyaXRlcjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlcik7U2suZGVidWdvdXQ9YS5kZWJ1Z291dHx8U2suZGVidWdvdXQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmRlYnVnb3V0KTtTay51bmNhdWdodEV4Y2VwdGlvbj1hLnVuY2F1Z2h0RXhjZXB0aW9ufHxTay51bmNhdWdodEV4Y2VwdGlvbjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnJlYWQ9YS5yZWFkfHxTay5yZWFkO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIFNrLnJlYWQpO1NrLm5vbnJlYWRvcGVuPWEubm9ucmVhZG9wZW58fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLm5vbnJlYWRvcGVuKTtTay5maWxlb3Blbj1hLmZpbGVvcGVufHx2b2lkIDA7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmZpbGVvcGVufHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGVvcGVuKTtTay5maWxld3JpdGU9YS5maWxld3JpdGV8fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlfHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGV3cml0ZSk7U2sudGltZW91dE1zZz1hLnRpbWVvdXRNc2d8fFNrLnRpbWVvdXRNc2c7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnRpbWVvdXRNc2cpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5zeXNhcmd2PWEuc3lzYXJndnx8XG5Tay5zeXNhcmd2O1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKFNrLnN5c2FyZ3YpKTtTay5fX2Z1dHVyZV9fPWEuX19mdXR1cmVfX3x8U2sucHl0aG9uMztTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24sXCJTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5kaXZpc2lvbixcIlNrLl9fZnV0dXJlX18uZGl2aXNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHMsXCJTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHIsXCJTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3QsXCJTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3RcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MsXG5cIlNrLl9fZnV0dXJlX18uc3VwZXJfYXJnc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nLFwiU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbixcIlNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmR1bmRlcl9yb3VuZCxcIlNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5leGNlcHRpb25zLFwiU2suX19mdXR1cmVfXy5leGNlcHRpb25zXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5ub19sb25nX3R5cGUsXCJTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZVwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQsXG5cIlNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsLFwiU2suX19mdXR1cmVfXy5zaWxlbnRfb2N0YWxfbGl0ZXJhbFwiKTtTay5pbWFnZVByb3h5PWEuaW1hZ2VQcm94eXx8XCJodHRwOi8vbG9jYWxob3N0OjgwODAvMzIweFwiO1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmltYWdlUHJveHkpO1NrLmlucHV0ZnVuPWEuaW5wdXRmdW58fFNrLmlucHV0ZnVuO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5pbnB1dGZ1bik7U2suaW5wdXRmdW5UYWtlc1Byb21wdD1hLmlucHV0ZnVuVGFrZXNQcm9tcHR8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuVGFrZXNQcm9tcHQpO1NrLnJldGFpbkdsb2JhbHM9YS5yZXRhaW5nbG9iYWxzfHxhLnJldGFpbkdsb2JhbHN8fFxuITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sucmV0YWluR2xvYmFscyk7U2suZGVidWdnaW5nPWEuZGVidWdnaW5nfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5kZWJ1Z2dpbmcpO1NrLmtpbGxhYmxlV2hpbGU9YS5raWxsYWJsZVdoaWxlfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZVdoaWxlKTtTay5raWxsYWJsZUZvcj1hLmtpbGxhYmxlRm9yfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZUZvcik7U2suc2lnbmFscz1hLnNpZ25hbHM7U2suc2lnbmFscz0hMD09PVNrLnNpZ25hbHM/e2xpc3RlbmVyczpbXSxhZGRFdmVudExpc3RlbmVyKGEpe1NrLnNpZ25hbHMubGlzdGVuZXJzLnB1c2goYSl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoYSl7YT1Tay5zaWduYWxzLmxpc3RlbmVycy5pbmRleE9mKGEpOzA8PWEmJlNrLnNpZ25hbHMubGlzdGVuZXJzLnNwbGljZShhLFxuMSl9LHNpZ25hbChhLGIpe2Zvcih2YXIgYz0wO2M8U2suc2lnbmFscy5saXN0ZW5lcnMubGVuZ3RoO2MrKylTay5zaWduYWxzLmxpc3RlbmVyc1tjXS5jYWxsKG51bGwsYSxiKX19Om51bGw7U2suYXNzZXJ0cy5hc3NlcnQoXCJvYmplY3RcIj09PXR5cGVvZiBTay5zaWduYWxzKTtTay5icmVha3BvaW50cz1hLmJyZWFrcG9pbnRzfHxmdW5jdGlvbigpe3JldHVybiEwfTtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suYnJlYWtwb2ludHMpO1NrLnNldFRpbWVvdXQ9YS5zZXRUaW1lb3V0O3ZvaWQgMD09PVNrLnNldFRpbWVvdXQmJihTay5zZXRUaW1lb3V0PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKGEsYil7c2V0VGltZW91dChhLGIpfTpmdW5jdGlvbihhLGIpe2EoKX0pO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5zZXRUaW1lb3V0KTtcImV4ZWNMaW1pdFwiaW4gYSYmKFNrLmV4ZWNMaW1pdD1hLmV4ZWNMaW1pdCk7XG5cInlpZWxkTGltaXRcImluIGEmJihTay55aWVsZExpbWl0PWEueWllbGRMaW1pdCk7YS5zeXNwYXRoJiYoU2suc3lzcGF0aD1hLnN5c3BhdGgsU2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzcGF0aCkpLFNrLnJlYWxzeXNwYXRoPXZvaWQgMCxTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLnN3aXRjaF92ZXJzaW9uKFNrLl9fZnV0dXJlX18ucHl0aG9uMyk7U2suYnVpbHRpbi5zdHIuJG5leHQ9U2suX19mdXR1cmVfXy5weXRob24zP25ldyBTay5idWlsdGluLnN0cihcIl9fbmV4dF9fXCIpOm5ldyBTay5idWlsdGluLnN0cihcIm5leHRcIik7U2suc2V0dXBPcGVyYXRvcnMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cER1bmRlck1ldGhvZHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cE9iamVjdHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay50b2tlbi5zZXR1cFRva2VucyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmNvbmZpZ3VyZVwiLFNrLmNvbmZpZ3VyZSk7U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtTay5leHBvcnRTeW1ib2woXCJTay51bmNhdWdodEV4Y2VwdGlvblwiLFNrLnVuY2F1Z2h0RXhjZXB0aW9uKTtTay50aW1lb3V0TXNnPWZ1bmN0aW9uKCl7cmV0dXJuXCJQcm9ncmFtIGV4Y2VlZGVkIHJ1biB0aW1lIGxpbWl0LlwifTtTay5leHBvcnRTeW1ib2woXCJTay50aW1lb3V0TXNnXCIsU2sudGltZW91dE1zZyk7U2suZXhlY0xpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay55aWVsZExpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7fTtTay5yZWFkPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PVNrLmJ1aWx0aW5GaWxlcyl0aHJvd1wic2t1bHB0LXN0ZGxpYi5qcyBoYXMgbm90IGJlZW4gbG9hZGVkXCI7aWYodm9pZCAwPT09XG5Tay5idWlsdGluRmlsZXMuZmlsZXNbYV0pdGhyb3dcIkZpbGUgbm90IGZvdW5kOiAnXCIrYStcIidcIjtyZXR1cm4gU2suYnVpbHRpbkZpbGVzLmZpbGVzW2FdfTtTay5zeXNhcmd2PVtdO1NrLmdldFN5c0FyZ3Y9ZnVuY3Rpb24oKXtyZXR1cm4gU2suc3lzYXJndn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2V0U3lzQXJndlwiLFNrLmdldFN5c0FyZ3YpO1NrLnN5c3BhdGg9W107U2suaW5Ccm93c2VyPXZvaWQgMCE9PVNrLmdsb2JhbC5kb2N1bWVudDtTay5kZWJ1Z291dD1mdW5jdGlvbihhKXt9OyhmdW5jdGlvbigpe3ZvaWQgMCE9PVNrLmdsb2JhbC53cml0ZT8oU2sub3V0cHV0PVNrLmdsb2JhbC53cml0ZSxTay5maWxld3JpdGVyPVNrLmdsb2JhbC53cml0ZSk6dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz8oU2sub3V0cHV0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX0sU2suZmlsZXdyaXRlcj1Tay5vdXRwdXQpOlxudm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2sub3V0cHV0PVNrLmdsb2JhbC5wcmludCxTay5maWxld3JpdGVyPVNrLm91dHB1dCk7dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz9Tay5kZWJ1Z291dD1mdW5jdGlvbihhKXtTay5nbG9iYWwuY29uc29sZS5sb2coYSl9OnZvaWQgMCE9PVNrLmdsb2JhbC5wcmludCYmKFNrLmRlYnVnb3V0PVNrLmdsb2JhbC5wcmludCl9KSgpO1NrLmlucHV0ZnVuPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cucHJvbXB0KGEpfTtTay5zZXR1cF9tZXRob2RfbWFwcGluZ3M9ZnVuY3Rpb24oKXt9O1NrLnNldHVwRGljdEl0ZXJhdG9ycz1mdW5jdGlvbihhKXt9O1NrLnN3aXRjaF92ZXJzaW9uPWZ1bmN0aW9uKGEpe2NvbnN0IGM9e2Zsb2F0Xzp7bWV0aG9kX25hbWVzOltcIl9fcm91bmRfX1wiXSwyOlshMV0sMzpbITBdfSxpbnRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LFxubGlzdDp7bWV0aG9kX25hbWVzOltcImNsZWFyXCIsXCJjb3B5XCIsXCJzb3J0XCJdLDI6WyExLCExLCEwXSwzOlshMCwhMCwhMF19LGRpY3Q6e21ldGhvZF9uYW1lczpbXCJoYXNfa2V5XCIsXCJrZXlzXCIsXCJpdGVtc1wiLFwidmFsdWVzXCJdLDI6WyEwLCEwLCEwLCEwXSwzOlshMSwhMCwhMCwhMF19fTtmb3IobGV0IGwgaW4gYyl7Y29uc3QgaD1Tay5idWlsdGluW2xdLGQ9Y1tsXS5tZXRob2RfbmFtZXM7dmFyIGI9Y1tsXVszXTtpZihhJiZ2b2lkIDA9PT1oLnB5MyRtZXRob2RzKWJyZWFrO2Vsc2UgaWYodm9pZCAwPT09aC5weTMkbWV0aG9kcyl7aC5weTMkbWV0aG9kcz17fTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtiW2VdJiYoaC5weTMkbWV0aG9kc1tmXT1oLnByb3RvdHlwZVtmXS5kJGRlZil9fWE/ZT1oLnB5MyRtZXRob2RzOihiPWNbbF1bMl0sZT1oLnB5MiRtZXRob2RzKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBhPWRbZl07ZGVsZXRlIGgucHJvdG90eXBlW2FdO1xuYltmXSYmKGgucHJvdG90eXBlW2FdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGgsZVthXSkpfX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLl9fZnV0dXJlX19cIixTay5fX2Z1dHVyZV9fKTtTay5leHBvcnRTeW1ib2woXCJTay5pbnB1dGZ1blwiLFNrLmlucHV0ZnVuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX1mdW5jdGlvbiBjKGEpe2E9YS4kbWFuZ2xlZDtjb25zdCBiPXRoaXMucHJvdG90eXBlLnRwJG1ybztmb3IobGV0IGQ9MDtkPGIubGVuZ3RoOysrZCl7Y29uc3QgYz1iW2RdLnByb3RvdHlwZTtpZihjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBjW2FdfX1mdW5jdGlvbiBiKGIsZixoLGspe2NvbnN0IGQ9ZShoKSxnPWYucHJvdG90eXBlO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYixmLGQsayk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZyx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sXG50cCRiYXNlczp7dmFsdWU6aCx3cml0YWJsZTohMH0sdHAkbXJvOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxocCR0eXBlOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KTtnLnRwJG1ybz1mLiRidWlsZE1STygpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYseyR0eXBlTG9va3VwOnt2YWx1ZTpnLnNrJHByb3RvdHlwaWNhbD9hOmMsd3JpdGFibGU6ITB9LHNrJGtsYXNzOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KX1mdW5jdGlvbiBlKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWEuc2ska2xhc3M/YTpiKGEucHJvdG90eXBlLnRwJGJhc2UpfTA9PT1hLmxlbmd0aCYmYS5wdXNoKFNrLmJ1aWx0aW4ub2JqZWN0KTtsZXQgZCxjLGUsZjtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7Zj1hW2tdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFzZXMgbXVzdCBiZSAndHlwZScgb2JqZWN0c1wiKTtpZighMT09PVxuZi5zayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSAnXCIrZi5wcm90b3R5cGUudHAkbmFtZStcIicgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlXCIpO2U9YihmKTtpZih2b2lkIDA9PT1jKWM9ZSxkPWY7ZWxzZSBpZighYy4kaXNTdWJUeXBlKGUpKWlmKGUuJGlzU3ViVHlwZShjKSljPWUsZD1mO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVsdGlwbGUgYmFzZXMgaGF2ZSBpbnN0YW5jZSBsYXlvdXQgY29uZmxpY3RzXCIpO31yZXR1cm4gZH1mdW5jdGlvbiBmKGEpe2Zvcig7bnVsbCE9PWEucHJvdG90eXBlLnRwJGJhc2U7KXtpZih2b2lkIDA9PT1hLnNrJGtsYXNzJiZhLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcIl9fZGljdF9fXCIpKXJldHVybiBhPWEucHJvdG90eXBlLl9fZGljdF9fLFNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3IoYSk/YTp2b2lkIDA7YT1hLnByb3RvdHlwZS50cCRiYXNlfX1cbmZ1bmN0aW9uIGwoYSxiLGMpe2lmKHZvaWQgMD09PWEuc2ska2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IFwiK2EucHJvdG90eXBlLnRwJG5hbWUrXCIuXCIrYy4kanNzdHIoKSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTt9dm9pZCAwPT09U2suYnVpbHRpbiYmKFNrLmJ1aWx0aW49e30pO1NrLmJ1aWx0aW4udHlwZT1mdW5jdGlvbihhKXt0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlJiZTay5hc3NlcnRzLmZhaWwoXCJjYWxsaW5nIG5ldyBTay5idWlsdGluLnR5cGUgaXMgbm90IHNhZmVcIik7cmV0dXJuIGEub2IkdHlwZX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZSx7Y2FsbDp7dmFsdWU6RnVuY3Rpb24ucHJvdG90eXBlLmNhbGx9LGFwcGx5Ont2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LFxudHAkc2xvdHM6e3ZhbHVlOnt0cCRkb2M6XCJ0eXBlKG9iamVjdF9vcl9uYW1lLCBiYXNlcywgZGljdClcXG50eXBlKG9iamVjdCkgLT4gdGhlIG9iamVjdCdzIHR5cGVcXG50eXBlKG5hbWUsIGJhc2VzLCBkaWN0KSAtPiBhIG5ldyB0eXBlXCIsdHAkY2FsbDpmdW5jdGlvbihhLGIpe2lmKHRoaXM9PT1Tay5idWlsdGluLnR5cGUpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWJ8fCFiLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTtpZigzIT09YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHNcIik7fWxldCBkPXRoaXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2lmKGQuJGlzU3VzcGVuc2lvbilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxjPT57ZD1jO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXJldHVybiBkLnRwJGluaXQoYSxiKX0sKCk9PmQpO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXtjb25zdCBjPVxuZC50cCRpbml0KGEsYik7cmV0dXJuIHZvaWQgMCE9PWMmJmMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLCgpPT5kKTpkfXJldHVybiBkfSx0cCRuZXc6ZnVuY3Rpb24oYSxjKXtpZigzIT09YS5sZW5ndGgpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWN8fCFjLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ7Yz1hWzBdO2Q9YVsxXTthPWFbMl07aWYoXCJkaWN0XCIhPT1hLnRwJG5hbWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDMgbXVzdCBiZSBkaWN0LCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO1xuYz1jLiRqc3N0cigpO2lmKFwidHVwbGVcIiE9PWQudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHR1cGxlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZCkpO2Q9ZC5zayRhc2FycmF5KCk7Y29uc3QgZT1mdW5jdGlvbigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH07YihjLGUsZCx0aGlzLmNvbnN0cnVjdG9yKTtTay5nbG9iYWxzJiYoZS5wcm90b3R5cGUuX19tb2R1bGVfXz1Tay5nbG9iYWxzLl9fbmFtZV9fKTtlLnByb3RvdHlwZS5fX2RvY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt2b2lkIDA9PT1lLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KSYmKGUucHJvdG90eXBlLl9fZGljdF9fPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGUsaCkpO2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57ZS5wcm90b3R5cGVbYS4kbWFuZ2xlZF09Yn0pO2UucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19uZXdfX1wiKSYmXG4oYT1lLnByb3RvdHlwZS5fX25ld19fLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMmJihlLnByb3RvdHlwZS5fX25ld19fPW5ldyBTay5idWlsdGluLnN0YXRpY21ldGhvZChhKSkpO2UuJGFsbG9jYXRlU2xvdHMoKTtyZXR1cm4gZX0sdHAkZ2V0YXR0cjpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMub2IkdHlwZTtjb25zdCBjPWQuJHR5cGVMb29rdXAoYSk7bGV0IGU7aWYodm9pZCAwIT09YyYmKGU9Yy50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmdm9pZCAwIT09Yy50cCRkZXNjcl9zZXQpKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTthPXRoaXMuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09YSlyZXR1cm4gZD1hLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1kP2I9ZC5jYWxsKGEsbnVsbCx0aGlzLGIpOmE7aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1lLmNhbGwoYyx0aGlzLGQsYik7aWYodm9pZCAwIT09YylyZXR1cm4gY30sdHAkc2V0YXR0cjpmdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuc2ska2xhc3Mpe2lmKHZvaWQgMCE9PVxuYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZXMgb24gdHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCIpO31jb25zdCBkPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1kKXtjb25zdCBhPWQudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChkLHRoaXMsYixjKX1jPWEuJG1hbmdsZWQ7aWYodm9pZCAwPT09YilpZihiPXRoaXMucHJvdG90eXBlLGIuaGFzT3duUHJvcGVydHkoYykpZGVsZXRlIGJbY10sYT1Tay5kdW5kZXJUb1NrdWxwdFtjXSx2b2lkIDAhPT1hJiYoZGVsZXRlIHRoaXMucHJvdG90eXBlW2FdLGIuc2skcHJvdG90eXBpY2FsfHx0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYykpO1xuZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJyBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTtlbHNlIHRoaXMucHJvdG90eXBlW2NdPWIsYyBpbiBTay5kdW5kZXJUb1NrdWxwdCYmdGhpcy4kYWxsb2NhdGVTbG90KGMsYil9LCRyOmZ1bmN0aW9uKCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXyxiPVwiXCIsYz1cImNsYXNzXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKT9iPWEuditcIi5cIjphPW51bGw7YXx8dGhpcy5zayRrbGFzc3x8U2suX19mdXR1cmVfXy5jbGFzc19yZXByfHwoYz1cInR5cGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIitjK1wiICdcIitiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInPlwiKX19LHdyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxcbnNrJHR5cGU6e3ZhbHVlOiEwfSwkaXNTdWJUeXBlOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcz09PWF8fHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgYXx8IXRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmdGhpcy5wcm90b3R5cGUudHAkbXJvLmluY2x1ZGVzKGEpfX0sJGFsbG9jYXRlU2xvdDp7dmFsdWU6ZnVuY3Rpb24oYSxiKXthPVNrLnNsb3RzW2FdO2NvbnN0IGM9YS4kc2xvdF9uYW1lLGQ9dGhpcy5wcm90b3R5cGU7ZC5oYXNPd25Qcm9wZXJ0eShjKSYmZGVsZXRlIGRbY107ZFtjXT1hLiRzbG90X2Z1bmMoYil9fSwkYWxsb2NhdGVTbG90czp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMucHJvdG90eXBlO3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD9PYmplY3Qua2V5cyhhKS5mb3JFYWNoKGI9PntiIGluIFNrLnNsb3RzJiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKX0pOk9iamVjdC5rZXlzKFNrLnNsb3RzKS5mb3JFYWNoKGI9PnthLmhhc093blByb3BlcnR5KGIpP1xudGhpcy4kYWxsb2NhdGVTbG90KGIsYVtiXSk6dGhpcy4kYWxsb2NhdGVHZXR0ZXJTbG90KGIpfSl9fSwkYWxsb2NhdGVHZXR0ZXJTbG90Ont2YWx1ZTpmdW5jdGlvbihhKXtjb25zdCBiPVNrLnNsb3RzW2FdLiRzbG90X25hbWUsYz10aGlzLnByb3RvdHlwZTtjLmhhc093blByb3BlcnR5KGIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxiLHtjb25maWd1cmFibGU6ITAsZ2V0KCl7Y29uc3QgYT1jLnRwJG1ybztmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFbY10ucHJvdG90eXBlLGIpO2lmKHZvaWQgMCE9PWQmJmQudmFsdWUpcmV0dXJuIGQudmFsdWV9fX0pfX0sJHR5cGVMb29rdXA6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw/dGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF06Yy5jYWxsKHRoaXMsYSl9LHdyaXRhYmxlOiEwfSwkbXJvTWVyZ2U6e3ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD1cbiEwO2xldCBiO2NvbnN0IGM9W107Zm9yKDs7KXtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgZD1hW2JdO2lmKDAhPT1kLmxlbmd0aClicmVha31pZihiPT09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYilpZihkPWFbYl0sMCE9PWQubGVuZ3RoKXtjb25zdCBiPWRbMF07ZD0wO2E6Zm9yKDtkPGEubGVuZ3RoOysrZCl7Y29uc3QgYz1hW2RdO2ZvcihsZXQgYT0xO2E8Yy5sZW5ndGg7KythKWlmKGNbYV09PT1iKWJyZWFrIGF9ZD09PWEubGVuZ3RoJiZlLnB1c2goYil9aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkluY29uc2lzdGVudCBwcmVjZWRlbmNlcyBpbiB0eXBlIGhpZXJhcmNoeVwiKTtlPWVbMF07Yy5sZW5ndGgmJnRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGNbYy5sZW5ndGgtMV0ucHJvdG90eXBlKSE9PWUucHJvdG90eXBlJiYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITEpO2MucHVzaChlKTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWQ9YVtiXSwwPGQubGVuZ3RoJiZkWzBdPT09ZSYmZC5zcGxpY2UoMCwxKX19fSwkYnVpbGRNUk86e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYT1bW3RoaXNdXSxiPXRoaXMucHJvdG90eXBlLnRwJGJhc2VzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7KytjKWEucHVzaChbLi4uYltjXS5wcm90b3R5cGUudHAkbXJvXSk7Yz1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoOysrYSljLnB1c2goYlthXSk7YS5wdXNoKGMpO3JldHVybiB0aGlzLiRtcm9NZXJnZShhKX19LHNrJGF0dHJFcnJvcjp7dmFsdWUoKXtyZXR1cm5cInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wifSx3cml0YWJsZTohMH19KTtTay5idWlsdGluLnR5cGUucHJvdG90eXBlLnRwJGdldHNldHM9e19fYmFzZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnRwJGJhc2V8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fYmFzZXNfXzp7JGdldCgpe3ZvaWQgMD09PVxudGhpcy5zayR0dXBsZV9iYXNlcyYmKHRoaXMuc2skdHVwbGVfYmFzZXM9bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkYmFzZXMpKTtyZXR1cm4gdGhpcy5zayR0dXBsZV9iYXNlc319LF9fbXJvX186eyRnZXQoKXt2b2lkIDA9PT10aGlzLnNrJHR1cGxlX21ybyYmKHRoaXMuc2skdHVwbGVfbXJvPW5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucHJvdG90eXBlLnRwJG1ybykpO3JldHVybiB0aGlzLnNrJHR1cGxlX21yb319LF9fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLnByb3RvdHlwZSl9fSxfX2RvY19fOnskZ2V0KCl7Y29uc3QgYT10aGlzLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3JldHVybiBhP3ZvaWQgMCE9PWEudHAkZGVzY3JfZ2V0P3RoaXM9PT1Tay5idWlsdGluLnR5cGU/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJGRvYyk6YS50cCRkZXNjcl9nZXQobnVsbCxcbnRoaXMpOnRoaXMucHJvdG90eXBlLl9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3RoaXMucHJvdG90eXBlLl9fZG9jX189YX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRuYW1lKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbmFtZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byBcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiLl9fbmFtZV9fLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt0aGlzLnByb3RvdHlwZS50cCRuYW1lPWEuJGpzc3RyKCl9fSxfX21vZHVsZV9fOnskZ2V0KCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXztyZXR1cm4gYSYmYS5vYiR0eXBlIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcj9cbmE6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYnVpbHRpbnNcIil9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXz1hfX19O1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkbWV0aG9kcz17bXJvOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuJGJ1aWxkTVJPKCkpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthIGluIFNrLnJlc2VydmVkV29yZHNffHwoYT1Tay51bmZpeFJlc2VydmVkKGEpLC0xIT09YS5pbmRleE9mKFwiJFwiKXx8Yi5oYXMoYSl8fChiLmFkZChhKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSkpfWNvbnN0IGI9bmV3IFNldCxjPVtdO2lmKHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbClmb3IodmFyIGUgaW4gdGhpcy5wcm90b3R5cGUpYShlKTtlbHNle2U9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgYj1cbjA7YjxlLmxlbmd0aDtiKyspe2NvbnN0IGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZVtiXS5wcm90b3R5cGUpO2ZvcihsZXQgYj0wO2I8Yy5sZW5ndGg7YisrKWEoY1tiXSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlNwZWNpYWxpemVkIF9fZGlyX18gaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzLlwifX07Y29uc3QgaD17JGdldCgpe2NvbnN0IGE9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1hP2EudHAkZGVzY3JfZ2V0KHRoaXMsdGhpcy5vYiR0eXBlKTpTay5nZW5lcmljLmdldFNldERpY3QuJGdldC5jYWxsKHRoaXMpfSwkc2V0KGEpe2NvbnN0IGI9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1iP2IudHAkZGVzY3Jfc2V0KHRoaXMsYSk6U2suZ2VuZXJpYy5nZXRTZXREaWN0LiRzZXQuY2FsbCh0aGlzLGEpfSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLFxuJG5hbWU6XCJfX2RpY3RfX1wifX0sZnVuY3Rpb24obSxxKXtTay5nZW5lcmljPXt9O1NrLmdlbmVyaWMuZ2V0QXR0cj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9dGhpcy5vYiR0eXBlLGY9ZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1mJiYoYj1mLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1iJiZ2b2lkIDAhPT1mLnRwJGRlc2NyX3NldCkpcmV0dXJuIGIuY2FsbChmLHRoaXMsZSxjKTtjb25zdCBsPXRoaXMuJGQ7aWYodm9pZCAwIT09bCYmKGE9bC5xdWljayRsb29rdXAoYSksdm9pZCAwIT09YSkpcmV0dXJuIGE7aWYodm9pZCAwIT09YilyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2lmKHZvaWQgMCE9PWYpcmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuZ2V0QXR0clwiLFNrLmdlbmVyaWMuZ2V0QXR0cik7U2suZ2VuZXJpYy5zZXRBdHRyPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZSYmbnVsbCE9PVxuZSl7Y29uc3QgYT1lLnRwJGRlc2NyX3NldDtpZihhKXJldHVybiBhLmNhbGwoZSx0aGlzLGMsYil9Yj10aGlzLiRkO2lmKHZvaWQgMCE9PWIpaWYoYi5tcCRhc3Nfc3Vic2NyaXB0KXtpZih2b2lkIDAhPT1jKXJldHVybiBiLm1wJGFzc19zdWJzY3JpcHQoYSxjKTt0cnl7cmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhKX1jYXRjaChmKXtpZihmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5LZXlFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO3Rocm93IGY7fX1lbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYil7ZT1hLiRtYW5nbGVkO2lmKHZvaWQgMCE9PWMpe2JbZV09YztyZXR1cm59aWYodm9pZCAwIT09YltlXSl7ZGVsZXRlIGJbZV07cmV0dXJufX10aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcih0aGlzLnNrJGF0dHJFcnJvcigpK1xuXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5nZW5lcmljLnNldEF0dHJcIixTay5nZW5lcmljLnNldEF0dHIpO1NrLmdlbmVyaWMubmV3PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjLGIpe2lmKHRoaXMuY29uc3RydWN0b3I9PT1hKXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcjtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2EuY2FsbChjKTtyZXR1cm4gY319O1NrLmdlbmVyaWMubmV3TWV0aG9kRGVmPXskbWV0aChhLGMpe2NvbnN0IGI9dGhpcy5wcm90b3R5cGU7aWYoMT5hLmxlbmd0aCl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKCk6IG5vdCBlbm91Z2ggYXJndW1lbnRzXCIpO3ZhciBlPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1lLnNrJHR5cGUpdGhyb3cgYT1iLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCJfX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0IChcIitcblNrLmFic3RyLnR5cGVOYW1lKGUpK1wiKVwiKTtpZighZS4kaXNTdWJUeXBlKHRoaXMpKXRocm93IGE9Yi50cCRuYW1lLGU9ZS5wcm90b3R5cGUudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKFwiK2UrXCIpOiBcIitlK1wiIGlzIG5vdCBhIHN1YnR5cGUgb2YgXCIrYSk7Y29uc3QgZj1lLnByb3RvdHlwZS5zayRzdGF0aWNOZXcucHJvdG90eXBlO2lmKGYudHAkbmV3IT09Yi50cCRuZXcpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIikgaXMgbm90IHNhZmUsIHVzZSBcIitmLnRwJG5hbWUrXCIuX19uZXdfXygpXCIpO3JldHVybiBiLnRwJG5ldy5jYWxsKGUucHJvdG90eXBlLGEsYyl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCR0eXBlLCAqYXJncywgKiprd2FyZ3MpXCIsJG5hbWU6XCJfX25ld19fXCJ9O1NrLmdlbmVyaWMuc2VsZkl0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307XG5Tay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplPWZ1bmN0aW9uKCl7aWYodGhpcy4kc2VxLmxlbmd0aCE9PXRoaXMuJG9yaWcuZ2V0JHNpemUoKSl7Y29uc3QgYT10aGlzLnRwJG5hbWUuc3BsaXQoXCJfXCIpWzBdO3Rocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihhK1wiIGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uXCIpO31pZighKHRoaXMuJGluZGV4Pj10aGlzLiRzZXEubGVuZ3RoKSlyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfTtTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5PWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107dm9pZCAwPT09YSYmKHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt9KTtyZXR1cm4gYX07U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZj17JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRzZXEubGVuZ3RoLXRoaXMuJGluZGV4KX0sXG4kZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KX0sJGZsYWdzOntOb0FyZ3M6ITB9fTtTay5nZW5lcmljLmdldFNldERpY3Q9eyRnZXQoKXtyZXR1cm4gdGhpcy4kZH0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpdGhpcy4kZD1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sJGRvYzpcImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZClcIiwkbmFtZTpcIl9fZGljdF9fXCJ9O1NrLmdlbmVyaWMuc2VxQ29tcGFyZT1mdW5jdGlvbihhLFxuYyl7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgdGhpcy5zayRidWlsdGluQmFzZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy52O2E9YS52O2xldCBlO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1jfHxcIk5vdEVxXCI9PT1jKSlyZXR1cm5cIkVxXCI9PT1jPyExOiEwO2ZvcihlPTA7ZTxiLmxlbmd0aCYmZTxhLmxlbmd0aCYmKGJbZV09PT1hW2VdfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLFwiRXFcIikpOysrZSk7Y29uc3QgZj1iLmxlbmd0aCxsPWEubGVuZ3RoO2lmKGU+PWZ8fGU+PWwpc3dpdGNoKGMpe2Nhc2UgXCJMdFwiOnJldHVybiBmPGw7Y2FzZSBcIkx0RVwiOnJldHVybiBmPD1sO2Nhc2UgXCJFcVwiOnJldHVybiBmPT09bDtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZiE9PWw7Y2FzZSBcIkd0XCI6cmV0dXJuIGY+XG5sO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZj49bDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbCgpfXJldHVyblwiRXFcIj09PWM/ITE6XCJOb3RFcVwiPT09Yz8hMDpTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLGMpfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtjPWMubGVuZ3RoO3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6MDxiP2ErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2UrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIG5vIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NcIixTay5idWlsdGluLnB5Q2hlY2tBcmdzKTtcblNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIikrKFwiIChcIitjK1wiIGdpdmVuKVwiKSk7fTtTay5idWlsdGluLnB5Q2hlY2tUeXBlPWZ1bmN0aW9uKGEsYyxiKXtpZighYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBtdXN0IGJlIGEgXCIrYyk7fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnB5Q2hlY2tUeXBlXCIsU2suYnVpbHRpbi5weUNoZWNrVHlwZSk7U2suYnVpbHRpbi5jaGVja1NlcXVlbmNlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU2VxdWVuY2VcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UpO1NrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT8hMTphLnRwJGl0ZXI/dm9pZCAwIT09YS50cCRpdGVyKCkudHAkaXRlcm5leHQ6dm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZVwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZSk7U2suYnVpbHRpbi5jaGVja0NhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmJ1aWx0aW4uY2hlY2tOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZ307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja051bWJlclwiLFxuU2suYnVpbHRpbi5jaGVja051bWJlcik7U2suYnVpbHRpbi5jaGVja0NvbXBsZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXh9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4XCIsU2suYnVpbHRpbi5jaGVja0NvbXBsZXgpO1NrLmJ1aWx0aW4uY2hlY2tJbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0ludFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRmxvYXRcIixTay5idWlsdGluLmNoZWNrRmxvYXQpO1NrLmJ1aWx0aW4uY2hlY2tTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmdcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKTtTay5idWlsdGluLmNoZWNrQnl0ZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfTtTay5idWlsdGluLmNoZWNrQ2xhc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDbGFzc1wiLFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyk7U2suYnVpbHRpbi5jaGVja0Jvb2w9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2x9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tCb29sXCIsU2suYnVpbHRpbi5jaGVja0Jvb2wpO1NrLmJ1aWx0aW4uY2hlY2tOb25lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTm9uZVwiLFxuU2suYnVpbHRpbi5jaGVja05vbmUpO1NrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRjYWxsfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRnVuY3Rpb25cIixTay5idWlsdGluLmNoZWNrRnVuY3Rpb24pO1NrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnZvaWQgMCE9PWEudHAkZGVzY3Jfc2V0fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRGF0YURlc2NyXCIsU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcik7U2suYnVpbHRpbi5jaGVja0FueVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXR9O1NrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fFxubnVsbCE9YSYmdm9pZCAwIT09YS5tcCRzdWJzY3JpcHQmJnZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJGFkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRtdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRtYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGRpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRmbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkZGl2bW9kO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRwb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyc2hpZnQ7XG5jYXNlIFwiQml0QW5kXCI6cmV0dXJuIGEubmIkYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiR4b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkb3J9fWZ1bmN0aW9uIGMoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9tdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yZW1haW5kZXI7Y2FzZSBcIkRpdk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9wb3dlcjtcbmNhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9vcn19ZnVuY3Rpb24gYihhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJGlucGxhY2Vfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2Zsb29yX2RpdmlkZTtcbmNhc2UgXCJNb2RcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3JlbWFpbmRlcjtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9wb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJGlucGxhY2VfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FuZDtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX29yO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3hvcn19ZnVuY3Rpb24gZShiLGQsZSl7dmFyIGs9ZC5jb25zdHJ1Y3RvcixmPWIuY29uc3RydWN0b3I7aWYoaz1rIT09ZiYmdm9pZCAwPT09ay5zayRiYXNlQ2xhc3MmJmQgaW5zdGFuY2VvZiBmKWlmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJmYhPT1jKGIsZSkmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpcmV0dXJuIGY7Zj1hKGIsZSk7aWYodm9pZCAwIT09XG5mJiYoZj1mLmNhbGwoYixkKSxmIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwhayYmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpKXJldHVybiBmfWZ1bmN0aW9uIGYoYSl7bi5mb3JFYWNoKChbYixjXSk9PnthW2NdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRwJHJpY2hjb21wYXJlKGEsYil9fSl9ZnVuY3Rpb24gbChhKXtjb25zdCBiPVNrLnJlZmxlY3RlZE51bWJlclNsb3RzO09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+e2lmKHZvaWQgMCE9PWFbY10pe2NvbnN0IGQ9YltjXSxlPWQucmVmbGVjdGVkLGY9YVtlXTt2b2lkIDAhPT1mP251bGw9PT1mJiZkZWxldGUgYVtlXTphW2VdPWQuc2xvdHx8YVtjXX19KX1mdW5jdGlvbiBoKGEpe2NvbnN0IGI9U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT5cbnt2b2lkIDAhPT1hW2NdJiZiW2NdLmZvckVhY2goYj0+e2FbYl09YVtjXX0pfSl9U2suYWJzdHI9e307U2suYWJzdHIudHlwZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkbmFtZT9hLnRwJG5hbWU6XCI8aW52YWxpZCB0eXBlPlwifTtjb25zdCBkPXtBZGQ6XCIrXCIsU3ViOlwiLVwiLE11bHQ6XCIqXCIsTWF0TXVsdDpcIkBcIixEaXY6XCIvXCIsRmxvb3JEaXY6XCIvL1wiLE1vZDpcIiVcIixEaXZNb2Q6XCJkaXZtb2QoKVwiLFBvdzpcIioqIG9yIHBvdygpXCIsTFNoaWZ0OlwiPDxcIixSU2hpZnQ6XCI+PlwiLEJpdEFuZDpcIiZcIixCaXRYb3I6XCJeXCIsQml0T3I6XCJ8XCJ9LGc9e1VBZGQ6XCIrXCIsVVN1YjpcIi1cIixJbnZlcnQ6XCJ+XCJ9O1NrLmFic3RyLm51bWJlckJpbk9wPWZ1bmN0aW9uKGEsYixjKXt2YXIgZjtpZighKGY9ZShhLGIsYykpKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYj1Tay5hYnN0ci50eXBlTmFtZShiKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK1xuZFtjXStcIjogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7cmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlckJpbk9wXCIsU2suYWJzdHIubnVtYmVyQmluT3ApO1NrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcD1mdW5jdGlvbihhLGMsZil7YTp7dmFyIGs9YihhLGYpO2lmKHZvaWQgMCE9PWsmJihrPWsuY2FsbChhLGMpLGshPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpYnJlYWsgYTtrPWUoYSxjLGYpfWlmKCFrKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYz1Tay5hYnN0ci50eXBlTmFtZShjKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK2RbZl0rXCI9OiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTtyZXR1cm4ga307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wXCIsU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKTtTay5hYnN0ci5udW1iZXJVbmFyeU9wPVxuZnVuY3Rpb24oYSxiKXtpZihcIk5vdFwiPT09YilyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkO2I6e3N3aXRjaChiKXtjYXNlIFwiVVN1YlwiOnZhciBjPWEubmIkbmVnYXRpdmU7YnJlYWsgYjtjYXNlIFwiVUFkZFwiOmM9YS5uYiRwb3NpdGl2ZTticmVhayBiO2Nhc2UgXCJJbnZlcnRcIjpjPWEubmIkaW52ZXJ0O2JyZWFrIGJ9Yz12b2lkIDB9Yz12b2lkIDAhPT1jP2MuY2FsbChhKTp2b2lkIDA7aWYoIWMpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSBcIitnW2JdK1wiOiAnXCIrYStcIidcIik7cmV0dXJuIGN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlclVuYXJ5T3BcIixTay5hYnN0ci5udW1iZXJVbmFyeU9wKTtTay5hYnN0ci5maXhTZXFJbmRleF89ZnVuY3Rpb24oYSxiKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO1xuMD5iJiZhLnNxJGxlbmd0aCYmKGIrPWEuc3EkbGVuZ3RoKCkpO3JldHVybiBifTtTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjKXtpZihhLnNxJGNvbnRhaW5zKXJldHVybiBhLnNxJGNvbnRhaW5zKGIsYyk7YT1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxiLFwiRXFcIik/bmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTohMX0sITEpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdD1mdW5jdGlvbihhLGIpe2lmKGEuc3EkY29uY2F0KXJldHVybiBhLnNxJGNvbmNhdChiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2Y9XG5mdW5jdGlvbihhLGIpe2lmKGEuaW5kZXgpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmluZGV4LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpe2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGUsXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjKz0xfXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2VcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2Y9ZnVuY3Rpb24oYSxiKXtpZihhLmNvdW50KXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5jb3VudCxbYSxiXSk7bGV0IGM9MDtmb3IobGV0IGQ9U2suYWJzdHIuaXRlcihhKSxlPWQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9ZC50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLFxuZSxcIkVxXCIpJiYoYys9MSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9O1NrLmFic3RyLnNlcXVlbmNlR2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7XCJudW1iZXJcIj09PXR5cGVvZiBiJiYoYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLGIsYyl9O1NrLmFic3RyLnNlcXVlbmNlU2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYixjLGQpfTtTay5hYnN0ci5zZXF1ZW5jZURlbEl0ZW09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRTbGljZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VEZWxTbGljZT1cbmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZVNldFNsaWNlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlVW5wYWNrPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IHVucGFjayBub24taXRlcmFibGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihhKSxmPVtdO2xldCBrPTAsZzswPGImJihnPVNrLm1pc2NldmFsLml0ZXJGb3IoZSxhPT57Zi5wdXNoKGEpO2lmKCsraz09PWIpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVha30pKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZyxcbigpPT57aWYoZi5sZW5ndGg8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm90IGVub3VnaCB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBhdCBsZWFzdCBcIitjK1wiLCBnb3QgXCIrZi5sZW5ndGgrXCIpXCIpO2lmKCFkKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihlLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgXCIrYitcIilcIik7cmV0dXJuIGZ9KTtjb25zdCBhPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKGUsYj0+e2EucHVzaChiKX0pLCgpPT57Y29uc3QgZD1hLmxlbmd0aCtiLWM7aWYoMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIisoYytkKStcIilcIik7Zi5wdXNoKG5ldyBTay5idWlsdGluLmxpc3QoYS5zbGljZSgwLFxuZCkpKTtmLnB1c2goLi4uYS5zbGljZShkKSk7cmV0dXJuIGZ9KX0pfTtTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheT1mdW5jdGlvbihhLGIsYyl7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCliLiRpdGVtcygpLmZvckVhY2goKFtiLGRdKT0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTthLnB1c2goYi52KTthLnB1c2goZCl9KTtlbHNle3ZhciBkPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4ka2V5cyk7aWYodm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGEgbWFwcGluZ1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQpLGQ9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihkKSxcbmQ9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIubXAkc3Vic2NyaXB0KGQsITApLGI9PnthLnB1c2goZC52KTthLnB1c2goYil9KX0pKX19O1NrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD1kfHxbXTt2YXIgZj1jLmxlbmd0aCtkLmxlbmd0aC8yO2lmKGY+Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBleHBlY3RlZCBhdCBtb3N0IFwiK2IubGVuZ3RoK1wiIGFyZ3VtZW50cyAoXCIrZitcIiBnaXZlbilcIik7aWYoZC5sZW5ndGh8fHZvaWQgMCE9PWUpe2lmKGY9PT1iLmxlbmd0aCYmIWQubGVuZ3RoKXJldHVybiBjO2lmKDA9PT1mJiZiLmxlbmd0aD09PShlJiZlLmxlbmd0aCkpcmV0dXJuIGV9ZWxzZSByZXR1cm4gYztcbmM9Yy5zbGljZSgwKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9Mil7Y29uc3QgZT1kW2ZdLGs9ZFtmKzFdLGc9Yi5pbmRleE9mKGUpO2lmKDA8PWcpe2lmKHZvaWQgMCE9PWNbZ10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZStcIidcIik7Y1tnXT1rfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTt9aWYoZSl7ZD1iLmxlbmd0aDtmb3IoZj1kLTE7MDw9ZjtmLS0pdm9pZCAwPT09Y1tmXSYmKGNbZl09ZVtlLmxlbmd0aC0xLShkLTEtZildKTtiPWIuZmlsdGVyKChhLGIpPT52b2lkIDA9PT1jW2JdKTtpZihiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIG1pc3NpbmcgXCIrYi5sZW5ndGgrXCIgcmVxdWlyZWQgcG9zaXRpb25hbCBhcmd1bWVudHM6IFwiK2Iuam9pbihcIiwgXCIpKTtcbn1yZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3NcIixTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyk7U2suYWJzdHIuY2hlY2tOb0t3YXJncz1mdW5jdGlvbihhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vS3dhcmdzXCIsU2suYWJzdHIuY2hlY2tOb0t3YXJncyk7U2suYWJzdHIuY2hlY2tOb0FyZ3M9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9Yi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBhcmd1bWVudHMgKFwiK2IrXCIgZ2l2ZW4pXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tOb0FyZ3NcIixTay5hYnN0ci5jaGVja05vQXJncyk7U2suYWJzdHIuY2hlY2tPbmVBcmc9XG5mdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhhLGMpO2lmKDEhPT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50IChcIitiLmxlbmd0aCtcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja09uZUFyZ1wiLFNrLmFic3RyLmNoZWNrT25lQXJnKTtTay5hYnN0ci5jaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxiLGMsZCl7Yj1iLmxlbmd0aDt2b2lkIDA9PT1kJiYoZD1JbmZpbml0eSk7aWYoYjxjfHxiPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjPT09ZD9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitjK1wiIGFyZ3VtZW50c1wiOmI8Yz9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYytcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitkK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2IrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrQXJnc0xlblwiLFxuU2suYWJzdHIuY2hlY2tBcmdzTGVuKTtTay5hYnN0ci5vYmplY3RGb3JtYXQ9ZnVuY3Rpb24oYSxiKXthPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZm9ybWF0KTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyBtdXN0IHJldHVybiBhIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gYn07U2suYWJzdHIub2JqZWN0SGFzaD1mdW5jdGlvbihhKXtjb25zdCBiPWEudHAkaGFzaDtpZih2b2lkIDAhPT1iKXtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bmhhc2hhYmxlIHR5cGU6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7cmV0dXJuIGEudHAkaGFzaCgpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIEphdmFzY3JpcHQgdHlwZVwiKTtcbn07U2suYWJzdHIub2JqZWN0QWRkPWZ1bmN0aW9uKGEsYil7aWYoYS5uYiRhZGQpcmV0dXJuIGEubmIkYWRkKGIpO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yj1Tay5hYnN0ci50eXBlTmFtZShiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdcIithK1wiJyBhbmQgJ1wiK2IrXCInXCIpO307U2suYWJzdHIub2JqZWN0TmVnYXRpdmU9ZnVuY3Rpb24oYSl7aWYoYS5uYiRuZWdhdGl2ZSlyZXR1cm4gYS5uYiRuZWdhdGl2ZSgpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3RQb3NpdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJHBvc2l0aXZlKXJldHVybiBhLm5iJHBvc2l0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0RGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYix2b2lkIDAsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbVwiLFNrLmFic3RyLm9iamVjdERlbEl0ZW0pO1NrLmFic3RyLm9iamVjdEdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe2lmKGEubXAkc3Vic2NyaXB0KXJldHVybiBhLm1wJHN1YnNjcmlwdChiLGMpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdEdldEl0ZW1cIixcblNrLmFic3RyLm9iamVjdEdldEl0ZW0pO1NrLmFic3RyLm9iamVjdFNldEl0ZW09ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYixjLGQpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3RTZXRJdGVtXCIsU2suYWJzdHIub2JqZWN0U2V0SXRlbSk7U2suYWJzdHIuZ2F0dHI9ZnVuY3Rpb24oYSxiLGMpe2M9YS50cCRnZXRhdHRyKGIsYyk7aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjLiRpc1N1c3BlbnNpb24/U2subWlzY2V2YWwuY2hhaW4oYyxmdW5jdGlvbihjKXtpZih2b2lkIDA9PT1cbmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlICdcIitiLiRqc3N0cigpK1wiJ1wiKTtyZXR1cm4gY30pOmN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmdhdHRyXCIsU2suYWJzdHIuZ2F0dHIpO1NrLmFic3RyLnNhdHRyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRwJHNldGF0dHIoYixjLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5zYXR0clwiLFNrLmFic3RyLnNhdHRyKTtTay5hYnN0ci5pdGVybmV4dD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGl0ZXJuZXh0KGIpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVybmV4dFwiLFNrLmFic3RyLml0ZXJuZXh0KTtTay5hYnN0ci5pdGVyPWZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcil7YT1hLnRwJGl0ZXIoKTtpZihhLnRwJGl0ZXJuZXh0KXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3Igb2YgdHlwZSAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fWlmKGEubXAkc3Vic2NyaXB0KXJldHVybiBuZXcgU2suYnVpbHRpbi5zZXFfaXRlcl8oYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlclwiLFNrLmFic3RyLml0ZXIpO1NrLmFic3RyLmxvb2t1cFNwZWNpYWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm9iJHR5cGU7aWYodm9pZCAwPT09YylTay5hc3NlcnRzLmZhaWwoXCJqYXZhc2NyaXB0IG9iamVjdCBzZW50IHRvIGxvb2t1cFNwZWNpYWxcIik7ZWxzZSBpZihiPWMuJHR5cGVMb29rdXAoYiksdm9pZCAwIT09YilyZXR1cm4gdm9pZCAwIT09Yi50cCRkZXNjcl9nZXQmJihiPWIudHAkZGVzY3JfZ2V0KGEsYykpLGJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmxvb2t1cFNwZWNpYWxcIixTay5hYnN0ci5sb29rdXBTcGVjaWFsKTtcblNrLmFic3RyLnR5cGVMb29rdXA9ZnVuY3Rpb24oYSxiKXtiPWEuJHR5cGVMb29rdXAoYik7cmV0dXJuIHZvaWQgMCE9PWImJmIudHAkZGVzY3JfZ2V0P2IudHAkZGVzY3JfZ2V0KG51bGwsYSk6Yn07U2suYWJzdHIubWFya1VuaGFzaGFibGU9ZnVuY3Rpb24oYSl7YT1hLnByb3RvdHlwZTthLl9faGFzaF9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDthLnRwJGhhc2g9U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlPWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZHx8U2suYnVpbHRpbi50eXBlO2M9dm9pZCAwPT09Yz9Tay5idWlsdGluLm9iamVjdDpjO2NvbnN0IGU9bnVsbCE9PWM/Yy5wcm90b3R5cGU6bnVsbDtPYmplY3Quc2V0UHJvdG90eXBlT2YoYixkLnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGIucHJvdG90eXBlLGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGIucHJvdG90eXBlLHtzayRvYmplY3Q6e3ZhbHVlOmIsd3JpdGFibGU6ITB9LFxub2IkdHlwZTp7dmFsdWU6Yix3cml0YWJsZTohMH0sdHAkbmFtZTp7dmFsdWU6YSx3cml0YWJsZTohMH0sdHAkYmFzZTp7dmFsdWU6Yyx3cml0YWJsZTohMH19KX07U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvPWZ1bmN0aW9uKGEpe2xldCBiPWEucHJvdG90eXBlLnRwJGJhc2U7Y29uc3QgYz1udWxsPT09Yj9bXTpbYl07aWYoYj09PVNrLmJ1aWx0aW4ub2JqZWN0fHxudWxsPT09YilPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcInNrJGJhc2VDbGFzc1wiLHt2YWx1ZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSxcInNrJGJ1aWx0aW5CYXNlXCIse3ZhbHVlOmEsd3JpdGFibGU6ITB9KTtjb25zdCBkPVthXTtmb3IoO251bGwhPT1iOylkLnB1c2goYiksYj1iLnByb3RvdHlwZS50cCRiYXNlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSx0cCRiYXNlczp7dmFsdWU6YyxcbndyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOmQsd3JpdGFibGU6ITB9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCIkdHlwZUxvb2t1cFwiLHt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF19LHdyaXRhYmxlOiEwfSl9O1NrLmFic3RyLnNldFVwR2V0U2V0cz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRnZXRzZXRzfHx7fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixkXSk9PntkLiRuYW1lPWI7Y1tiXT1uZXcgU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRnZXRzZXRzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLnNldFVwTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPVxuYS5wcm90b3R5cGU7Yj1ifHxjLnRwJG1ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJG1ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBDbGFzc01ldGhvZHM9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDAhPT1Tay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRjbGFzc21ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkY2xhc3NtZXRob2RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O2NvbnN0IG49T2JqZWN0LmVudHJpZXMoe0VxOlwib2IkZXFcIixcbk5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn0pO1NrLmFic3RyLnNldFVwU2xvdHM9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIsYyl7ZVtiXT1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoYSxTay5zbG90c1tiXSxjKX1mdW5jdGlvbiBkKGEsYil7XCJzdHJpbmdcIj09PXR5cGVvZiBhP2MoYSxiKTphLmZvckVhY2goYT0+e2MoYSxiKX0pfWlmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXt2YXIgZT1hLnByb3RvdHlwZTtiPWJ8fGUudHAkc2xvdHN8fHt9O2IudHAkbmV3PT09U2suZ2VuZXJpYy5uZXcmJihiLnRwJG5ldz1Tay5nZW5lcmljLm5ldyhhKSk7Yi50cCRyaWNoY29tcGFyZSYmZihiKTtiLnRwJGFzX251bWJlciYmbChiKTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJmgoYik7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXG5hLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTtiLnRwJG5ldyYmKGUuX19uZXdfXz1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoU2suZ2VuZXJpYy5uZXdNZXRob2REZWYsYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzayRzdGF0aWNOZXdcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pKTtTay5zdWJTbG90cy5tYWluX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTt2YXIgZz1iLnRwJGhhc2g7dm9pZCAwIT09ZyYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnP2MoXCJfX2hhc2hfX1wiLGcpOmc9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/ZS5fX2hhc2hfXz1nOlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgdHAkaGFzaFwiKSk7Yi50cCRhc19udW1iZXImJlNrLnN1YlNsb3RzLm51bWJlcl9zbG90cy5mb3JFYWNoKChbYSxjXSk9PnthPWJbYV07dm9pZCAwIT09YSYmZChjLGEpfSk7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZTay5zdWJTbG90cy5zZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90cy5mb3JFYWNoKChbYSxcbmNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRwJHNsb3RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIkEgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSBuYXRpdmUgY2xhc3NcIik7bGV0IGM9Yi5jb25zdHJ1Y3RvcjtpZihhLmluY2x1ZGVzKFwiLlwiKSl7dmFyIGQ9YS5zcGxpdChcIi5cIik7YT1kLnBvcCgpO2Q9ZC5qb2luKFwiLlwiKX1Tay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKGEsYyxiLmJhc2UsYi5tZXRhKTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oYyk7Y29uc3QgZT1jLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHt0cCRzbG90czp7dmFsdWU6Yi5zbG90cyx3cml0YWJsZTohMH0sdHAkZ2V0c2V0czp7dmFsdWU6Yi5nZXRzZXRzLFxud3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOmIubWV0aG9kcyx3cml0YWJsZTohMH0sdHAkY2xhc3NtZXRob2RzOnt2YWx1ZTpiLmNsYXNzbWV0aG9kcyx3cml0YWJsZTohMH19KTtTay5hYnN0ci5zZXRVcFNsb3RzKGMsYi5zbG90c3x8e30pO1NrLmFic3RyLnNldFVwTWV0aG9kcyhjLGIubWV0aG9kcyk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGMsYi5nZXRzZXRzKTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcyhjLGIuY2xhc3NtZXRob2RzKTt2b2lkIDAhPT1kJiYoZS5fX21vZHVsZV9fPW5ldyBTay5idWlsdGluLnN0cihkKSk7T2JqZWN0LmVudHJpZXMoYi5wcm90b3x8e30pLmZvckVhY2goKFthLGJdKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEse3ZhbHVlOmIsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohKGEuaW5jbHVkZXMoXCIkXCIpfHxhIGluIE9iamVjdC5wcm90b3R5cGUpfSl9KTtPYmplY3QuZW50cmllcyhiLmZsYWdzfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT5cbntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTt2b2lkIDAhPT1Tay5idWlsdGluLnN0ciYmZS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKSYmIWUuaGFzT3duUHJvcGVydHkoXCJfX2RvY19fXCIpJiYoYT1lLnRwJGRvY3x8bnVsbCxlLl9fZG9jX189XCJzdHJpbmdcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhKTpTay5idWlsdGluLm5vbmUubm9uZSQpO3JldHVybiBjfTtTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3M9ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLmhhc093blByb3BlcnR5KFwiY29uc3RydWN0b3JcIiksXCJtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvclwiKTtiLnNsb3RzPWIuc2xvdHN8fHt9O2Iuc2xvdHMudHAkaXRlcj1Tay5nZW5lcmljLnNlbGZJdGVyO2Iuc2xvdHMudHAkaXRlcm5leHQ9Yi5zbG90cy50cCRpdGVybmV4dHx8Yi5pdGVybmV4dDtiLnNsb3RzLnRwJGdldGF0dHI9Yi5zbG90cy50cCRnZXRhdHRyfHxcblNrLmdlbmVyaWMuZ2V0QXR0cjthPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSxiKTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnMucHVzaChhKTtyZXR1cm4gYX07U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzPVtdO1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcz1mdW5jdGlvbihhLGIsYyl7T2JqZWN0LmVudHJpZXMoYykuZm9yRWFjaCgoW2MsZF0pPT57ZC4kbmFtZT1kLiRuYW1lfHxjO2JbY109bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKGQsbnVsbCxhKX0pfTtTay5hYnN0ci5zdXBlckNvbnN0cnVjdG9yPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7YS5wcm90b3R5cGUudHAkYmFzZS5hcHBseShiLGQpfX0sZnVuY3Rpb24obSxxKXtjb25zdCBhPW5ldyBNYXA7U2suYnVpbHRpbi5vYmplY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm9iamVjdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5vYmplY3QsXCJiYWQgY2FsbCB0byBvYmplY3QsIHVzZSAnbmV3J1wiKX0sYmFzZTpudWxsLHNsb3RzOnt0cCRuZXcoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkbmV3IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3QuX19uZXdfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgdHlwZSB0byBpbnN0YW50aWF0ZSlcIik7aWYodGhpcy50cCRpbml0PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpO31yZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3J9LHRwJGluaXQoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkaW5pdCE9PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRpbml0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX2luaXRfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSlcIik7XG5pZih0aGlzLnRwJG5ldz09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiLl9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTt9fSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0ciwkcigpe2NvbnN0IGE9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtb2R1bGUpO2xldCBiPVwiXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSYmKGI9YS52K1wiLlwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2IrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIgb2JqZWN0PlwiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuJHIoKX0sdHAkaGFzaCgpe2xldCBjPWEuZ2V0KHRoaXMpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7XG5jPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUi1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTthLnNldCh0aGlzLGMpO3JldHVybiBjfSx0cCRyaWNoY29tcGFyZShhLGIpe3N3aXRjaChiKXtjYXNlIFwiRXFcIjphPXRoaXM9PT1hfHxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDticmVhaztjYXNlIFwiTm90RXFcIjphPXRoaXMudHAkcmljaGNvbXBhcmUoYSxcIkVxXCIpO2EhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCYmKGE9IVNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7YnJlYWs7ZGVmYXVsdDphPVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfXJldHVybiBhfSx0cCRkb2M6XCJUaGUgbW9zdCBiYXNlIHR5cGVcIn0sZ2V0c2V0czp7X19jbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2IkdHlwZX0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBfX2NsYXNzX18gYXR0cmlidXRlXCIpO1xuaWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcywgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO2NvbnN0IGI9dGhpcy5vYiR0eXBlO2lmKCEoYi4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKSYmYS4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKXx8dm9pZCAwIT09Yi5zayRrbGFzcyYmdm9pZCAwIT09YS5zayRrbGFzcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiIF9fY2xhc3NfXyBhc3NpZ25tZW50IG9ubHkgc3VwcG9ydGVkIGZvciBoZWFwIHR5cGVzIG9yIE1vZHVsZVR5cGUgc3ViY2xhc3Nlc1wiKTtpZihhLnByb3RvdHlwZS5zayRidWlsdGluQmFzZSE9PXRoaXMuc2skYnVpbHRpbkJhc2UpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jbGFzc19fIGFzc2lnbm1lbnQ6ICdcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcblwiJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIidcIik7T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsYS5wcm90b3R5cGUpfSwkZG9jOlwidGhlIG9iamVjdCdzIGNsYXNzXCJ9fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPVtdO2lmKHRoaXMuJGQpaWYodGhpcy4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClhPXRoaXMuJGQuc2skYXNhcnJheSgpO2Vsc2UgZm9yKHZhciBiIGluIHRoaXMuJGQpYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cihiKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS5fX2Rpcl9fLFt0aGlzLm9iJHR5cGVdKTthLnB1c2goLi4uYi52KTtiLnY9YTtyZXR1cm4gYn0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJEZWZhdWx0IGRpcigpIGltcGxlbWVudGF0aW9uLlwifSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZihhPVxuU2suZmZpLnJlbWFwVG9KcyhhKSxcIlwiIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZm9ybWF0IHNwZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9ZWxzZXtpZihTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQgZXhwZWN0cyBhcmcgMiB0byBiZSBzdHJpbmcgb3IgdW5pY29kZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9cmV0dXJuIHRoaXMudHAkc3RyKCl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyLlwifX0scHJvdG86e3ZhbHVlT2Y6T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHAkc3RyKCkudn0saGFzT3duUHJvcGVydHk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmhwJHR5cGU6dm9pZCAwLHNrJGF0dHJFcnJvcigpe3JldHVyblwiJ1wiK3RoaXMudHAkbmFtZStcIicgb2JqZWN0XCJ9fX0pO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJ0eXBlXCIsU2suYnVpbHRpbi50eXBlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi50eXBlKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYyhhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2E9dGhpcy5jYWxsKGEsYlswXSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLFxuYiwxLDIpO2E9dGhpcy5jYWxsKGEsLi4uYik7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gZShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9ZnVuY3Rpb24gZihhLGIsZCl7YT1jLmNhbGwodGhpcyxhLGIsZCk7cmV0dXJuIGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9hOm5ldyBTay5idWlsdGluLmJvb2woYSl9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7Yz1hLmNhbGwodGhpcyxjLGQsZSk7cmV0dXJuIGIoYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgYj1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixcbltdKX19ZnVuY3Rpb24gZChhLGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGY9ZS50cCRkZXNjcl9nZXQ/ZS50cCRkZXNjcl9nZXQodGhpcyk6ZTtmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShmLFtdKTtpZighYihmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBzaG91bGQgcmV0dXJuIFwiK2MrXCIgKHJldHVybmVkIFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiKVwiKTtyZXR1cm4gdm9pZCAwIT09ZD9kKGYpOmZ9fX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtiXSl9fWZ1bmN0aW9uIG4oYSxiKXtsZXQgYz10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGdldGF0dHJpYnV0ZSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBjLmQkd3JhcHBlZC5jYWxsKHRoaXMsXG5hLGIpO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7Y29uc3QgZD1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gYj9kOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhkKX1mdW5jdGlvbiBrKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmKXtsZXQgZzt2b2lkIDA9PT1lPyhnPWIsYz1udWxsKTpnPWE7bGV0IGg9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKG5ldyBTay5idWlsdGluLnN0cihnKSk7aWYoaCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBoLmQkd3JhcHBlZC5jYWxsKHRoaXMsZCxlKTtoLnRwJGRlc2NyX2dldCYmKGg9aC50cCRkZXNjcl9nZXQodGhpcykpO1xuaWYodm9pZCAwIT09aClkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShoLHZvaWQgMD09PWU/W2RdOltkLGVdKTtlbHNle2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgXCIrYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoZyk7fXJldHVybiBmP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX19ZnVuY3Rpb24gcChhLGIpe2xldCBjPWEub2IkdHlwZTtmb3IoO2MmJnZvaWQgMCE9PWMuc2ska2xhc3M7KWM9Yy5wcm90b3R5cGUudHAkYmFzZTtpZihjJiZjLnByb3RvdHlwZS50cCRzZXRhdHRyIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBhcHBseSB0aGlzIFwiK2IuJG5hbWUrXCIgdG8gXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO31Tay5zbG90cz1PYmplY3QuY3JlYXRlKG51bGwpO1xubT1Tay5zbG90cztTay5zbG90cy5fX2luaXRfXz17JG5hbWU6XCJfX2luaXRfX1wiLCRzbG90X25hbWU6XCJ0cCRpbml0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PntpZighU2suYnVpbHRpbi5jaGVja05vbmUoYSkmJnZvaWQgMCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5jYWxsKGEsYixjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJJbml0aWFsaXplIHNlbGYuICBTZWUgaGVscCh0eXBlKHNlbGYpKSBmb3IgYWNjdXJhdGUgc2lnbmF0dXJlLlwifTtcbm0uX19uZXdfXz17JG5hbWU6XCJfX25ld19fXCIsJHNsb3RfbmFtZTpcInRwJG5ld1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7Y29uc3QgYj1mdW5jdGlvbihiLGMpe2xldCBkPWE7YS50cCRkZXNjcl9nZXQmJihkPWEudHAkZGVzY3JfZ2V0KG51bGwsdGhpcy5jb25zdHJ1Y3RvcikpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbdGhpcy5jb25zdHJ1Y3RvciwuLi5iXSxjKX07Yi5zayRzdGF0aWNfbmV3PSExO3JldHVybiBifSwkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdC5cIn07bS5fX2NhbGxfXz17JG5hbWU6XCJfX2NhbGxfX1wiLCRzbG90X25hbWU6XCJ0cCRjYWxsXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOlxuYTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsYixjKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXthPWEudHAkY2FsbChiLGMpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDYWxsIHNlbGYgYXMgYSBmdW5jdGlvbi5cIn07bS5fX3JlcHJfXz17JG5hbWU6XCJfX3JlcHJfX1wiLCRzbG90X25hbWU6XCIkclwiLCRzbG90X2Z1bmM6ZChcIl9fcmVwcl9fXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyxcInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHJlcHIoc2VsZikuXCJ9O20uX19zdHJfXz17JG5hbWU6XCJfX3N0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHN0clwiLCRzbG90X2Z1bmM6ZChcIl9fc3RyX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFxuXCJzdHJcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBzdHIoc2VsZikuXCJ9O3ZhciB1PWQoXCJfX2hhc2hfX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT5cIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY6YS50cCRoYXNoKCkpO20uX19oYXNoX189eyRuYW1lOlwiX19oYXNoX19cIiwkc2xvdF9uYW1lOlwidHAkaGFzaFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnUoYSl9LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBoYXNoKHNlbGYpLlwifTttLl9fZ2V0YXR0cmlidXRlX189eyRuYW1lOlwiX19nZXRhdHRyaWJ1dGVfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYSxcbmIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cik7aWYodm9pZCAwPT09YylyZXR1cm4gbi5jYWxsKHRoaXMsYSxiKTtjb25zdCBkPVNrLm1pc2NldmFsLmNoYWluKG4uY2FsbCh0aGlzLGEsYiksYj0+U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PntpZih2b2lkIDAhPT1iKXJldHVybiBiO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSl9LGZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSkpO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYixjKTtiPWJbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7Yz10aGlzLmNhbGwoYSxiKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGhhcyBubyBhdHRyaWJ1dGUgXCIrYi4kanNzdHIoKSk7cmV0dXJuIGN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRhdHRyX189eyRuYW1lOlwiX19nZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkZ2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX2dldGF0dHJpYnV0ZV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fc2V0YXR0cl9fPXskbmFtZTpcIl9fc2V0YXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOmsoXCJfX3NldGF0dHJfX1wiLFxuXCJfX2RlbGF0dHJfX1wiKSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTtwKGEsdGhpcyk7dGhpcy5jYWxsKGEsYlswXSxiWzFdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiSW1wbGVtZW50IHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpLlwifTttLl9fZGVsYXR0cl9fPXskbmFtZTpcIl9fZGVsYXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOm0uX19zZXRhdHRyX18uJHNsb3RfZnVuYywkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IGRlbGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRfXz17JG5hbWU6XCJfX2dldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX2dldFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtudWxsPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTtudWxsPT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO2NvbnN0IGU9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFtiLGNdKTtyZXR1cm4gZD9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7Yz1iWzBdO2I9YlsxXTtjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYz1udWxsKTtiPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYj1udWxsKTtpZihudWxsPT09YiYmbnVsbD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkXCIpO3JldHVybiB0aGlzLmNhbGwoYSxjLGIpfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIG93bmVyLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UsIHdoaWNoIGlzIG9mIHR5cGUgb3duZXIuXCJ9O20uX19zZXRfXz17JG5hbWU6XCJfX3NldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX3NldFwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIiksJHdyYXBwZXI6ZSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sXG4kZG9jOlwiU2V0IGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSB0byB2YWx1ZS5cIn07bS5fX2RlbGV0ZV9fPXskbmFtZTpcIl9fZGVsZXRlX19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzptLl9fc2V0X18uJHNsb3RfZnVuYywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UuXCJ9O20uX19lcV9fPXskbmFtZTpcIl9fZXFfX1wiLCRzbG90X25hbWU6XCJvYiRlcVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPT12YWx1ZS5cIn07bS5fX2dlX189eyRuYW1lOlwiX19nZV9fXCIsJHNsb3RfbmFtZTpcIm9iJGdlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gc2VsZj49dmFsdWUuXCJ9O20uX19ndF9fPXskbmFtZTpcIl9fZ3RfX1wiLCRzbG90X25hbWU6XCJvYiRndFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPnZhbHVlLlwifTttLl9fbGVfXz17JG5hbWU6XCJfX2xlX19cIiwkc2xvdF9uYW1lOlwib2IkbGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw9dmFsdWUuXCJ9O20uX19sdF9fPXskbmFtZTpcIl9fbHRfX1wiLCRzbG90X25hbWU6XCJvYiRsdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPHZhbHVlLlwifTttLl9fbmVfXz17JG5hbWU6XCJfX25lX19cIiwkc2xvdF9uYW1lOlwib2IkbmVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmIT12YWx1ZS5cIn07bS5fX2l0ZXJfXz17JG5hbWU6XCJfX2l0ZXJfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVyXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJJbXBsZW1lbnQgaXRlcihzZWxmKS5cIn07bS5fX25leHRfXz17JG5hbWU6XCJfX25leHRfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YSxkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbikpdGhyb3cgYTtcbn0pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS50cCRpdGVybmV4dCghMCksYT0+e2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjtyZXR1cm4gYX0pfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBuZXh0KHNlbGYpLlwifTttLl9fbGVuX189eyRuYW1lOlwiX19sZW5fX1wiLCRzbG90X25hbWU6XCJzcSRsZW5ndGhcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7aWYoYilyZXR1cm4gYj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksU2subWlzY2V2YWwuY2hhaW4oYixcbmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtyZXR1cm4gU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYil9fSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gbGVuKHNlbGYpLlwifTttLl9fY29udGFpbnNfXz17JG5hbWU6XCJfX2NvbnRhaW5zX19cIiwkc2xvdF9uYW1lOlwic3EkY29udGFpbnNcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtiXSk7Yj1Tay5taXNjZXZhbC5jaGFpbihiLGE9PlNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7cmV0dXJuIGIuJGlzU3VzcGVuc2lvbj9jP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpOlxuYn19LCR3cmFwcGVyOmwoYyxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGtleSBpbiBzZWxmLlwifTttLl9fZ2V0aXRlbV9fPXskbmFtZTpcIl9fZ2V0aXRlbV9fXCIsJHNsb3RfbmFtZTpcIm1wJHN1YnNjcmlwdFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtyZXR1cm4gYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmW2tleV0uXCJ9O20uX19zZXRpdGVtX189eyRuYW1lOlwiX19zZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLFxuJHNsb3RfZnVuYzprKFwiX19zZXRpdGVtX19cIixcIl9fZGVsaXRlbV9fXCIsXCJkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlNldCBzZWxmW2tleV0gdG8gdmFsdWUuXCJ9O20uX19kZWxpdGVtX189eyRuYW1lOlwiX19kZWxpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLCRzbG90X2Z1bmM6bS5fX3NldGl0ZW1fXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBzZWxmW2tleV0uXCJ9O20uX19hZGRfXz17JG5hbWU6XCJfX2FkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmK3ZhbHVlLlwifTtcbm0uX19yYWRkX189eyRuYW1lOlwiX19yYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2FkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZStzZWxmLlwifTttLl9faWFkZF9fPXskbmFtZTpcIl9faWFkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYrPXZhbHVlLlwifTttLl9fc3ViX189eyRuYW1lOlwiX19zdWJfX1wiLCRzbG90X25hbWU6XCJuYiRzdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLXZhbHVlLlwifTttLl9fcnN1Yl9fPXskbmFtZTpcIl9fcnN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlLXNlbGYuXCJ9O20uX19pbXVsX189eyRuYW1lOlwiX19pbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKj12YWx1ZS5cIn07bS5fX211bF9fPXskbmFtZTpcIl9fbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZip2YWx1ZS5cIn07bS5fX3JtdWxfXz17JG5hbWU6XCJfX3JtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcbiR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSpzZWxmLlwifTttLl9faXN1Yl9fPXskbmFtZTpcIl9faXN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi09dmFsdWUuXCJ9O20uX19tb2RfXz17JG5hbWU6XCJfX21vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJXZhbHVlLlwifTttLl9fcm1vZF9fPXskbmFtZTpcIl9fcm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSVzZWxmLlwifTttLl9faW1vZF9fPXskbmFtZTpcIl9faW1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHZhbHVlJT1zZWxmLlwifTttLl9fZGl2bW9kX189eyRuYW1lOlwiX19kaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZGl2bW9kKHNlbGYsIHZhbHVlKS5cIn07bS5fX3JkaXZtb2RfXz17JG5hbWU6XCJfX3JkaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gZGl2bW9kKHZhbHVlLCBzZWxmKVwifTttLl9fcG9zX189eyRuYW1lOlwiX19wb3NfX1wiLCRzbG90X25hbWU6XCJuYiRwb3NpdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiK3NlbGZcIn07bS5fX25lZ19fPXskbmFtZTpcIl9fbmVnX19cIiwkc2xvdF9uYW1lOlwibmIkbmVnYXRpdmVcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIi1zZWxmXCJ9O20uX19hYnNfXz17JG5hbWU6XCJfX2Fic19fXCIsJHNsb3RfbmFtZTpcIm5iJGFic1wiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiYWJzKHNlbGYpXCJ9O20uX19ib29sX189eyRuYW1lOlwiX19ib29sX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fYm9vbF9fXCIsXG5Tay5idWlsdGluLmNoZWNrQm9vbCxcImJvb2xcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJzZWxmICE9IDBcIn07bS5fX2ludmVydF9fPXskbmFtZTpcIl9faW52ZXJ0X19cIiwkc2xvdF9uYW1lOlwibmIkaW52ZXJ0XCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ+c2VsZlwifTttLl9fbHNoaWZ0X189eyRuYW1lOlwiX19sc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRsc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw8dmFsdWUuXCJ9O20uX19ybHNoaWZ0X189eyRuYW1lOlwiX19ybHNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLCRzbG90X2Z1bmM6ZyxcbiR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPDxzZWxmLlwifTttLl9fcnNoaWZ0X189eyRuYW1lOlwiX19yc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZj4+dmFsdWUuXCJ9O20uX19ycnNoaWZ0X189eyRuYW1lOlwiX19ycnNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZT4+c2VsZi5cIn07bS5fX2lsc2hpZnRfXz17JG5hbWU6XCJfX2lsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2xzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY8PD12YWx1ZS5cIn07bS5fX2lyc2hpZnRfXz17JG5hbWU6XCJfX2lyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmPT4+dmFsdWUuXCJ9O20uX19hbmRfXz17JG5hbWU6XCJfX2FuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJnZhbHVlLlwifTttLl9fcmFuZF9fPXskbmFtZTpcIl9fcmFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmVsY3RlZF9hbmRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSZzZWxmLlwifTttLl9faWFuZF9fPXskbmFtZTpcIl9faWFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmJj12YWx1ZS5cIn07bS5fX3hvcl9fPXskbmFtZTpcIl9feG9yX19cIiwkc2xvdF9uYW1lOlwibmIkeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZedmFsdWUuXCJ9O20uX19yeG9yX189eyRuYW1lOlwiX19yeG9yX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZV5zZWxmLlwifTtcbm0uX19peG9yX189eyRuYW1lOlwiX19peG9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV94b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZl49dmFsdWUuXCJ9O20uX19vcl9fPXskbmFtZTpcIl9fb3JfX1wiLCRzbG90X25hbWU6XCJuYiRvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmfHZhbHVlLlwifTttLl9fcm9yX189eyRuYW1lOlwiX19yb3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfb3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWV8c2VsZi5cIn07bS5fX2lvcl9fPXskbmFtZTpcIl9faW9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9vclwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZ8PXZhbHVlLlwifTttLl9faW50X189eyRuYW1lOlwiX19pbnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnRcIiwkc2xvdF9mdW5jOmQoXCJfX2ludF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O20uX19mbG9hdF9fPXskbmFtZTpcIl9fZmxvYXRfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9hdFwiLCRzbG90X2Z1bmM6ZChcIl9fZmxvYXRfX1wiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCxcImZsb2F0XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJmbG9hdChzZWxmKVwifTttLl9fZmxvb3JkaXZfXz17JG5hbWU6XCJfX2Zsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZmxvb3JfZGl2aWRlXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi8vdmFsdWUuXCJ9O20uX19yZmxvb3JkaXZfXz17JG5hbWU6XCJfX3JmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUvL3NlbGYuXCJ9O20uX19pZmxvb3JkaXZfXz17JG5hbWU6XCJfX2lmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYvLz12YWx1ZS5cIn07bS5fX3RydWVkaXZfXz17JG5hbWU6XCJfX3RydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmL3ZhbHVlLlwifTttLl9fcnRydWVkaXZfXz17JG5hbWU6XCJfX3J0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS9zZWxmLlwifTttLl9faXRydWVkaXZfXz17JG5hbWU6XCJfX2l0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi89dmFsdWUuXCJ9O20uX19pbmRleF9fPXskbmFtZTpcIl9faW5kZXhfX1wiLCRzbG90X25hbWU6XCJuYiRpbmRleFwiLCRzbG90X2Z1bmM6ZChcIl9faW5kZXhfX1wiLFxuU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PmEudiksJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYgY29udmVydGVkIHRvIGFuIGludGVnZXIsIGlmIHNlbGYgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpbmRleCBpbnRvIGEgbGlzdC5cIn07bS5fX3Bvd19fPXskbmFtZTpcIl9fcG93X19cIiwkc2xvdF9uYW1lOlwibmIkcG93ZXJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gdm9pZCAwPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLFtiXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2IsY10pfX0sJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIHBvdyhzZWxmLCB2YWx1ZSwgbW9kKS5cIn07bS5fX3Jwb3dfXz17JG5hbWU6XCJfX3Jwb3dfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHZhbHVlLCBzZWxmLCBtb2QpLlwifTttLl9faXBvd19fPXskbmFtZTpcIl9faXBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgKio9XCJ9O20uX19tYXRtdWxfXz17JG5hbWU6XCJfX21hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJG1hdHJpeF9tdWx0aXBseVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZAdmFsdWUuXCJ9O20uX19ybWF0bXVsX189eyRuYW1lOlwiX19ybWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZUBzZWxmLlwifTttLl9faW1hdG11bF9fPXskbmFtZTpcIl9faW1hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZAPXZhbHVlLlwifTttLl9fbG9uZ19fPXskbmFtZTpcIl9fbG9uZ19fXCIsJHNsb3RfbmFtZTpcIm5iJGxvbmdcIixcbiRzbG90X2Z1bmM6ZChcIl9fbG9uZ19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O3ZhciBBLHQ9e25leHQ6eyRuYW1lOlwibmV4dFwiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6bS5fX25leHRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOm0uX19uZXh0X18uJHdyYXBwZXIsJHRleHRzaWc6bS5fX25leHRfXy4kdGV4dHNpZywkZmxhZ3M6bS5fX25leHRfXy4kZmxhZ3N9LF9fbm9uemVyb19fOnskbmFtZTpcIl9fbm9uemVyb19fXCIsJHNsb3RfbmFtZTpcIm5iJGJvb2xcIiwkc2xvdF9mdW5jOmQoXCJfX25vbnplcm9fX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ4Ll9fbm9uemVyb19fKCkgPD09PiB4ICE9IDBcIn0sXG5fX2Rpdl9fOnskbmFtZTpcIl9fZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19kaXZfXyh5KSA8PT0+IHgveVwifSxfX3JkaXZfXzp7JG5hbWU6XCJfX3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19yZGl2X18oeSkgPD09PiB4L3lcIn0sX19pZGl2X186eyRuYW1lOlwiX19pZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiaW1wbGVtZW50IHNlbGYgLz0gb3RoZXJcIn19O1NrLnN1YlNsb3RzPXttYWluX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHt0cCRpbml0OlwiX19pbml0X19cIixcbnRwJGNhbGw6XCJfX2NhbGxfX1wiLCRyOlwiX19yZXByX19cIix0cCRzdHI6XCJfX3N0cl9fXCIsdHAkZ2V0YXR0cjpcIl9fZ2V0YXR0cmlidXRlX19cIix0cCRzZXRhdHRyOltcIl9fc2V0YXR0cl9fXCIsXCJfX2RlbGF0dHJfX1wiXSxvYiRlcTpcIl9fZXFfX1wiLG9iJG5lOlwiX19uZV9fXCIsb2IkbHQ6XCJfX2x0X19cIixvYiRsZTpcIl9fbGVfX1wiLG9iJGd0OlwiX19ndF9fXCIsb2IkZ2U6XCJfX2dlX19cIix0cCRkZXNjcl9nZXQ6XCJfX2dldF9fXCIsdHAkZGVzY3Jfc2V0OltcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIl0sdHAkaXRlcjpcIl9faXRlcl9fXCIsdHAkaXRlcm5leHQ6XCJfX25leHRfX1wifSksbnVtYmVyX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHtuYiRhYnM6XCJfX2Fic19fXCIsbmIkbmVnYXRpdmU6XCJfX25lZ19fXCIsbmIkcG9zaXRpdmU6XCJfX3Bvc19fXCIsbmIkaW50OlwiX19pbnRfX1wiLG5iJGxvbmc6XCJfX2xvbmdfX1wiLG5iJGZsb2F0OlwiX19mbG9hdF9fXCIsbmIkYWRkOlwiX19hZGRfX1wiLG5iJHJlZmxlY3RlZF9hZGQ6XCJfX3JhZGRfX1wiLFxubmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJHN1YnRyYWN0OlwiX19zdWJfX1wiLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpcIl9fcnN1Yl9fXCIsbmIkaW5wbGFjZV9zdWJ0cmFjdDpcIl9faXN1Yl9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIixuYiRmbG9vcl9kaXZpZGU6XCJfX2Zsb29yZGl2X19cIixuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOlwiX19yZmxvb3JkaXZfX1wiLG5iJGlucGxhY2VfZmxvb3JfZGl2aWRlOlwiX19pZmxvb3JkaXZfX1wiLG5iJGludmVydDpcIl9faW52ZXJ0X19cIixuYiRyZW1haW5kZXI6XCJfX21vZF9fXCIsbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpcIl9fcm1vZF9fXCIsbmIkaW5wbGFjZV9yZW1haW5kZXI6XCJfX2ltb2RfX1wiLG5iJGRpdm1vZDpcIl9fZGl2bW9kX19cIixuYiRyZWZsZWN0ZWRfZGl2bW9kOlwiX19yZGl2bW9kX19cIixuYiRwb3dlcjpcIl9fcG93X19cIixuYiRyZWZsZWN0ZWRfcG93ZXI6XCJfX3Jwb3dfX1wiLFxubmIkaW5wbGFjZV9wb3dlcjpcIl9faXBvd19fXCIsbmIkZGl2aWRlOlwiX190cnVlZGl2X19cIixuYiRyZWZsZWN0ZWRfZGl2aWRlOlwiX19ydHJ1ZWRpdl9fXCIsbmIkaW5wbGFjZV9kaXZpZGU6XCJfX2l0cnVlZGl2X19cIixuYiRib29sOlwiX19ib29sX19cIixuYiRhbmQ6XCJfX2FuZF9fXCIsbmIkcmVmbGVjdGVkX2FuZDpcIl9fcmFuZF9fXCIsbmIkaW5wbGFjZV9hbmQ6XCJfX2lhbmRfX1wiLG5iJG9yOlwiX19vcl9fXCIsbmIkcmVmbGVjdGVkX29yOlwiX19yb3JfX1wiLG5iJGlucGxhY2Vfb3I6XCJfX2lvcl9fXCIsbmIkeG9yOlwiX194b3JfX1wiLG5iJHJlZmxlY3RlZF94b3I6XCJfX3J4b3JfX1wiLG5iJGlucGxhY2VfeG9yOlwiX19peG9yX19cIixuYiRsc2hpZnQ6XCJfX2xzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX2xzaGlmdDpcIl9fcmxzaGlmdF9fXCIsbmIkcnNoaWZ0OlwiX19yc2hpZnRfX1wiLG5iJHJlZmxlY3RlZF9yc2hpZnQ6XCJfX3Jyc2hpZnRfX1wiLG5iJGlucGxhY2VfbHNoaWZ0OlwiX19pbHNoaWZ0X19cIixuYiRpbnBsYWNlX3JzaGlmdDpcIl9faXJzaGlmdF9fXCIsXG5uYiRtYXRyaXhfbXVsdGlwbHk6XCJfX21hdG11bF9fXCIsbmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseTpcIl9fcm1hdG11bF9fXCIsbmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk6XCJfX2ltYXRtdWxfX1wifSksc2VxdWVuY2VfYW5kX21hcHBpbmdfc2xvdHM6T2JqZWN0LmVudHJpZXMoe3NxJGxlbmd0aDpcIl9fbGVuX19cIixzcSRjb250YWluczpcIl9fY29udGFpbnNfX1wiLG1wJHN1YnNjcmlwdDpcIl9fZ2V0aXRlbV9fXCIsbXAkYXNzX3N1YnNjcmlwdDpbXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIl0sbmIkYWRkOlwiX19hZGRfX1wiLG5iJG11bHRpcGx5OlwiX19tdWxfX1wiLG5iJHJlZmxlY3RlZF9tdWx0aXBseTpcIl9fcm11bF9fXCIsbmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wifSl9O1NrLnJlZmxlY3RlZE51bWJlclNsb3RzPXtuYiRhZGQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9hZGRcIn0sbmIkc3VidHJhY3Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRzdWJ0cmFjdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG11bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIn0sbmIkZGl2aWRlOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRkaXZpZGUodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRmbG9vcl9kaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGZsb29yX2RpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LFxubmIkcmVtYWluZGVyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyZW1haW5kZXIodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRkaXZtb2Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdm1vZCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJHBvd2VyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixzbG90OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkcG93ZXIodGhpcyxiKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGFuZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FuZFwifSxcbm5iJG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfb3JcIn0sbmIkeG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfeG9yXCJ9LG5iJGxzaGlmdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkbHNoaWZ0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcnNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRtYXRyaXhfbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxleHRlZF9tYXRyaXhfbXVsdGlwbHlcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9cbmEubmIkbWF0cml4X211bHRpcGx5KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX19O1NrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzPXtzcSRjb25jYXQ6W1wibmIkYWRkXCJdLHNxJHJlcGVhdDpbXCJuYiRtdWx0aXBseVwiLFwibmIkcmVmbGVjdGVkX211bHRpcGx5XCJdLG1wJGxlbmd0aDpbXCJzcSRsZW5ndGhcIl0sc3EkaW5wbGFjZV9yZXBlYXQ6W1wibmIkaW5wbGFjZV9tdWx0aXBseVwiXSxzcSRpbnBsYWNlX2NvbmNhdDpbXCJuYiRpbnBsYWNlX2FkZFwiXX07U2suZHVuZGVyVG9Ta3VscHQ9e19fcmVwcl9fOlwiJHJcIixfX3N0cl9fOlwidHAkc3RyXCIsX19pbml0X186XCJ0cCRpbml0XCIsX19uZXdfXzpcInRwJG5ld1wiLF9faGFzaF9fOlwidHAkaGFzaFwiLF9fY2FsbF9fOlwidHAkY2FsbFwiLF9faXRlcl9fOlwidHAkaXRlclwiLF9fbmV4dF9fOlwidHAkaXRlcm5leHRcIixfX2VxX186XCJvYiRlcVwiLF9fbmVfXzpcIm9iJG5lXCIsX19sdF9fOlwib2IkbHRcIixfX2xlX186XCJvYiRsZVwiLFxuX19ndF9fOlwib2IkZ3RcIixfX2dlX186XCJvYiRnZVwiLF9fYWJzX186XCJuYiRhYnNcIixfX25lZ19fOlwibmIkbmVnYXRpdmVcIixfX3Bvc19fOlwibmIkcG9zaXRpdmVcIixfX2ludF9fOlwibmIkaW50XCIsX19mbG9hdF9fOlwibmIkZmxvYXRcIixfX2FkZF9fOlwibmIkYWRkXCIsX19yYWRkX186XCJuYiRyZWZsZWN0ZWRfYWRkXCIsX19pYWRkX186XCJuYiRpbnBsYWNlX2FkZFwiLF9fc3ViX186XCJuYiRzdWJ0cmFjdFwiLF9fcnN1Yl9fOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsX19pc3ViX186XCJuYiRpbnBsYWNlX3N1YnRyYWN0XCIsX19tdWxfXzpcIm5iJG11bHRpcGx5XCIsX19ybXVsX186XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIixfX2ltdWxfXzpcIm5iJGlucGxhY2VfbXVsdGlwbHlcIixfX3RydWVkaXZfXzpcIm5iJGRpdmlkZVwiLF9fcnRydWVkaXZfXzpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixfX2l0cnVlZGl2X186XCJuYiRpbnBsYWNlX2RpdmlkZVwiLF9fZmxvb3JkaXZfXzpcIm5iJGZsb29yX2RpdmlkZVwiLF9fcmZsb29yZGl2X186XCJuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlXCIsXG5fX2lmbG9vcmRpdl9fOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIixfX2ludmVydF9fOlwibmIkaW52ZXJ0XCIsX19tb2RfXzpcIm5iJHJlbWFpbmRlclwiLF9fcm1vZF9fOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLF9faW1vZF9fOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIixfX2Rpdm1vZF9fOlwibmIkZGl2bW9kXCIsX19yZGl2bW9kX186XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsX19wb3dfXzpcIm5iJHBvd2VyXCIsX19ycG93X186XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixfX2lwb3dfXzpcIm5iJGlucGxhY2VfcG93ZXJcIixfX2Jvb2xfXzpcIm5iJGJvb2xcIixfX2xvbmdfXzpcIm5iJGxvbmdcIixfX2xzaGlmdF9fOlwibmIkbHNoaWZ0XCIsX19ybHNoaWZ0X186XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsX19pbHNoaWZ0X186XCJuYiRpbnBsYWNlX2xzaGlmdFwiLF9fcnNoaWZ0X186XCJuYiRyc2hpZnRcIixfX3Jyc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixfX2lyc2hpZnRfXzpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsXG5fX2FuZF9fOlwibmIkYW5kXCIsX19yYW5kX186XCJuYiRyZWZsZWN0ZWRfYW5kXCIsX19pYW5kX186XCJuYiRpbnBsYWNlX2FuZFwiLF9fb3JfXzpcIm5iJG9yXCIsX19yb3JfXzpcIm5iJHJlZmxlY3RlZF9vclwiLF9faW9yX186XCJuYiRpbnBsYWNlX29yXCIsX194b3JfXzpcIm5iJHhvclwiLF9fcnhvcl9fOlwibmIkcmVmbGVjdGVkX3hvclwiLF9faXhvcl9fOlwibmIkaW5wbGFjZV94b3JcIixfX21hdG11bF9fOlwibmIkbWF0cml4X211bHRpcGx5XCIsX19ybWF0bXVsX186XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsX19pbWF0bXVsX186XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLF9fZ2V0X186XCJ0cCRkZXNjcl9nZXRcIixfX3NldF9fOlwidHAkZGVzY3Jfc2V0XCIsX19kZWxldGVfXzpcInRwJGRlc2NyX3NldFwiLF9fZ2V0YXR0cmlidXRlX186XCJ0cCRnZXRhdHRyXCIsX19nZXRhdHRyX186XCJ0cCRnZXRhdHRyXCIsX19zZXRhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19kZWxhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19sZW5fXzpcInNxJGxlbmd0aFwiLFxuX19jb250YWluc19fOlwic3EkY29udGFpbnNcIixfX2dldGl0ZW1fXzpcIm1wJHN1YnNjcmlwdFwiLF9fc2V0aXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwiLF9fZGVsaXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwifTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cER1bmRlck1ldGhvZHNcIixTay5zZXR1cER1bmRlck1ldGhvZHMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYixjKXtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdLnByb3RvdHlwZTtlLmhhc093blByb3BlcnR5KGMpfHwoZVtjXT1lW2JdLGRlbGV0ZSBlW2JdKX19dmFyIGM9U2suc2xvdHM7aWYoIWF8fHZvaWQgMCE9PUEpe3ZhciBkPVNrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycyxlPVtTay5idWlsdGluLmludF8sU2suYnVpbHRpbi5sbmcsU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5jb21wbGV4XSxmPVNrLnN1YlNsb3RzLm51bWJlcl9zbG90cyxnPVNrLnN1YlNsb3RzLm1haW5fc2xvdHMsXG5oPWcuZmluZEluZGV4KGE9PlwidHAkaXRlcm5leHRcIj09PWFbMF0pLGs9Zi5maW5kSW5kZXgoYT0+XCJuYiRib29sXCI9PT1hWzBdKSxsPVNrLmR1bmRlclRvU2t1bHB0O2lmKGEpe2wuX19ib29sX189XCJuYiRib29sXCI7bC5fX25leHRfXz1cInRwJGl0ZXJuZXh0XCI7ZGVsZXRlIGwuX19ub256ZXJvX187ZGVsZXRlIGwuX19kaXZfXztkZWxldGUgbC5fX3JkaXZfXztkZWxldGUgbC5fX2lkaXZfXztkZWxldGUgbC5uZXh0O2ZvcihsZXQgYSBpbiBBKWNbYV09QVthXTtmb3IobGV0IGEgaW4gdClkZWxldGUgY1thXTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKWM9ZVthXS5wcm90b3R5cGUsZGVsZXRlIGMuX19kaXZfXyxkZWxldGUgYy5fX3JkaXZfXztnW2hdWzFdPVwiX19uZXh0X19cIjtmW2tdWzFdPVwiX19ib29sX19cIjtiKGQsXCJuZXh0XCIsXCJfX25leHRfX1wiKTtiKGUsXCJfX2Jvb2xfX1wiLFwiX19ub256ZXJvX19cIil9ZWxzZXt2b2lkIDA9PT1BJiYoYy5weTMkc2xvdHM9e19fbmV4dF9fOmMuX19uZXh0X199LFxuQT1jLnB5MyRzbG90cyk7bC5uZXh0PVwidHAkaXRlcm5leHRcIjtsLl9fbm9uemVyb19fPVwibmIkYm9vbFwiO2wuX19kaXZfXz1cIm5iJGRpdmlkZVwiO2wuX19yZGl2X189XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCI7bC5fX2lkaXZfXz1cIm5iJGlucGxhY2VfZGl2aWRlXCI7ZGVsZXRlIGwuX19ib29sX187ZGVsZXRlIGwuX19uZXh0X187Zm9yKGxldCBhIGluIHQpY1thXT10W2FdO2ZvcihsZXQgYSBpbiBBKWRlbGV0ZSBjW2FdO2dbaF1bMV09XCJuZXh0XCI7ZltrXVsxXT1cIl9fbm9uemVyb19fXCI7YihkLFwiX19uZXh0X19cIixcIm5leHRcIik7YihlLFwiX19ub256ZXJvX19cIixcIl9fYm9vbF9fXCIpO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGc9Zi5wcm90b3R5cGUsZy5oYXNPd25Qcm9wZXJ0eShcIl9fZGl2X19cIil8fChnLl9fZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsdC5fX2Rpdl9fLGcubmIkZGl2aWRlKSxnLl9fcmRpdl9fPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihmLFxudC5fX3JkaXZfXyxTay5yZWZsZWN0ZWROdW1iZXJTbG90cy5uYiRkaXZpZGUuc2xvdCkpfX19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxoLGQpe3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEse2NvbnN0cnVjdG9yOmQuY29uc3RydWN0b3Isc2xvdHM6T2JqZWN0LmFzc2lnbih7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHI6ZX0sZC5zbG90cyksZ2V0c2V0czpPYmplY3QuYXNzaWduKGQuZ2V0c2V0c3x8e30sZikscHJvdG86T2JqZWN0LmFzc2lnbihkLnByb3RvfHx7fSx7ZCRyZXByX25hbWU6aHx8YSxkJGNoZWNrOmMsZCRzZXRfY2hlY2s6Yn0pLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9ZnVuY3Rpb24gYyhhKXtpZihudWxsPT1hKXJldHVybiB0aGlzO2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXG5cIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTt9ZnVuY3Rpb24gYihhKXtpZighYS5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIit0aGlzLmQkcmVwcl9uYW1lK1wiICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzPlwiKX1jb25zdCBmPXtfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJGRvYz9cbm5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkZGVmLiRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fb2JqY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkdHlwZX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkbmFtZSl9fX07bT17X190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJHRleHRzaWc/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJHRleHRzaWcpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fTtTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yPWEoXCJnZXRzZXRfZGVzY3JpcHRvclwiLHZvaWQgMCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kZ2V0PWIuJGdldDt0aGlzLiRzZXQ9Yi4kc2V0O3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZX0sc2xvdHM6e3RwJGRlc2NyX2dldChhLGIpe2lmKGI9dGhpcy5kJGNoZWNrKGEpKXJldHVybiBiO1xuaWYodm9pZCAwIT09dGhpcy4kZ2V0KXJldHVybiB0aGlzLiRnZXQuY2FsbChhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImdldHNldF9kZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZVwiKTt9LHRwJGRlc2NyX3NldChhLGIpe3RoaXMuZCRzZXRfY2hlY2soYSk7aWYodm9pZCAwIT09dGhpcy4kc2V0KXJldHVybiB0aGlzLiRzZXQuY2FsbChhLGIpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiYXR0cmlidXRlICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIHJlYWRvbmx5XCIpO319fSk7U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcj1hKFwibWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9XG5iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRmbGFncz1hPWIuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsOmEuTm9BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTm9BcmdzOmEuT25lQXJnP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsT25lQXJnOmEuTmFtZWRBcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTmFtZWRBcmdzOnZvaWQgMCE9PWEuTWluQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE1pbkFyZ3M6KHRoaXMuZnVuY19jb2RlPWIuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsLHRoaXMuJG1lbW9pc2VGbGFncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MsXG50aGlzLiRyZXNvbHZlQXJncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRyZXNvbHZlQXJncyl9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMudHAkY2FsbChhLGIpfSx0cCRkZXNjcl9nZXQoYSxiKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYSl9fSxnZXRzZXRzOm0scHJvdG86eyRtZXRob2RGYXN0Q2FsbChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEsYil9LCRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhKX0sJG1ldGhvZENhbGxOb0FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuZCRuYW1lLFxuYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMpfSwkbWV0aG9kQ2FsbE9uZUFyZyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy5kJG5hbWUsYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYVswXSl9LCRtZXRob2RDYWxsTmFtZWRBcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuZCRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGIsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJG1ldGhvZENhbGxNaW5BcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLmQkbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsXG50aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsLi4uYSl9LCRkZWZhdWx0Q2FsbChhLGIpe3RoaXMubSRjaGVja3NlbGYoYVswXSk7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxiKX0sbSRjaGVja3NlbGYoYSl7aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7dGhpcy5kJGNoZWNrKGEpfX19KTtTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcj1hKFwid3JhcHBlcl9kZXNjcmlwdG9yXCIsXCJzbG90IHdyYXBwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZCRkZWY9Yjt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWMuJG5hbWU9Yi4kbmFtZTt0aGlzLmQkd3JhcHBlZD1jfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsXG5iKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIodGhpcyxhKX0sdHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO2NvbnN0IGM9YS5zaGlmdCgpO2lmKCFjLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJ1wiKTtyZXR1cm4gdGhpcy5yYXckY2FsbChjLGEsYil9fSxwcm90bzp7cmF3JGNhbGwoYSxiLGMpe3RoaXMuZCR3cmFwcGVkLiRuYW1lPVxudGhpcy5kJG5hbWU7cmV0dXJuIHRoaXMuZCRkZWYuJHdyYXBwZXIuY2FsbCh0aGlzLmQkd3JhcHBlZCxhLGIsYyl9fX0pO1NrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXI9YShcIm1ldGhvZF93cmFwcGVyXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMubSRkZXNjcj1hO3RoaXMubSRzZWxmPWI7dGhpcy5kJGRlZj1hLmQkZGVmO3RoaXMuZCRuYW1lPWEuZCRuYW1lO3RoaXMuZCR0eXBlPWEuZCR0eXBlfSxzbG90czp7dHAkY2FsbChhLGIpe3JldHVybiB0aGlzLm0kZGVzY3IucmF3JGNhbGwodGhpcy5tJHNlbGYsYSxiKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZihcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1ifHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1ldGhvZF93cmFwcGVyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT10aGlzLm0kc2VsZj09PWEubSRzZWxmJiZ0aGlzLm0kZGVzY3I9PT1hLm0kZGVzY3I7cmV0dXJuXCJFcVwiPT09XG5iP2E6IWF9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtZXRob2Qtd3JhcHBlciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMubSRzZWxmKStcIiBvYmplY3Q+XCIpfX0sZ2V0c2V0czp7X19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5tJHNlbGZ9fX19KTtTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3I9YShcImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRtZXRoPWIuJG1ldGg7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfHxcIjxuYXRpdmUgSlM+XCJ9LHNsb3RzOnt0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7XG5jb25zdCBjPWEuc2hpZnQoKTtyZXR1cm4gdGhpcy50cCRkZXNjcl9nZXQobnVsbCxjKS50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIsYyl7aWYodm9pZCAwPT09YilpZihudWxsIT09YSliPWJ8fGEub2IkdHlwZTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGFuIG9iamVjdCBvciBhIHR5cGVcIik7aWYoYi5vYiR0eXBlIT09U2suYnVpbHRpbi50eXBlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGEgdHlwZSBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIGFzIGFyZyAyXCIpO2lmKCFiLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK1xudGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBvYmplY3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnNrX21ldGhvZCh0aGlzLmQkZGVmLGIpfX0sZ2V0c2V0czptfSk7W1NrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IsU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcixTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcixTay5idWlsdGluLm1ldGhvZF93cmFwcGVyLFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcl0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5za19tZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3RoaXMuJG1ldGg9YS4kbWV0aC5iaW5kKGMpO3RoaXMuJGRvYz1hLiRkb2M7dGhpcy4kc2VsZj1jfHxudWxsO3RoaXMuJG1vZHVsZT1iP25ldyBTay5idWlsdGluLnN0cihiKTpudWxsO3RoaXMuJG5hbWU9YS4kbmFtZXx8YS4kbWV0aC5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy5tJGRlZj1hO3RoaXMuJHRleHRzaWc9YS4kdGV4dHNpZzt0aGlzLiRmbGFncz1hPWEuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRmYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGg6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTWluQXJnczpcbih0aGlzLmZ1bmNfY29kZT10aGlzLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbE1ldGhvZCl9LHByb3RvOnskZmFzdENhbGxOb0t3YXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhKX0sJGNhbGxOb0FyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoKX0sJGNhbGxPbmVBcmcoYSxjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoYVswXSl9LCRjYWxsTmFtZWRBcmdzKGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyh0aGlzLiRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGMsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoKC4uLmEpfSwkY2FsbE1pbkFyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7XG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsdGhpcy4kZmxhZ3MuTWF4QXJncyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRkZWZhdWx0Q2FsbE1ldGhvZChhLGMpe3JldHVybiBudWxsIT09dGhpcy4kc2VsZj9Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuY2FsbCh0aGlzLFt0aGlzLiRzZWxmLC4uLmFdLGMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxjKX0sJG1lbW9pc2VGbGFncygpe3JldHVybiBTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MuY2FsbCh0aGlzKX0sJHJlc29sdmVBcmdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzLmNhbGwodGhpcyl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHIoKXtyZXR1cm4gbnVsbD09PVxudGhpcy4kc2VsZj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gZnVuY3Rpb24gXCIrdGhpcy4kbmFtZStcIj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJ1aWx0LWluIG1ldGhvZCBcIit0aGlzLiRuYW1lK1wiIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlbGYpK1wiIG9iamVjdD5cIil9LHRwJGNhbGwoYSxjKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYyl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT09YyYmXCJOb3RFcVwiIT09Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5za19tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMuJHNlbGY9PT1hLiRzZWxmJiZ0aGlzLm0kZGVmLiRtZXRoPT09YS5tJGRlZi4kbWV0aDtyZXR1cm5cIkVxXCI9PT1jP2E6IWF9fSxnZXRzZXRzOntfX21vZHVsZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJG1vZHVsZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe3RoaXMuJG1vZHVsZT1cbmE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLiRkb2M/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfX0sX190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiR0ZXh0c2lnKX19LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJHNlbGZ8fFNrLnN5c01vZHVsZXMubXAkbG9va3VwKHRoaXMuJG1vZHVsZSl8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubm9uZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm9uZVR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxzbG90czp7dHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb25lVHlwZVwiLFxuYSxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb25lXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiExfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLm5vbmUubm9uZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLm5vbmUucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiTm90SW1wbGVtZW50ZWRcIil9LHRwJG5ldyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLk5vdEltcGxlbWVudGVkLnByb3RvdHlwZSx7djp7dmFsdWU6bnVsbCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9L14oPzooLik/KFs8Pj1cXF5dKSk/KFtcXCtcXC1cXHNdKT8oIyk/KDApPyhcXGQrKT8oLCk/KD86XFwuKFxcZCspKT8oW2JjZGVFZkZnR25vc3hYJV0pPyQvO1NrLmZvcm1hdHRpbmc9e307bGV0IGM9ZnVuY3Rpb24oYSxiLGMsZSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBiKTtpZihhWzZdKXt2YXIgZD1wYXJzZUludChhWzZdLDEwKTtlPWFbMl18fChhWzVdP1wiPVwiOmU/XCI+XCI6XCI8XCIpO2xldCBmPWQtKGIubGVuZ3RoKyhjP2MubGVuZ3RoOjApKTtcbmlmKDA+PWYpcmV0dXJuIGI7ZD0oYVsxXXx8KGFbNV0/XCIwXCI6XCIgXCIpKS5yZXBlYXQoZik7c3dpdGNoKGUpe2Nhc2UgXCI9XCI6aWYoXCJzXCI9PT1hWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCInPScgYWxpZ25tZW50IG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO3JldHVybiBjK2QrYjtjYXNlIFwiPlwiOnJldHVybiBkK2MrYjtjYXNlIFwiPFwiOnJldHVybiBjK2IrZDtjYXNlIFwiXlwiOnJldHVybiBhPU1hdGguZmxvb3IoZi8yKSxkLnN1YnN0cmluZygwLGEpK2MrYitkLnN1YnN0cmluZyhhKX19cmV0dXJuIGMrYn0sYj1mdW5jdGlvbihhLGIpe3JldHVybiBiP1wiLVwiOlwiK1wiPT09YVszXT9cIitcIjpcIiBcIj09PWFbM10/XCIgXCI6XCJcIn0sZT1mdW5jdGlvbihhLGUsZCl7U2suYXNzZXJ0cy5hc3NlcnQoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKTtpZihhWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJQcmVjaXNpb24gbm90IGFsbG93ZWQgaW4gaW50ZWdlciBmb3JtYXRcIik7XG5sZXQgZj1lLnN0ciQoZCwhMSk7ZT1lLm5iJGlzbmVnYXRpdmUoKTtlPWIoYSxlKTthWzRdJiYoMTY9PT1kP2UrPVwiMHhcIjo4PT09ZD9lKz1cIjBvXCI6Mj09PWQmJihlKz1cIjBiXCIpKTtcIlhcIj09PWFbOV0mJihmPWYudG9VcHBlckNhc2UoKSk7XCJuXCI9PT1hWzldP2Y9KCtmKS50b0xvY2FsZVN0cmluZygpOmFbN10mJihkPWYudG9TdHJpbmcoKS5zcGxpdChcIi5cIiksZFswXT1kWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csXCIsXCIpLGY9ZC5qb2luKFwiLlwiKSk7cmV0dXJuIGMoYSxmLGUsITApfSxmPWZ1bmN0aW9uKGYsaCxkKXtpZighaClyZXR1cm4gZi5zdHIkKDEwLCEwKTtoPWgubWF0Y2goYSk7aWYoIWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkludmFsaWQgZm9ybWF0IHNwZWNpZmllclwiKTt2YXIgZz1oWzldO2d8fChnPWQ/XCJnXCI6XCJkXCIpO2lmKC0xPT0oZD9cImZGZUVnRyVcIjpcImJjZG94WG5mRmVFZ0clXCIpLmluZGV4T2YoZykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK1xuaFs5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7c3dpdGNoKGcpe2Nhc2UgXCJkXCI6Y2FzZSBcIm5cIjpyZXR1cm4gZShoLGYsMTApO2Nhc2UgXCJ4XCI6Y2FzZSBcIlhcIjpyZXR1cm4gZShoLGYsMTYpO2Nhc2UgXCJvXCI6cmV0dXJuIGUoaCxmLDgpO2Nhc2UgXCJiXCI6cmV0dXJuIGUoaCxmLDIpO2Nhc2UgXCJjXCI6aWYoaFszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gbm90IGFsbG93ZWQgd2l0aCBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXIgJ2MnXCIpO2lmKGhbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtpZihoWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAnYydcIik7XG5yZXR1cm4gYyhoLFN0cmluZy5mcm9tQ29kZVBvaW50KFNrLmJ1aWx0aW4uYXNudW0kKGYpKSxcIlwiLCEwKTtjYXNlIFwiZlwiOmNhc2UgXCJGXCI6Y2FzZSBcImVcIjpjYXNlIFwiRVwiOmNhc2UgXCJnXCI6Y2FzZSBcIkdcIjp7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIGZsb2F0IGZvcm1hdCBzcGVjaWZpZXJcIik7ZD1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGQmJihkPU51bWJlcihkKSk7aWYoSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIi1cIiwhMCk7aWYoaXNOYU4oZCkpcmV0dXJuIGMoaCxcIm5hblwiLFwiXCIsITApO2Y9ITE7MD5kJiYoZD0tZCxmPSEwKTt2YXIgbD1bXCJ0b0V4cG9uZW50aWFsXCIsXCJ0b0ZpeGVkXCIsXCJ0b1ByZWNpc2lvblwiXVtcImVmZ1wiLmluZGV4T2YoZy50b0xvd2VyQ2FzZSgpKV07bGV0IGE9aFs4XT9cbnBhcnNlSW50KGhbOF0sMTApOjY7ZD1kW2xdKGEpOy0xIT09XCJFRkdcIi5pbmRleE9mKGcpJiYoZD1kLnRvVXBwZXJDYXNlKCkpO2lmKFwiZ1wiPT09Zy50b0xvd2VyQ2FzZSgpfHwhaFs5XSl7aWYobD1kLm1hdGNoKC9cXC4oXFxkKlsxLTldKT8oMCspJC8pKXtsZXQgWyxhLGJdPWw7ZD1kLnNsaWNlKDAsYT8tYi5sZW5ndGg6LShiLmxlbmd0aCsxKSl9LTEhPWQuaW5kZXhPZihcIi5cIil8fGhbOV18fChkKz1cIi4wXCIpfVwiZVwiPT09Zy50b0xvd2VyQ2FzZSgpJiYoZD1kLnJlcGxhY2UoL14oWy0rXT9bMC05XSpcXC4/WzAtOV0rW2VFXVstK10/KShbMC05XSk/JC8sXCIkMTAkMlwiKSk7aFs3XSYmKGc9ZC50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxnWzBdPWdbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZD1nLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhoLGQsYihoLGYpLCEwKX1jYXNlIFwiJVwiOmlmKGhbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCB3aXRoIGZvcm1hdCBzcGVjaWZpZXIgJyUnXCIpO1xuZj1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPU51bWJlcihmKSk7aWYoSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCJcIiwhMCk7aWYoLUluZmluaXR5PT09ZilyZXR1cm4gYyhoLFwiaW5mJVwiLFwiLVwiLCEwKTtpZihpc05hTihmKSlyZXR1cm4gYyhoLFwibmFuJVwiLFwiXCIsITApO2c9ITE7MD5mJiYoZj0tZixnPSEwKTtkPWhbOF0/cGFyc2VJbnQoaFs4XSwxMCk6NjtmPSgxMDAqZikudG9GaXhlZChkKStcIiVcIjtyZXR1cm4gYyhoLGYsYihoLGcpLCEwKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitoWzldK1wiJ1wiKTt9fTtTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXz1hPT5mdW5jdGlvbihiKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmKHRoaXMsYi4kanNzdHIoKSxhKSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0PWZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtjb25zdCBjPXt9O2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9MiljW2JbYV1dPWJbYSsxXTtmb3IobGV0IGIgaW4gYSljW2JdPWFbYl07bGV0IGU9MDthPXRoaXMudi5yZXBsYWNlKC97KCgoPzpcXGQrKXwoPzpcXHcrKSk/KCg/OlxcLihcXHcrKSl8KD86XFxbKCg/OlxcZCspfCg/OlxcdyspKVxcXSk/KSk/KD86IShbcnNdKSk/KD86OihbXn1dKikpP30vZyxmdW5jdGlvbihhLGIsZCxmLGcsaCxsLEIsRCxtKXtsZXQgaztpZih2b2lkIDAhPT1oJiZcIlwiIT09aClhPWNbZF0saz1hLmNvbnN0cnVjdG9yPT09QXJyYXk/YVtoXTovXlxcZCskLy50ZXN0KGgpP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5pbnRfKHBhcnNlSW50KGgsMTApKSwhMSk6U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLFxubmV3IFNrLmJ1aWx0aW4uc3RyKGgpLCExKSxlKys7ZWxzZSBpZih2b2lkIDAhPT1nJiZcIlwiIT09ZylrPVNrLmFic3RyLmdhdHRyKGNbZHx8ZSsrXSxuZXcgU2suYnVpbHRpbi5zdHIoZykpO2Vsc2UgaWYodm9pZCAwIT09ZCYmXCJcIiE9PWQpaz1jW2RdO2Vsc2UgaWYodm9pZCAwPT09Ynx8XCJcIj09PWIpaz1jW2VdLGUrKztlbHNlIGlmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHwvXlxcZCskLy50ZXN0KGIpKWs9Y1tiXSxlKys7aWYoXCJzXCI9PT1sKWs9bmV3IFNrLmJ1aWx0aW4uc3RyKGspO2Vsc2UgaWYoXCJyXCI9PT1sKWs9U2suYnVpbHRpbi5yZXByKGspO2Vsc2UgaWYoXCJcIiE9PWwmJnZvaWQgMCE9PWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXCIrbCk7cmV0dXJuIFNrLmFic3RyLm9iamVjdEZvcm1hdChrLFxubmV3IFNrLmJ1aWx0aW4uc3RyKEIpKS4kanNzdHIoKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nPWZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7Yj1iLiRqc3N0cigpLm1hdGNoKGEpO2lmKGJbOV0mJlwic1wiIT09Yls5XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrYls5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdzdHInXCIpO2lmKGJbM10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlNpZ24gbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7aWYoYls0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7XG5pZihiWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAncydcIik7bGV0IGU9dGhpcy52O2JbOF0mJihlPWUuc3Vic3RyaW5nKDAsYls4XSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyhiLGUsXCJcIiwhMSkpfX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspYj1hLmNoYXJBdChkKSxrLnRlc3QoYik/Yy5wdXNoKGIpOlwiXFxcXDAwMFwiPT09Yj9jLnB1c2goXCJcXFxcMDAwXCIpOmMucHVzaChcIlxcXFxcIitiKTtyZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGMoYSxiLGMpe2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDphLmdldCR0Z3QoYik7aWYobnVsbCE9PWImJiFiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO2E9YS52O3ZhciBkPTA7aWYobnVsbD09PWIpe3ZhciBlPS9bXFxzXFx4YTBdKy9nO1xuZD1hLmxlbmd0aDthPWEucmVwbGFjZSh1LFwiXCIpO2QtPWEubGVuZ3RofWVsc2UgZT1iLnJlcGxhY2UocCxcIlxcXFwkMVwiKSxlPW5ldyBSZWdFeHAoZSxcImdcIik7Y29uc3QgZj1bXTtsZXQgZz0wLGs9MCxoO2ZvcihjPTA+Yz9JbmZpbml0eTpjO251bGwhPShoPWUuZXhlYyhhKSkmJms8YyYmaC5pbmRleCE9PWUubGFzdEluZGV4OylmLnB1c2goZytkKSxmLnB1c2goaC5pbmRleCtkKSxnPWUubGFzdEluZGV4LGsrPTE7aWYobnVsbCE9PWJ8fGEubGVuZ3RoLWcpZi5wdXNoKGcrZCksZi5wdXNoKGEubGVuZ3RoK2QpO3JldHVybiBmfWZ1bmN0aW9uIGIoYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYodm9pZCAwPT09ZHx8U2suYnVpbHRpbi5jaGVja05vbmUoZCkpZD1iO2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKWQ9YShkLnYpLGQ9bmV3IFJlZ0V4cChjKGQpLFwiZ1wiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmlwIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShkLFwiXCIpKX19ZnVuY3Rpb24gZShhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCR0Z3QoYik7Y29uc3QgYz10aGlzLnY7bGV0IGQ7aWYoYSl7aWYoZD1jLmxhc3RJbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGMpXSl9ZWxzZSBpZihkPWMuaW5kZXhPZihiKSwwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYyksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKGMuc3Vic3RyaW5nKDAsZCkpLG5ldyBTay5idWlsdGluLnN0cihiKSxuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoZCtiLmxlbmd0aCkpXSl9fVxuZnVuY3Rpb24gZihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQpe2M9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZih2b2lkIDA9PT1kKWQ9XCIgXCI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHImJjE9PT1kLnNxJGxlbmd0aCgpKWQ9ZC52O2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSBzdHIgb2YgbGVuZ3RoIDFcIik7Y29uc3QgZT10aGlzLnNxJGxlbmd0aCgpO2xldCBmO2lmKGU+PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpO2lmKGIpcmV0dXJuIGY9ZC5yZXBlYXQoTWF0aC5mbG9vcigoYy1lKS8yKSksZj1mK3RoaXMuditmLChjLWUpJTImJihmKz1kKSxuZXcgU2suYnVpbHRpbi5zdHIoZik7Zj1kLnJlcGVhdChjLWUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYT9mK3RoaXMudjp0aGlzLnYrZil9fWZ1bmN0aW9uIGwoYSxcbmIsYyl7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydChhLGIsYykpO2lmKGEuJGhhc0FzdHJhbENvZGVQb2ludHMoKSl7Y29uc3QgZD1hLmNvZGVwb2ludHNbYl07Yj12b2lkIDA9PT1kP2IrYS52Lmxlbmd0aC1hLmNvZGVwb2ludHMubGVuZ3RoOmQ7Yz1hLmNvZGVwb2ludHNbY107Yz12b2lkIDA9PT1jP2Eudi5sZW5ndGg6Y31yZXR1cm57c3RhcnQ6YixlbmQ6Y319ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpOyh7c3RhcnQ6YyxlbmQ6ZH09bCh0aGlzLGMsZCkpO2lmKGQ8YylyZXR1cm4tMTtkLT1iLmxlbmd0aDtiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZCk6dGhpcy52LmluZGV4T2YoYixjKTtiPWI+PWMmJmI8PWQ/YjotMTtpZih0aGlzLmNvZGVwb2ludHMpe2Q9dGhpcy5zcSRsZW5ndGgoKTtjPS0xO2ZvcihsZXQgYT0wO2E8ZDthKyspYj09dGhpcy5jb2RlcG9pbnRzW2FdJiYoYz1hKX1lbHNlIGM9XG5iO3JldHVybiBjfX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciBhIHR1cGxlIG9mIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTsoe3N0YXJ0OmQsZW5kOmV9PWwodGhpcyxkLGUpKTtpZihkPmUpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc2xpY2UoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYyksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSl7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGZvciBcIithK1wiIG11c3Qgb25seSBjb250YWluIHN0ciwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZikpO2lmKGIoZCxmLnYpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYihkLGMudikpfX12YXIgZz0vXlswLTkhI19dLyxuPU9iamVjdC5jcmVhdGUobnVsbCk7U2suYnVpbHRpbi5zdHI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN0clwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIsXCJiYWQgY2FsbCB0byBzdHIgLSB1c2UgJ25ldydcIik7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKWlmKHZvaWQgMD09PWEpYT1cIlwiO2Vsc2UgaWYobnVsbD09PWEpYT1cIk5vbmVcIjtlbHNle2lmKHZvaWQgMCE9PWEudHAkc3RyKXJldHVybiBhLnRwJHN0cigpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPU51bWJlci5pc0Zpbml0ZShhKT9TdHJpbmcoYSk6U3RyaW5nKGEpLnJlcGxhY2UoXCJJbmZpbml0eVwiLFxuXCJpbmZcIikucmVwbGFjZShcIk5hTlwiLFwibmFuXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyB0byBzdHJcIik7fXZhciBiPW5bYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtuW2FdPXRoaXM7Yj12b2lkIDA9PT10W2FdP2E6YStcIl8kcnckXCI7dGhpcy4kbWFuZ2xlZD1iO3RoaXMuJHNhdmVkS2V5SGFzaD1hLnJlcGxhY2UoZyxcIiEkJlwiKTt0aGlzLnY9YX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwic3RyKG9iamVjdD0nJykgLT4gc3RyXFxuc3RyKGJ5dGVzX29yX2J1ZmZlclssIGVuY29kaW5nWywgZXJyb3JzXV0pIC0+IHN0clxcblxcbkNyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIG9iamVjdC4gSWYgZW5jb2Rpbmcgb3JcXG5lcnJvcnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBvYmplY3QgbXVzdCBleHBvc2UgYSBkYXRhIGJ1ZmZlclxcbnRoYXQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci5cXG5PdGhlcndpc2UsIHJldHVybnMgdGhlIHJlc3VsdCBvZiBvYmplY3QuX19zdHJfXygpIChpZiBkZWZpbmVkKVxcbm9yIHJlcHIob2JqZWN0KS5cXG5lbmNvZGluZyBkZWZhdWx0cyB0byBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkuXFxuZXJyb3JzIGRlZmF1bHRzIHRvICdzdHJpY3QnLlwiLFxudHAkbmV3KGEsYil7Yj1ifHxbXTtpZih0aGlzIT09U2suYnVpbHRpbi5zdHIucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO2lmKDE+PWEubGVuZ3RoJiYhYi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhWzBdKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2NvbnN0IFtjLGQsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzdHJcIixbXCJvYmplY3RcIixcImVuY29kaW5nXCIsXCJlcnJvcnNcIl0sYSxiKTtpZih2b2lkIDA9PT1jfHx2b2lkIDA9PT1kJiZ2b2lkIDA9PT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyk7U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwic3RyXCIsZCxlKTtpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlY29kaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShjKStcIiBmb3VuZFwiKTtcbnJldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGQsZSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyIHRha2VzIGF0IG1vc3Qgb25lIGFyZ3VtZW50IChcIisoYS5sZW5ndGgrYi5sZW5ndGgpK1wiIGdpdmVuKVwiKTt9LCRyKCl7bGV0IGE9XCInXCI7LTEhPT10aGlzLnYuaW5kZXhPZihcIidcIikmJi0xPT09dGhpcy52LmluZGV4T2YoJ1wiJykmJihhPSdcIicpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtsZXQgYz1hO2ZvcihsZXQgZj0wO2Y8YjtmKyspe3ZhciBkPXRoaXMudi5jaGFyQXQoZik7dmFyIGU9dGhpcy52LmNoYXJDb2RlQXQoZik7ZD09PWF8fFwiXFxcXFwiPT09ZD9jKz1cIlxcXFxcIitkOlwiXFx0XCI9PT1kP2MrPVwiXFxcXHRcIjpcIlxcblwiPT09ZD9jKz1cIlxcXFxuXCI6XCJcXHJcIj09PWQ/Yys9XCJcXFxcclwiOigyNTU8ZSYmNTUyOTY+ZXx8NTczNDQ8PWUpJiYhU2suX19mdXR1cmVfXy5weXRob24zP2MrPVwiXFxcXHVcIisoXCIwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1lJiZcbiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9dGhpcy52LmNvZGVQb2ludEF0KGYpLGYrKyxkPWQudG9TdHJpbmcoMTYpLGU9XCIwMDAwMDAwXCIrZC50b1N0cmluZygxNiksYz00PGQubGVuZ3RoP2MrKFwiXFxcXFVcIitlLnNsaWNlKC04KSk6YysoXCJcXFxcdVwiK2Uuc2xpY2UoLTQpKSk6MjU1PGUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdWZmZmRcIjpcIiBcIj5kfHwxMjc8PWUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9ZC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSwyPmQubGVuZ3RoJiYoZD1cIjBcIitkKSxjKz1cIlxcXFx4XCIrZCk6Yys9ZH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMrYSl9LHRwJHN0cigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zdHI/dGhpczpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KX0sdHAkaXRlcigpe3JldHVybiBuZXcgQSh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO1xuc3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLnY8YS52O2Nhc2UgXCJMdEVcIjpyZXR1cm4gdGhpcy52PD1hLnY7Y2FzZSBcIkVxXCI6cmV0dXJuIHRoaXMudj09PWEudjtjYXNlIFwiTm90RXFcIjpyZXR1cm4gdGhpcy52IT09YS52O2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLnY+YS52O2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcy52Pj1hLnZ9fSxtcCRzdWJzY3JpcHQoYSl7bGV0IGI7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9dGhpcy5zcSRsZW5ndGgoKTswPmEmJihhKz1iKTtpZigwPmF8fGE+PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMuY29kZXBvaW50cz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pKTpcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuY2hhckF0KGEpKX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7bGV0IGM9XCJcIjtiPXRoaXMuc3EkbGVuZ3RoKCk7dGhpcy5jb2RlcG9pbnRzP2Euc3NzaXRlciQoYixhPT57Yys9dGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pfSk6YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuY2hhckF0KGEpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuJGhhc0FzdHJhbENvZGVQb2ludHMoKT90aGlzLmNvZGVwb2ludHMubGVuZ3RoOnRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0c1wiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudithLnYpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGEqdGhpcy52Lmxlbmd0aD5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2xldCBiPVwiXCI7Zm9yKGxldCBjPTA7YzxhO2MrKyliKz10aGlzLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sc3EkY29udGFpbnMoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7cmV0dXJuLTEhPT10aGlzLnYuaW5kZXhPZihhLnYpfSx0cCRhc19udW1iZXI6ITAsbmIkcmVtYWluZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2NvbnN0IGM9dGhpcy5zayRidWlsdGluQmFzZTthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZXx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5fHwoYT1uZXcgU2suYnVpbHRpbi50dXBsZShbYV0pKTt2YXIgZD0wO3ZhciBlPXRoaXMuJGpzc3RyKCkucmVwbGFjZSgvJShcXChbYS16QS1aMC05XStcXCkpPyhbIzAgK1xcLV0rKT8oXFwqfFswLTldKyk/KFxcLihcXCp8WzAtOV0rKSk/W2hsTF0/KFtkaW91eFhlRWZGZ0djcnNiJV0pL2csZnVuY3Rpb24oZSxmLGcsayxoLGwscCl7dmFyIG4sQixBLHYsTDtrPVNrLmJ1aWx0aW4uYXNudW0kKGspO2g9U2suYnVpbHRpbi5hc251bSQoaCk7dm9pZCAwIT09ZiYmXCJcIiE9PWZ8fFwiJVwiPT1wfHwobj1cbmQrKyk7XCJcIj09PWgmJihoPXZvaWQgMCk7dmFyIHQ9Qj1BPXY9TD0hMTtnJiYoLTEhPT1nLmluZGV4T2YoXCItXCIpP3Y9ITA6LTEhPT1nLmluZGV4T2YoXCIwXCIpJiYoTD0hMCksLTEhPT1nLmluZGV4T2YoXCIrXCIpP0I9ITA6LTEhPT1nLmluZGV4T2YoXCIgXCIpJiYoQT0hMCksdD0tMSE9PWcuaW5kZXhPZihcIiNcIikpO2gmJihoPXBhcnNlSW50KGguc3Vic3RyKDEpLDEwKSk7Zz1mdW5jdGlvbihhLGIpe3ZhciBjO2I9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXswPmEmJihhPS1hLGQ9ITApO3ZhciBlPWEudG9TdHJpbmcoYil9ZWxzZSBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/KGU9YS5zdHIkKGIsITEpLDI8ZS5sZW5ndGgmJlwiLjBcIj09PWUuc3Vic3RyKC0yKSYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC0yKSksZD1hLm5iJGlzbmVnYXRpdmUoKSk6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xz8oZT1hLnN0ciQoYiwhMSksZD1cbmEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcmJihlPWEuc3RyJChiLCExKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1lLFwidW5oYW5kbGVkIG51bWJlciBmb3JtYXRcIik7YT0hMTtpZihoKWZvcihjPWUubGVuZ3RoO2M8aDsrK2MpZT1cIjBcIitlLGE9ITA7Yz1cIlwiO2Q/Yz1cIi1cIjpCP2M9XCIrXCIrYzpBJiYoYz1cIiBcIitjKTt0JiYoMTY9PT1iP2MrPVwiMHhcIjo4IT09Ynx8YXx8XCIwXCI9PT1lfHwoYys9XCIwXCIpKTtyZXR1cm5bYyxlXX07ZT1mdW5jdGlvbihhKXt2YXIgYj1hWzBdO2E9YVsxXTtpZihrKXtrPXBhcnNlSW50KGssMTApO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoO2lmKEwpZm9yKDtjPGs7KytjKWE9XCIwXCIrYTtlbHNlIGlmKHYpe2Zvcig7YzxrOysrYylhKz1cIiBcIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJihhKz1iLGI9XCJcIil9ZWxzZSBmb3IoO2M8azsrK2MpYj1cIiBcIitifXJldHVybiBiK2F9O2lmKGEuY29uc3RydWN0b3I9PT1cblNrLmJ1aWx0aW4udHVwbGUpZj1hLnZbbl07ZWxzZSBpZih2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09ZilmPWYuc3Vic3RyaW5nKDEsZi5sZW5ndGgtMSksZj1hLm1wJHN1YnNjcmlwdChuZXcgYyhmKSk7ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5kaWN0fHxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KWY9YTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEudHAkbmFtZStcIiBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdtcCRzdWJzY3JpcHQnXCIpO2lmKFwiZFwiPT09cHx8XCJpXCI9PT1wKXt2YXIgdT1nKGYsMTApO2lmKHZvaWQgMD09PXVbMV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJVwiK3ArXCIgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpKTtwPXVbMV07dVsxXT0tMSE9PXAuaW5kZXhPZihcIi5cIik/cGFyc2VJbnQocCwxMCkudG9TdHJpbmcoKTpcbnA7cmV0dXJuIGUodSl9aWYoXCJvXCI9PT1wKXJldHVybiBlKGcoZiw4KSk7aWYoXCJ4XCI9PT1wKXJldHVybiBlKGcoZiwxNikpO2lmKFwiWFwiPT09cClyZXR1cm4gZShnKGYsMTYpKS50b1VwcGVyQ2FzZSgpO2lmKFwiZlwiPT09cHx8XCJGXCI9PT1wfHxcImVcIj09PXB8fFwiRVwiPT09cHx8XCJnXCI9PT1wfHxcIkdcIj09PXApe3U9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiB1JiYodT1OdW1iZXIodSkpO2lmKEluZmluaXR5PT09dSlyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09PXUpcmV0dXJuXCItaW5mXCI7aWYoaXNOYU4odSkpcmV0dXJuXCJuYW5cIjtuPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihwLnRvTG93ZXJDYXNlKCkpXTtpZih2b2lkIDA9PT1ofHxcIlwiPT09aClpZihcImVcIj09PXB8fFwiRVwiPT09cCloPTY7ZWxzZSBpZihcImZcIj09PXB8fFwiRlwiPT09cCloPVNrLl9fZnV0dXJlX18ucHl0aG9uMz82Ojc7bj11W25dKGgpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdChmKSYmXG4wPT09dSYmLUluZmluaXR5PT09MS91JiYobj1cIi1cIituKTtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJig3PD1uLmxlbmd0aCYmXCIwLjAwMDBcIj09bi5zbGljZSgwLDYpJiYoYj1wYXJzZUZsb2F0KG4pLG49Yi50b0V4cG9uZW50aWFsKCkpLFwiLVwiPT1uLmNoYXJBdChuLmxlbmd0aC0yKSYmKG49bi5zbGljZSgwLG4ubGVuZ3RoLTEpK1wiMFwiK24uY2hhckF0KG4ubGVuZ3RoLTEpKSk7LTEhPT1cIkVGR1wiLmluZGV4T2YocCkmJihuPW4udG9VcHBlckNhc2UoKSk7cmV0dXJuIGUoW1wiXCIsbl0pfWlmKFwiY1wiPT09cCl7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnN0ciQoMTAsXG4hMSlbMF0pO2lmKGYuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cilyZXR1cm4gZi52LnN1YnN0cigwLDEpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7fWlmKFwiclwiPT09cClyZXR1cm4gcD1Tay5idWlsdGluLnJlcHIoZiksaD9wLnYuc3Vic3RyKDAsaCk6cC52O2lmKFwic1wiPT09cCYmYz09PVNrLmJ1aWx0aW4uc3RyKXtwPW5ldyBTay5idWlsdGluLnN0cihmKTtwPXAuJGpzc3RyKCk7aWYoaClyZXR1cm4gcC5zdWJzdHIoMCxoKTtrJiYocD1lKFtcIiBcIixwXSkpO3JldHVybiBwfWlmKFwiYlwiPT09cHx8XCJzXCI9PT1wKXtpZihjPT09U2suYnVpbHRpbi5zdHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJ2InXCIpO2lmKCEoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpJiZ2b2lkIDA9PT0odT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJWIgcmVxdWlyZXMgYSBieXRlcy1saWtlIG9iamVjdCwgb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBfX2J5dGVzX18sIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7dm9pZCAwIT09dSYmKGY9bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZikpO3A9Zi4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCIlXCI9PT1wKXJldHVyblwiJVwifSk7cmV0dXJuIG5ldyBjKGUpfX0scHJvdG86e3RvU3RyaW5nKCl7cmV0dXJuIHRoaXMudn0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS50cCRuZXcoYSxiKTtjLiRtYW5nbGVkPWEuJG1hbmdsZWQ7Yy4kc2F2ZWRLZXlIYXNoPWEuJHNhdmVkS2V5SGFzaDtjLnY9YS52O3JldHVybiBjfSwkanNzdHIoKXtyZXR1cm4gdGhpcy52fSwkaGFzQXN0cmFsQ29kZVBvaW50cygpe2lmKG51bGw9PT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpcy5jb2RlcG9pbnRzKXJldHVybiEwO2Zvcih2YXIgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspe2xldCBiPVxudGhpcy52LmNoYXJDb2RlQXQoYSk7aWYoNTUyOTY8PWImJjU3MzQ0PmIpe3RoaXMuY29kZXBvaW50cz1bXTtmb3IoYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspdGhpcy5jb2RlcG9pbnRzLnB1c2goYSksYj10aGlzLnYuY2hhckNvZGVBdChhKSw1NTI5Njw9YiYmNTYzMjA+YiYmYSsrO3JldHVybiEwfX10aGlzLmNvZGVwb2ludHM9bnVsbDtyZXR1cm4hMX0sc2skYXNhcnJheSgpe2NvbnN0IGE9W107aWYodGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXt2YXIgYj10aGlzLmNvZGVwb2ludHM7Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGJbY10sYltjKzFdKSkpfWVsc2UgZm9yKGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWEucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52W2JdKSk7cmV0dXJuIGF9LGZpbmQkbGVmdDpoKCExKSxmaW5kJHJpZ2h0OmgoITApLGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cilyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgc3RyIGluc3RhbmNlIGlzIHJlcXVpcmVkIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO319LG1ldGhvZHM6e2VuY29kZTp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe2VuY29kaW5nOmEsZXJyb3JzOmJ9PVNrLmJ1aWx0aW4uYnl0ZXMuY2hlY2skZW5jb2RlQXJncyhcImVuY29kZVwiLGEsYikpO2E9U2suYnVpbHRpbi5ieXRlcy5zdHIkZW5jb2RlKHRoaXMsYSxiKTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zP2E6bmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGpzc3RyKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJFbmNvZGUgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2RpbmcgaW4gd2hpY2ggdG8gZW5jb2RlIHRoZSBzdHJpbmcuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIGVuY29kaW5nIGVycm9ycy5cXG4gICAgVGhlIGRlZmF1bHQgaXMgJ3N0cmljdCcgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXFxuICAgIFVuaWNvZGVFbmNvZGVFcnJvci4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScsICdyZXBsYWNlJyBhbmRcXG4gICAgJ3htbGNoYXJyZWZyZXBsYWNlJyBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aFxcbiAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdCBjYW4gaGFuZGxlIFVuaWNvZGVFbmNvZGVFcnJvcnMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO2M9dGhpcy5nZXQkdGd0KGMpO2Q9dm9pZCAwPT09ZD8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9bmV3IFJlZ0V4cChhKGIpLFwiZ1wiKTtpZigwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShiLGMpKTtsZXQgZT0wO2I9dGhpcy52LnJlcGxhY2UoYixhPT5lKys8ZD9jOmEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5zcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSxiKTtiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2NdLGFbKytjXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSwtMSk7dmFyIGQ9MD5iPzA6MiooYS5sZW5ndGgvMi1iKTtiPVtdO2ZvcigwPj1kP2Q9MDpiLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zbGljZSgwLGFbZC0xXSkpKTtkPGEubGVuZ3RoO2QrKyliLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYVtkXSxhWysrZF0pKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyIHN0cmluZy5cXG5cXG4gIHNlcFxcbiAgICBUaGUgZGVsaW1pdGVyIGFjY29yZGluZyB3aGljaCB0byBzcGxpdCB0aGUgc3RyaW5nLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgYWNjb3JkaW5nIHRvIGFueSB3aGl0ZXNwYWNlLFxcbiAgICBhbmQgZGlzY2FyZCBlbXB0eSBzdHJpbmdzIGZyb20gdGhlIHJlc3VsdC5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHMgYXJlIGRvbmUgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5qb2luOnskbWV0aChhKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2IubGVuZ3RoK1wiOiBleHBlY3RlZCBzdHIsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2IucHVzaChhLnYpfSksKCk9Pm5ldyBTay5idWlsdGluLnN0cihiLmpvaW4odGhpcy52KSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJDb25jYXRlbmF0ZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MuXFxuXFxuVGhlIHN0cmluZyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBnaXZlbiBzdHJpbmcuXFxuVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIG5ldyBzdHJpbmcuXFxuXFxuRXhhbXBsZTogJy4nLmpvaW4oWydhYicsICdwcScsICdycyddKSAtPiAnYWIucHEucnMnXCJ9LFxuY2FwaXRhbGl6ZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCBtYWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaGF2ZSB1cHBlciBjYXNlIGFuZCB0aGUgcmVzdCBsb3dlclxcbmNhc2UuXCJ9LHRpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52LnJlcGxhY2UoL1thLXpdW2Etel0qL2dpLGE9PmFbMF0udG9VcHBlckNhc2UoKSthLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoIHdvcmQgaXMgdGl0bGVjYXNlZC5cXG5cXG5Nb3JlIHNwZWNpZmljYWxseSwgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VkIGNoYXJhY3RlcnMgYW5kIGFsbCByZW1haW5pbmdcXG5jYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXIgY2FzZS5cIn0sXG5jZW50ZXI6eyRtZXRoOmYoITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNlbnRlcmVkIHN0cmluZyBvZiBsZW5ndGggd2lkdGguXFxuXFxuUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1sKHRoaXMsYixjKSk7aWYoYzxiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKDApO2E9YS5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZyxcIlxcXFwkJlwiKTthPW5ldyBSZWdFeHAoYSxcImdcIik7cmV0dXJuKGI9dGhpcy52LnNsaWNlKGIsYykubWF0Y2goYSkpP25ldyBTay5idWlsdGluLmludF8oYi5sZW5ndGgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXFxuc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxcbmludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxleHBhbmR0YWJzOnskbWV0aDpmdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrSW50KGEpKWE9U2suYnVpbHRpbi5hc251bSQoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBnb3QgdHlwZVwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtjb25zdCBiPUFycmF5KGErMSkuam9pbihcIiBcIiksYz10aGlzLnYucmVwbGFjZSgvKFteXFxyXFxuXFx0XSopXFx0L2csKGMsZCk9PmQrYi5zbGljZShkLmxlbmd0aCVhKSk7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHRhYnNpemU9OClcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cXG5cXG5JZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC5cIn0sZmluZDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRsZWZ0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LFxucGFydGl0aW9uOnskbWV0aDplKCExKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZy4gIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBzdHJpbmdcXG5hbmQgdHdvIGVtcHR5IHN0cmluZ3MuXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsIFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxsanVzdDp7JG1ldGg6ZighMSwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cIn0sbHN0cmlwOnskbWV0aDpiKC9eXFxzKy9nLGE9PlwiXltcIithK1wiXStcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxyZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0scmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkcmlnaHQoYSxiLGMpO2lmKC0xPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic3Vic3RyaW5nIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxcbnJqdXN0OnskbWV0aDpmKCEwLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0scnN0cmlwOnskbWV0aDpiKC9cXHMrJC9nLGE9PlwiW1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0scnBhcnRpdGlvbjp7JG1ldGg6ZSghMCksJGZsYWdzOntPbmVBcmc6ITB9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3NcXG5hbmQgdGhlIG9yaWdpbmFsIHN0cmluZy5cIn0sc3BsaXRsaW5lczp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5pc1RydWUoYSk7Y29uc3QgYj10aGlzLnYsYz1bXSxkPWIubGVuZ3RoO3ZhciBlPVxuMDtmb3IobGV0IGc9MDtnPGQ7ZysrKXt2YXIgZj1iLmNoYXJBdChnKTtpZihcIlxcblwiPT09Yi5jaGFyQXQoZysxKSYmXCJcXHJcIj09PWYpZj1nKzIsZT1iLnNsaWNlKGUsZiksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSksZT1mO2Vsc2UgaWYoXCJcXG5cIj09PWYmJlwiXFxyXCIhPT1iLmNoYXJBdChnLTEpfHxcIlxcclwiPT09ZilmPWcrMSxlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWZ9ZTxkJiYoZT1iLnNsaWNlKGUsZCksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdHJpcDp7JG1ldGg6YigvXlxccyt8XFxzKyQvZyxhPT5cIl5bXCIrYStcIl0rfFtcIithK1wiXSskXCIpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGNoYXJzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0sc3dhcGNhc2U6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel0vZ2ksYT0+e2NvbnN0IGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09YT9hLnRvVXBwZXJDYXNlKCk6Yn0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiQ29udmVydCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZS5cIn0sXG51cHBlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1VwcGVyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0sc3RhcnRzd2l0aDp7JG1ldGg6ZChcInN0YXJ0c3dpdGhcIiwoYSxiKT0+MD09PWEuaW5kZXhPZihiKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0sXG5lbmRzd2l0aDp7JG1ldGg6ZChcImVuZHN3aXRoXCIsKGEsYik9Pi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuXCJ9LGlzYXNjaWk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15bXFx4MDAtXFx4N0ZdKiQvLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIixcbiRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBBU0NJSSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri5cXG5FbXB0eSBzdHJpbmcgaXMgQVNDSUkgdG9vLlwifSxpc2xvd2VyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJi9bYS16XS8udGVzdCh0aGlzLnYpJiYhL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBsb3dlcmNhc2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbG93ZXJjYXNlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1thLXpdLy50ZXN0KHRoaXMudikmJi9bQS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIHVwcGVyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyB1cHBlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtsZXQgYj0hMSxjPSExLGQ7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoZD1hLmNoYXJBdChlKSwhL1thLXpdLy50ZXN0KGQpJiYvW0EtWl0vLnRlc3QoZCkpe2lmKGMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7XG5iPWM9ITB9ZWxzZSBpZigvW2Etel0vLnRlc3QoZCkmJiEvW0EtWl0vLnRlc3QoZCkpe2lmKCFjKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2I9ITB9ZWxzZSBjPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZS1jYXNlZCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5JbiBhIHRpdGxlLWNhc2VkIHN0cmluZywgdXBwZXItIGFuZCB0aXRsZS1jYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcXG5mb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXCJ9LGlzc3BhY2U6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXHMrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHdoaXRlc3BhY2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgd2hpdGVzcGFjZSBhbmQgdGhlcmVcXG5pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LGlzZGlnaXQ6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXGQrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgZGlnaXQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc251bWVyaWM6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG51bWVyaWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbnVtZXJpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGFuZCB0aGVyZSBpcyBhdFxcbmxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNhbHBoYTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teYS16QS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIGFscGhhYmV0aWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYWxwaGFiZXRpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc2FsbnVtOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVowLTldLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGEtbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYS1udW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhLW51bWVyaWMgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSx6ZmlsbDp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2xldCBiPVwiXCI7YS09dGhpcy52Lmxlbmd0aDtjb25zdCBjPVwiK1wiPT09dGhpcy52WzBdfHxcIi1cIj09PXRoaXMudlswXT8xOjA7XG5mb3IobGV0IGM9MDtjPGE7YysrKWIrPVwiMFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cigwLGMpK2IrdGhpcy52LnN1YnN0cihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIC8pXCIsJGRvYzpcIlBhZCBhIG51bWVyaWMgc3RyaW5nIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gd2lkdGguXFxuXFxuVGhlIHN0cmluZyBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9LGZvcm1hdDp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKSAtPiBzdHJcXG5cXG5SZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBTLCB1c2luZyBzdWJzdGl0dXRpb25zIGZyb20gYXJncyBhbmQga3dhcmdzLlxcblRoZSBzdWJzdGl0dXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGJyYWNlcyAoJ3snIGFuZCAnfScpLlwifSxcbl9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpcIlJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgZGVzY3JpYmVkIGJ5IGZvcm1hdF9zcGVjLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOm51bGx9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uc3RyXCIsU2suYnVpbHRpbi5zdHIpO3ZhciBrPS9eW0EtWmEtejAtOV0rJC8scD0vKFsuKis/PXxcXFxcXFwvKClcXFtcXF1cXHtcXH1eJF0pL2csdT0vXltcXHNcXHhhMF0rLztTay5idWlsdGluLnN0ci4kcHkyZGVjb2RlPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKFNrLmJ1aWx0aW4uc3RyLHskbmFtZTpcImRlY29kZVwiLFxuJG1ldGgoYSxiKXtjb25zdCBjPW5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7cmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsYSxiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX19KTt2YXIgQT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzdHJfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDthLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCk/KHRoaXMuJHNlcT1hLmNvZGVwb2ludHMsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGI9dGhpcy4kc2VxW3RoaXMuJGluZGV4XTtpZih2b2lkIDAhPT1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS52LnN1YnN0cmluZyhiLHRoaXMuJHNlcVsrK3RoaXMuJGluZGV4XSkpfSk6KHRoaXMuJHNlcT1hLnYsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4KytdO2lmKHZvaWQgMCE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0pfSxcbml0ZXJuZXh0KCl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksdD17YWJzdHJhY3Q6ITAsYXM6ITAsYm9vbGVhbjohMCxicmVhazohMCxieXRlOiEwLGNhc2U6ITAsY2F0Y2g6ITAsY2hhcjohMCxjbGFzczohMCxjb250aW51ZTohMCxjb25zdDohMCxkZWJ1Z2dlcjohMCxkZWZhdWx0OiEwLGRlbGV0ZTohMCxkbzohMCxkb3VibGU6ITAsZWxzZTohMCxlbnVtOiEwLGV4cG9ydDohMCxleHRlbmRzOiEwLGZhbHNlOiEwLGZpbmFsOiEwLGZpbmFsbHk6ITAsZmxvYXQ6ITAsZm9yOiEwLGZ1bmN0aW9uOiEwLGdvdG86ITAsaWY6ITAsaW1wbGVtZW50czohMCxpbXBvcnQ6ITAsaW46ITAsaW5zdGFuY2VvZjohMCxpbnQ6ITAsaW50ZXJmYWNlOiEwLGlzOiEwLGxvbmc6ITAsbmFtZXNwYWNlOiEwLFxubmF0aXZlOiEwLG5ldzohMCxudWxsOiEwLHBhY2thZ2U6ITAscHJpdmF0ZTohMCxwcm90ZWN0ZWQ6ITAscHVibGljOiEwLHJldHVybjohMCxzaG9ydDohMCxzdGF0aWM6ITAsc3VwZXI6ITAsc3dpdGNoOiEwLHN5bmNocm9uaXplZDohMCx0aGlzOiEwLHRocm93OiEwLHRocm93czohMCx0cmFuc2llbnQ6ITAsdHJ1ZTohMCx0cnk6ITAsdHlwZW9mOiEwLHVzZTohMCx2YXI6ITAsdm9pZDohMCx2b2xhdGlsZTohMCx3aGlsZTohMCx3aXRoOiEwLGNvbnN0cnVjdG9yOiEwLF9fZGVmaW5lR2V0dGVyX186ITAsX19kZWZpbmVTZXR0ZXJfXzohMCxhcHBseTohMCxhcmd1bWVudHM6ITAsY2FsbDohMCxjYWxsZXI6ITAsZXZhbDohMCxoYXNPd25Qcm9wZXJ0eTohMCxpc1Byb3RvdHlwZU9mOiEwLF9fbG9va3VwR2V0dGVyX186ITAsX19sb29rdXBTZXR0ZXJfXzohMCxfX25vU3VjaE1ldGhvZF9fOiEwLHByb3BlcnR5SXNFbnVtZXJhYmxlOiEwLHByb3RvdHlwZTohMCx0b1NvdXJjZTohMCx0b0xvY2FsZVN0cmluZzohMCxcbnRvU3RyaW5nOiEwLHVud2F0Y2g6ITAsdmFsdWVPZjohMCx3YXRjaDohMCxsZW5ndGg6ITAsbmFtZTohMH07U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc189dH0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZ1bmM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZ1bmN0aW9uXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMsXCJidWlsdGluIGZ1bmMgc2hvdWxkIGJlIGNhbGxlZCBhcyBhIGNsYXNzIHdpdGggYG5ld2BcIik7dGhpcy5mdW5jX2NvZGU9YTt0aGlzLmZ1bmNfZ2xvYmFscz1jfHxudWxsO3RoaXMuJG5hbWU9YS5jb19uYW1lJiZhLmNvX25hbWUudnx8YS5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy4kZD1Tay5idWlsdGluLmRpY3Q/bmV3IFNrLmJ1aWx0aW4uZGljdDp2b2lkIDA7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRtb2R1bGU9U2suZ2xvYmFscyYmU2suZ2xvYmFscy5fX25hbWVfX3x8XG5Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kcXVhbG5hbWU9YS5jb19xdWFsbmFtZSYmYS5jb19xdWFsbmFtZS52fHx0aGlzLiRuYW1lO2lmKHZvaWQgMCE9PWUpZm9yKGxldCBhIGluIGUpYlthXT1lW2FdO3RoaXMuZnVuY19jbG9zdXJlPWI7dGhpcy4kbWVtb2lzZUZsYWdzKCk7dGhpcy5tZW1vaXNlZD1hLmNvX2Zhc3RjYWxsfHxudWxsO3RoaXMudHAkY2FsbD1hLmNvX2Zhc3RjYWxsP2EuYmluZCh0aGlzKTpTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuYmluZCh0aGlzKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRlc2NyX2dldChhLGMpe3JldHVybiBudWxsPT09YT90aGlzOm5ldyBTay5idWlsdGluLm1ldGhvZCh0aGlzLGEpfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8ZnVuY3Rpb24gXCIrdGhpcy4kcXVhbG5hbWUrXCI+XCIpfSx0cCRjYWxsKGEsYyl7dGhpcy5tZW1vaXNlZHx8KHRoaXMuJG1lbW9pc2VGbGFncygpLFxudGhpcy5tZW1vaXNlZD0hMCk7aWYodm9pZCAwPT09dGhpcy5jb19hcmdjb3VudCYmdm9pZCAwPT09dGhpcy5jb192YXJuYW1lcyYmIXRoaXMuY29fa3dhcmdzJiYhdGhpcy5mdW5jX2Nsb3N1cmUpe2lmKGMmJjAhPT1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO3JldHVybiB0aGlzLmZ1bmNfY29kZS5hcHBseSh0aGlzLmZ1bmNfZ2xvYmFscyxhKX1hPXRoaXMuJHJlc29sdmVBcmdzKGEsYyk7dGhpcy5mdW5jX2Nsb3N1cmUmJmEucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfX0sZ2V0c2V0czp7X19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTtcbnRoaXMuJG5hbWU9YS4kanNzdHIoKX19LF9fcXVhbG5hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kcXVhbG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3RcIik7dGhpcy4kcXVhbG5hbWU9YS4kanNzdHIoKX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdCxfX2RlZmF1bHRzX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy4kZGVmYXVsdHMpfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKX19fSxwcm90bzp7JG1lbW9pc2VGbGFncygpe3RoaXMuY29fdmFybmFtZXM9dGhpcy5mdW5jX2NvZGUuY29fdmFybmFtZXM7dGhpcy5jb19hcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19hcmdjb3VudDt2b2lkIDA9PT1cbnRoaXMuY29fYXJnY291bnQmJnRoaXMuY29fdmFybmFtZXMmJih0aGlzLmNvX2FyZ2NvdW50PXRoaXMuY29fYXJnY291bnQ9dGhpcy5jb192YXJuYW1lcy5sZW5ndGgpO3RoaXMuY29fa3dvbmx5YXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fa3dvbmx5YXJnY291bnR8fDA7dGhpcy5jb192YXJhcmdzPXRoaXMuZnVuY19jb2RlLmNvX3ZhcmFyZ3M7dGhpcy5jb19rd2FyZ3M9dGhpcy5mdW5jX2NvZGUuY29fa3dhcmdzO3RoaXMuJGRlZmF1bHRzPXRoaXMuZnVuY19jb2RlLiRkZWZhdWx0c3x8W107dGhpcy4ka3dkZWZzPXRoaXMuZnVuY19jb2RlLiRrd2RlZnN8fFtdfSwkcmVzb2x2ZUFyZ3M6ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLmNvX2FyZ2NvdW50O3ZvaWQgMD09PWImJihiPXRoaXMuY29fdmFybmFtZXM/dGhpcy5jb192YXJuYW1lcy5sZW5ndGg6YS5sZW5ndGgpO3ZhciBlPXRoaXMuY29fdmFybmFtZXN8fFtdLGY9dGhpcy5jb19rd29ubHlhcmdjb3VudHx8MDtsZXQgbD1iK1xuZjtpZighKDAhPT1mfHx0aGlzLmNvX2t3YXJnc3x8YyYmMCE9PWMubGVuZ3RofHx0aGlzLmNvX3ZhcmFyZ3MpKXtpZihhLmxlbmd0aD09YilyZXR1cm4gYTtpZigwPT09YS5sZW5ndGgmJnRoaXMuJGRlZmF1bHRzJiZ0aGlzLiRkZWZhdWx0cy5sZW5ndGg9PT1iKXtmb3IoZT0wO2UhPXRoaXMuJGRlZmF1bHRzLmxlbmd0aDtlKyspYVtlXT10aGlzLiRkZWZhdWx0c1tlXTtyZXR1cm4gYX19bGV0IGg7dGhpcy5jb19rd2FyZ3MmJihoPVtdKTt2YXIgZD1hLmxlbmd0aDtsZXQgZz1hLmxlbmd0aDw9Yj9hOmEuc2xpY2UoMCxiKTtpZih0aGlzLmNvX3ZhcmFyZ3MpYT1hLmxlbmd0aD5nLmxlbmd0aD9hLnNsaWNlKGcubGVuZ3RoKTpbXSxnW2xdPW5ldyBTay5idWlsdGluLnR1cGxlKGEpO2Vsc2UgaWYoZD5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgXCIrYitcIiBwb3NpdGlvbmFsIGFyZ3VtZW50XCIrKDE9PWI/XCJcIjpcInNcIikrXCIgYnV0IFwiK2QrKDE9PVxuZD9cIiB3YXMgXCI6XCIgd2VyZSBcIikrXCIgZ2l2ZW5cIik7aWYoYyl7aWYodGhpcy5mdW5jX2NvZGUubm9fa3cpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9Mil7ZD1jW2FdO3ZhciBuPWNbYSsxXSxrPWUuaW5kZXhPZihkKTtpZigwPD1rKXtpZih2b2lkIDAhPT1nW2tdKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3IgYXJndW1lbnQgJ1wiK2QrXCInXCIpO2dba109bn1lbHNlIGlmKGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihkKSxuKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnXCIrZCtcIidcIik7fX1jPXRoaXMuJGRlZmF1bHRzfHxbXTthPTA7ZD1bXTtuPSExO2ZvcihrPWItYy5sZW5ndGg7YTxcbms7YSsrKXZvaWQgMD09PWdbYV0mJihkLnB1c2goZVthXSksdm9pZCAwPT09ZVthXSYmKG49ITApKTtpZigwIT1kLmxlbmd0aCYmKHRoaXMuY29fYXJnY291bnR8fHRoaXMuY29fdmFybmFtZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitkLmxlbmd0aCtcIiByZXF1aXJlZCBhcmd1bWVudFwiKygxPT1kLmxlbmd0aD9cIlwiOlwic1wiKSsobj9cIlwiOlwiOiBcIitkLmpvaW4oXCIsIFwiKSkpO2Zvcig7YTxiO2ErKyl2b2lkIDA9PT1nW2FdJiYoZ1thXT1jW2Eta10pO2lmKDA8Zil7Zj1bXTtjPXRoaXMuJGt3ZGVmcztmb3IoYT1iO2E8bDthKyspdm9pZCAwPT09Z1thXSYmKHZvaWQgMCE9PWNbYS1iXT9nW2FdPWNbYS1iXTpmLnB1c2goZVthXSkpO2lmKDAhPT1mLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIG1pc3NpbmcgXCIrZi5sZW5ndGgrXCIgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudFwiKygxPT1cbmYubGVuZ3RoP1wiXCI6XCJzXCIpK1wiOiBcIitmLmpvaW4oXCIsIFwiKSk7fWlmKHRoaXMuZnVuY19jbG9zdXJlJiZlKWZvcihiPWcubGVuZ3RoO2I8ZS5sZW5ndGg7YisrKWcucHVzaCh2b2lkIDApO2gmJmcudW5zaGlmdChoKTtyZXR1cm4gZ319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5hc251bSQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHxcIm51bWJlclwiPT09dHlwZW9mIGE/YTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnYudG9TdHJpbmcoKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/YS52OmE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bnVsbDphfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJFwiLFNrLmJ1aWx0aW4uYXNudW0kKTtTay5idWlsdGluLmFzc2skPWZ1bmN0aW9uKGEpe3JldHVybiAwPT09YSUxP25ldyBTay5idWlsdGluLmludF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNzayRcIixTay5idWlsdGluLmFzc2skKTtTay5idWlsdGluLmFzbnVtJG5vZmxvYXQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpcmV0dXJuIGE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9YS50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylhPWEudi50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXJldHVybiBudWxsO3JldHVybn1pZigwPmEuaW5kZXhPZihcIi5cIikmJjA+YS5pbmRleE9mKFwiZVwiKSYmMD5hLmluZGV4T2YoXCJFXCIpKXJldHVybiBhO3ZhciBiPTA7aWYoMDw9YS5pbmRleE9mKFwiZVwiKSl7dmFyIGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKTtiPWEuc3Vic3RyKGEuaW5kZXhPZihcImVcIikrMSl9ZWxzZSAwPD1hLmluZGV4T2YoXCJFXCIpP1xuKGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKSxiPWEuc3Vic3RyKGEuaW5kZXhPZihcIkVcIikrMSkpOmM9YTtiPXBhcnNlSW50KGIsMTApO2E9Yy5pbmRleE9mKFwiLlwiKTtpZigwPmEpe2lmKDA8PWIpe2Zvcig7MDxiLS07KWMrPVwiMFwiO3JldHVybiBjfXJldHVybiBjLmxlbmd0aD4tYj9jLnN1YnN0cigwLGMubGVuZ3RoK2IpOjB9Yz0wPT09YT9jLnN1YnN0cigxKTphPGMubGVuZ3RoP2Muc3Vic3RyKDAsYSkrYy5zdWJzdHIoYSsxKTpjLnN1YnN0cigwLGEpO2ZvcihhKz1iO2E+Yy5sZW5ndGg7KWMrPVwiMFwiO3JldHVybiBjPTA+PWE/MDpjLnN1YnN0cigwLGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJG5vZmxvYXRcIixTay5idWlsdGluLmFzbnVtJG5vZmxvYXQpO1NrLmJ1aWx0aW4ucm91bmQ9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7aWYoIVNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kKXtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO1xuaWYoYS5yb3VuZCQpcmV0dXJuIGEucm91bmQkKGMpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ19fZmxvYXRfXydcIik7fWlmKHZvaWQgMCE9PWMmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRyb3VuZCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdm9pZCAwIT09Yz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbY10pOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO307U2suYnVpbHRpbi5sZW49XG5mdW5jdGlvbihhKXtpZihhLnNxJGxlbmd0aClhPWEuc3EkbGVuZ3RoKCEwKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaGFzIG5vIGxlbigpXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpfTtTay5idWlsdGluLm1pbj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9YS5sZW5ndGg7aWYoIWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWluIGV4cGVjdGVkIDEgYXJndW1lbnQsIGdvdCAwXCIpO2NvbnN0IFtoLGRdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibWluXCIsW1wiZGVmYXVsdFwiLFwia2V5XCJdLFtdLGMsW251bGwsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7aWYoMTxlJiZudWxsIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBhIGRlZmF1bHQgZm9yIG1pbigpIHdpdGggbXVsdGlwbGUgcG9zaXRpb25hbCBhcmd1bWVudHNcIik7XG5iPTE9PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkx0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkx0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWF4PWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtYXggZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWF4KCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkd0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkd0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWluLmNvX2Zhc3RjYWxsPVNrLmJ1aWx0aW4ubWF4LmNvX2Zhc3RjYWxsPTE7U2suYnVpbHRpbi5hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtpZihTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wudHJ1ZSQpfSksYT0+YXx8U2suYnVpbHRpbi5ib29sLmZhbHNlJCl9O1NrLmJ1aWx0aW4uYWxsPWZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksXG5mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNUcnVlKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnN1bT1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfKWc9Zy5uYiRhZGQoYSk7ZWxzZXtpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGc9Zy5uYiRmbG9hdCgpLm5iJGFkZChhKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJmbG9hdFwiKTtnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKTtyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFwic2xvd1wiKX19KX1mdW5jdGlvbiBlKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRffHxcbmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNlIHJldHVybiBnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfSl9ZnVuY3Rpb24gaCgpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpfSl9Y29uc3QgZD1Tay5hYnN0ci5pdGVyKGEpO2lmKHZvaWQgMD09PWMpdmFyIGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNle2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF1cIik7Zz1jfWE9dm9pZCAwPT09Y3x8Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50Xz9iKCk6Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRfP1wiZmxvYXRcIjpcInNsb3dcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxcbmE9PlwiZmxvYXRcIj09PWE/ZSgpOmEsYT0+e2lmKFwic2xvd1wiPT09YSlyZXR1cm4gaCgpfSwoKT0+Zyl9O1NrLmJ1aWx0aW4uemlwPWZ1bmN0aW9uKCl7dmFyIGEsYztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChbXSk7dmFyIGY9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWlmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhcmd1bWVudHNbY10pKWYucHVzaChTay5hYnN0ci5pdGVyKGFyZ3VtZW50c1tjXSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXJndW1lbnQgXCIrYytcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3ZhciBsPVtdO2ZvcihhPSExOyFhOyl7dmFyIGg9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1mW2NdLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09ZCl7YT0hMDticmVha31oLnB1c2goZCl9YXx8bC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX07XG5Tay5idWlsdGluLmFicz1mdW5jdGlvbihhKXtpZihhLm5iJGFicylyZXR1cm4gYS5uYiRhYnMoKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5idWlsdGluLmZhYnM9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYWJzKGEpfTtTay5idWlsdGluLm9yZD1mdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZigxIT09YS52Lmxlbmd0aCYmMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK2Eudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52LmNvZGVQb2ludEF0KDApKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpe2lmKDEhPT1hLnNxJGxlbmd0aCgpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCBidXQgc3RyaW5nIG9mIGxlbmd0aCBcIitcbmEudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52WzBdKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO307U2suYnVpbHRpbi5jaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYoMD5hfHwxMTE0MTEyPD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKVwiKTt9ZWxzZSBpZigwPmF8fDI1Njw9YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU3RyaW5nLmZyb21Db2RlUG9pbnQoYSkpfTtcblNrLmJ1aWx0aW4udW5pY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTt0cnl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihlLm1lc3NhZ2UpO3Rocm93IGU7fX07U2suYnVpbHRpbi5pbnQyc3RyXz1mdW5jdGlvbihhLGMsZil7bGV0IGI7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8KGE9YS5uYiRpbmRleCgpKTtiPWEudjtsZXQgZT1iLnRvU3RyaW5nKGMpO2U9YS5uYiRpc25lZ2F0aXZlKCk/XCItXCIrZitlLnNsaWNlKDEpOmYrZTsyIT09YyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXG4oYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHxKU0JJLl9faXNCaWdJbnQoYikpJiYoZSs9XCJMXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSl9O1NrLmJ1aWx0aW4uaGV4PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwxNixcIjB4XCIpfTtTay5idWlsdGluLm9jdD1mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4XCIpO3JldHVybiBTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsP1NrLmJ1aWx0aW4uaW50MnN0cl8oYSw4LFwiMG9cIik6U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwXCIpfTtTay5idWlsdGluLmJpbj1cbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO3JldHVybiBTay5idWlsdGluLmludDJzdHJfKGEsMixcIjBiXCIpfTtTay5idWlsdGluLmRpcj1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZGlyKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxbXSksYT0+U2suYnVpbHRpbi5zb3J0ZWQoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJza3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlyIHdpdGggbm8gYXJnc1wiKTt9O1NrLmJ1aWx0aW4ucmVwcj1mdW5jdGlvbihhKXtyZXR1cm4gYS4kcigpfTtTay5idWlsdGluLmFzY2lpPVxuZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEuJHIoKSxhPT57bGV0IGIsYztmb3IoYz0wO2M8YS52Lmxlbmd0aDtjKyspaWYoMTI3PD1hLnYuY2hhckNvZGVBdChjKSl7Yj1hLnYuc3Vic3RyKDAsYyk7YnJlYWt9aWYoIWIpcmV0dXJuIGE7Zm9yKDtjPGEudi5sZW5ndGg7YysrKXt2YXIgZT1hLnYuY2hhckF0KGMpLGQ9YS52LmNoYXJDb2RlQXQoYyk7MTI3PGQmJjI1NT49ZD8oZT1kLnRvU3RyaW5nKDE2KSwyPmUubGVuZ3RoJiYoZT1cIjBcIitlKSxiKz1cIlxcXFx4XCIrZSk6MTI3PGQmJjU1Mjk2PmR8fDU3MzQ0PD1kP2IrPVwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1kPyhlPWEudi5jb2RlUG9pbnRBdChjKSxjKyssZT1lLnRvU3RyaW5nKDE2KSxkPVwiMDAwMDAwMFwiK2UudG9TdHJpbmcoMTYpLGI9NDxlLmxlbmd0aD9iKyhcIlxcXFxVXCIrZC5zbGljZSgtOCkpOmIrKFwiXFxcXHVcIitkLnNsaWNlKC00KSkpOmIrPWV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0pfTtcblNrLmJ1aWx0aW4ub3Blbj1mdW5jdGlvbihhLGMsZil7dm9pZCAwPT09YyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiclwiKSk7aWYoL1xcKy8udGVzdChjLnYpKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIHJlYWQvd3JpdGUgbW9kZVwiO2lmKChcIndcIj09PWMudnx8XCJ3YlwiPT09Yy52fHxcImFcIj09PWMudnx8XCJhYlwiPT09Yy52KSYmIVNrLm5vbnJlYWRvcGVuKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIG5vbi1yZWFkIG9wZW5zXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGYpfTtTay5idWlsdGluLmlzaW5zdGFuY2U9ZnVuY3Rpb24oYSxjKXtpZighKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKXx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzaW5zdGFuY2UoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MsIHR5cGUsIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzXCIpO3ZhciBiPWEub2IkdHlwZTtcbmlmKGI9PT1jKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpe2lmKGIuJGlzU3ViVHlwZShjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2E9YS50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7cmV0dXJuIGEhPWImJlNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSYmYS4kaXNTdWJUeXBlKGMpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfWZvcihiPTA7YjxjLnYubGVuZ3RoOysrYilpZihTay5taXNjZXZhbC5pc1RydWUoU2suYnVpbHRpbi5pc2luc3RhbmNlKGEsYy52W2JdKSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmFic3RyLm9iamVjdEhhc2goYSkpfTtTay5idWlsdGluLmdldGF0dHI9ZnVuY3Rpb24oYSxcbmMsZil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGI9PntpZih2b2lkIDA9PT1iKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGMpKTt9cmV0dXJuIGJ9KX07U2suYnVpbHRpbi5zZXRhdHRyPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJHNldGF0dHIoYyxmLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX07U2suYnVpbHRpbi5yYXdfaW5wdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9YT9hOlwiXCI7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2suaW5wdXRmdW5UYWtlc1Byb21wdD9Tay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEuJGQuc3RkaW4sbnVsbCxiKTpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3Rkb3V0LndyaXRlLFthLiRkLnN0ZG91dCxuZXcgU2suYnVpbHRpbi5zdHIoYildKX0sZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3RkaW4ucmVhZGxpbmUsW2EuJGQuc3RkaW5dKX0pfSl9O1NrLmJ1aWx0aW4uaW5wdXQ9XG5Tay5idWlsdGluLnJhd19pbnB1dDtTay5idWlsdGluLmpzZXZhbD1mdW5jdGlvbihhKXthPVNrLmdsb2JhbC5ldmFsKFNrLmZmaS5yZW1hcFRvSnMoYSkpO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGEpfTtTay5idWlsdGluLmpzbWlsbGlzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKFwianNtaWxsaXMgaXMgZGVwcmVjYXRlZFwiKTtyZXR1cm4obmV3IERhdGUpLnZhbHVlT2YoKX07U2suYnVpbHRpbi5ldmFsXz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJldmFsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm1hcD1mdW5jdGlvbihhLGMpe3ZhciBiPVtdLGUsaDtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwibWFwXCIsYXJndW1lbnRzLmxlbmd0aCwyKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPVtdO3ZhciBnPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpO2ZvcihoPVxuMDtoPGcubGVuZ3RoO2grKyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShnW2hdKSl7dmFyIG49cGFyc2VJbnQoaCwxMCkrMjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIituK1wiIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7fWdbaF09U2suYWJzdHIuaXRlcihnW2hdKX1mb3IoOzspe3ZhciBrPVtdO2ZvcihoPWU9MDtoPGcubGVuZ3RoO2grKyluPWdbaF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1uPyhrLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKSxlKyspOmsucHVzaChuKTtpZihlIT09Zy5sZW5ndGgpZC5wdXNoKGspO2Vsc2UgYnJlYWt9Yz1uZXcgU2suYnVpbHRpbi5saXN0KGQpfWlmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYyksXG5mdW5jdGlvbihjKXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKWMgaW5zdGFuY2VvZiBBcnJheSYmKGM9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpLGIucHVzaChjKTtlbHNlIHJldHVybiBjIGluc3RhbmNlb2YgQXJyYXl8fChjPVtjXSksU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyksZnVuY3Rpb24oYSl7Yi5wdXNoKGEpfSl9KSxmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9O1NrLmJ1aWx0aW4ucmVkdWNlPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTtjPVNrLmFic3RyLml0ZXIoYyk7aWYodm9pZCAwPT09ZiYmKGY9Yy50cCRpdGVybmV4dCgpLHZvaWQgMD09PWYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZVwiKTtcbnZhciBiPWY7Zm9yKGY9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1jLnRwJGl0ZXJuZXh0KCkpYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixmXSk7cmV0dXJuIGJ9O1NrLmJ1aWx0aW4uc29ydGVkPWZ1bmN0aW9uKGEsYyxmLGwpe2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSwhMCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhKTthLmxpc3Qkc29ydChjLGYsbCk7cmV0dXJuIGF9KX07U2suYnVpbHRpbi5maWx0ZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYjtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwiZmlsdGVyXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuW119O1xudmFyIGg9ZnVuY3Rpb24oYSxiKXthLnB1c2goYik7cmV0dXJuIGF9O3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEpfTtjLm9iJHR5cGU9PT1Tay5idWlsdGluLnN0cj8oZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJcIil9LGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zcSRjb25jYXQoYil9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTpjLm9iJHR5cGU9PT1Tay5idWlsdGluLnR1cGxlJiYoZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9KTt2YXIgZz1lKCk7dmFyIG49U2suYWJzdHIuaXRlcihjKTtmb3IoYj1uLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPW4udHAkaXRlcm5leHQoKSllPWE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFNrLmJ1aWx0aW4uYm9vbChiKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYl0pLFNrLm1pc2NldmFsLmlzVHJ1ZShlKSYmKGc9aChnLGIpKTtcbnJldHVybiBkKGcpfTtTay5idWlsdGluLmhhc2F0dHI9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO2NvbnN0IGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PmEudHAkZ2V0YXR0cihjLCEwKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYixhPT52b2lkIDA9PT1hP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkKX07U2suYnVpbHRpbi5wb3c9ZnVuY3Rpb24oYSxjLGYpe2lmKHZvaWQgMD09PWZ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpKXJldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJQb3dcIik7aWYoIShTay5idWlsdGluLmNoZWNrSW50KGEpJiZTay5idWlsdGluLmNoZWNrSW50KGMpJiZcblNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpKXtpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fFNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGEpKXJldHVybiBhLm5iJHBvd2VyKGMsZik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt9cmV0dXJuIGEubmIkcG93ZXIoYyxmKX07U2suYnVpbHRpbi5xdWl0PWZ1bmN0aW9uKGEpe2E9KG5ldyBTay5idWlsdGluLnN0cihhKSkudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FeGl0KGEpO307U2suYnVpbHRpbi5pc3N1YmNsYXNzPWZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzXCIpO1xudmFyIGI9U2suYnVpbHRpbi5jaGVja0NsYXNzKGMpO2lmKCEoYnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3Mgb3IgdHVwbGUgb2YgY2xhc3Nlc1wiKTtpZihiKXJldHVybiBhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzc3ViY2xhc3MoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmdsb2JhbHM9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmRpY3QoW10pO2ZvcihhIGluIFNrLmdsb2JhbHMpe3ZhciBmPVNrLnVuZml4UmVzZXJ2ZWQoYSk7Yy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihmKSxcblNrLmdsb2JhbHNbYV0pfXJldHVybiBjfTtTay5idWlsdGluLmRpdm1vZD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJEaXZNb2RcIil9O1NrLmJ1aWx0aW4uZm9ybWF0PWZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGEsYyl9O2NvbnN0IGE9bmV3IE1hcDtsZXQgYz0wO1NrLmJ1aWx0aW4uaWQ9ZnVuY3Rpb24oYil7Y29uc3QgZT1hLmdldChiKTtpZih2b2lkIDAhPT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGUpO2Euc2V0KGIsYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYysrKX07U2suYnVpbHRpbi5ieXRlYXJyYXk9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYnl0ZWFycmF5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmNhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYSk/XG5Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5kZWxhdHRyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4uc2V0YXR0cihhLGMsdm9pZCAwKX07U2suYnVpbHRpbi5leGVjZmlsZT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJleGVjZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5oZWxwPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImhlbHAgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uaXRlcj1mdW5jdGlvbihhLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Tay5hYnN0ci5pdGVyKGEpOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl8oYSxjKSl9O1NrLmJ1aWx0aW4ubG9jYWxzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxvY2FscyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtTay5idWlsdGluLm1lbW9yeXZpZXc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibWVtb3J5dmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5uZXh0Xz1mdW5jdGlvbihhLGMpe2lmKCFhLnRwJGl0ZXJuZXh0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvclwiKTthPWEudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXtpZihjKXJldHVybiBjO3Rocm93IG5ldyBTay5idWlsdGluLlN0b3BJdGVyYXRpb247fXJldHVybiBhfTtTay5idWlsdGluLnJlbG9hZD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJyZWxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4udmFycz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJ2YXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4uYXBwbHlfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImFwcGx5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmJ1ZmZlcj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJidWZmZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY29lcmNlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImNvZXJjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pbnRlcm49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaW50ZXJuIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkJhc2VFeGNlcHRpb25cIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLFwiYmFkIGNhbGwgdG8gZXhjZXB0aW9uIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7bGV0IGM9YVswXTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihjPW5ldyBTay5idWlsdGluLnN0cihjKSk7dGhpcy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGM/W2NdOltdKTt0aGlzLnRyYWNlYmFjaz1bXTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3Q7Mzw9YS5sZW5ndGgmJnRoaXMudHJhY2ViYWNrLnB1c2goe2xpbmVubzphWzJdLGZpbGVuYW1lOmFbMV18fFwiPHVua25vd24+XCJ9KX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9uc1wiLHRwJG5ldyhhLGMpe3RoaXMuaHAkdHlwZT8oYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcixTay5idWlsdGluLkJhc2VFeGNlcHRpb24uY2FsbChjKSk6XG5jPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2MuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShhLnNsaWNlKCkpO3JldHVybiBjfSx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhTay5hYnN0ci50eXBlTmFtZSh0aGlzKSxjKX0sJHIoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCIoXCIrdGhpcy5hcmdzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXCIsIFwiKStcIilcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSx0cCRzdHIoKXtyZXR1cm4gMT49dGhpcy5hcmdzLnYubGVuZ3RoP25ldyBTay5idWlsdGluLnN0cih0aGlzLmFyZ3MudlswXSk6dGhpcy5hcmdzLiRyKCl9fSxnZXRzZXRzOnthcmdzOnskZ2V0KCl7cmV0dXJuIHRoaXMuYXJnc319LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0scHJvdG86e3RvU3RyaW5nKCl7bGV0IGE9dGhpcy50cCRuYW1lO2ErPVwiOiBcIit0aGlzLnRwJHN0cigpLnY7cmV0dXJuIGE9MCE9PXRoaXMudHJhY2ViYWNrLmxlbmd0aD9cbmErKFwiIG9uIGxpbmUgXCIrdGhpcy50cmFjZWJhY2tbMF0ubGluZW5vKTphK1wiIGF0IDx1bmtub3duPlwifX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIixTay5idWlsdGluLkJhc2VFeGNlcHRpb24pO1NrLmJ1aWx0aW4uRXhjZXB0aW9uPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeGNlcHRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5FeGNlcHRpb25cIixTay5idWlsdGluLkV4Y2VwdGlvbik7U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXNzZXJ0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvclwiLFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkF0dHJpYnV0ZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkltcG9ydEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbXBvcnRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRlbnRhdGlvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZXhFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZXhFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5Mb29rdXBFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTG9va3VwRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uS2V5RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIktleUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uTG9va3VwRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkxvb2t1cEVycm9yfSk7U2suYnVpbHRpbi5OYW1lRXJyb3I9XG5Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTmFtZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmJvdW5kTG9jYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPdmVyZmxvd0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlN5bnRheEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeW50YXhFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlJ1bnRpbWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUnVudGltZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJ1bnRpbWVFcnJvclwiLFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKTtTay5idWlsdGluLlN1c3BlbnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3VzcGVuc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN1c3BlbnNpb25FcnJvclwiLFxuU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXhpdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXhpdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUV4aXRcIixTay5idWlsdGluLlN5c3RlbUV4aXQpO1NrLmJ1aWx0aW4uVHlwZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUeXBlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVHlwZUVycm9yXCIsU2suYnVpbHRpbi5UeXBlRXJyb3IpO1NrLmJ1aWx0aW4uVmFsdWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVmFsdWVFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlZhbHVlRXJyb3JcIixTay5idWlsdGluLlZhbHVlRXJyb3IpO1NrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlplcm9EaXZpc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlRpbWVMaW1pdEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUaW1lTGltaXRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvclwiLFxuU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvcik7U2suYnVpbHRpbi5JT0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJT0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLklPRXJyb3JcIixTay5idWlsdGluLklPRXJyb3IpO1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yXCIsU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKTtTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOZWdhdGl2ZVBvd2VyRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yXCIsU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IpO1NrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiRXh0ZXJuYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXt0aGlzLm5hdGl2ZUVycm9yPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcodGhpcy5uYXRpdmVFcnJvcikmJihhWzBdPXRoaXMubmF0aXZlRXJyb3IudG9TdHJpbmcoKSxhWzBdLnN0YXJ0c1dpdGgoXCJSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGxcIikpKXJldHVybiBhWzBdPVwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIixcbm5ldyBTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKC4uLmEpO1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4dGVybmFsRXJyb3JcIixTay5idWlsdGluLkV4dGVybmFsRXJyb3IpO1NrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlJlY3Vyc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uUnVudGltZUVycm9yLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yXCIsU2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcik7U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiT3BlcmF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvclwiLFNrLmJ1aWx0aW4uT3BlcmF0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5c3RlbUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUVycm9yXCIsU2suYnVpbHRpbi5TeXN0ZW1FcnJvcik7U2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuaWNvZGVEZWNvZGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3JcIixcblNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZUVuY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvclwiLFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKTtTay5idWlsdGluLlN0b3BJdGVyYXRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN0b3BJdGVyYXRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvblwiLFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbik7XG5Tay5idWlsdGluLmdldEV4Y0luZm89ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFthLm9iJHR5cGV8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxhLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kLFwiYmFkIGNhbGwgdG8gbWV0aG9kIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7dGhpcy5pbV9mdW5jPWE7dGhpcy5pbV9zZWxmPWM7dGhpcy5pbV9jYWxsPWEudHAkY2FsbH0sc2xvdHM6eyRyKCl7bGV0IGE9dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHF1YWxuYW1lKXx8dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO2E9YSYmYS52fHxcIj9cIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJvdW5kIG1ldGhvZCBcIitcbmErXCIgb2YgXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmltX3NlbGYpK1wiPlwiKX0sdHAkaGFzaCgpe2NvbnN0IGE9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX3NlbGYpLGM9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX2Z1bmMpO3JldHVybiBhK2N9LHRwJGNhbGwoYSxjKXt2YXIgYj10aGlzLmltX2NhbGw7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5pbV9mdW5jKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTthPVt0aGlzLmltX3NlbGYsLi4uYV07cmV0dXJuIGIuY2FsbCh0aGlzLmltX2Z1bmMsYSxjKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1ldGhvZFwiLGEsMiwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVwiKTtcbmlmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlbGYgbXVzdCBub3QgYmUgTm9uZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGMsYSl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT1jJiZcIk5vdEVxXCIhPWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7bGV0IGI7dHJ5e2I9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuaW1fc2VsZixhLmltX3NlbGYsXCJFcVwiLCExKSYmdGhpcy5pbV9mdW5jPT1hLmltX2Z1bmN9Y2F0Y2goZSl7Yj0hMX1yZXR1cm5cIkVxXCI9PWM/YjohYn0sdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIHRoaXN9LHRwJGdldGF0dHIoYSxjKXtjb25zdCBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxhKTtyZXR1cm4gdm9pZCAwIT09Yj9iOnRoaXMuaW1fZnVuYy50cCRnZXRhdHRyKGEsXG5jKX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fZnVuY319LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fc2VsZn19LF9fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGRvYyl9fX0sZmxhZ3M6e3NrJHN1aXRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtpZihudWxsIT09YSYmdm9pZCAwIT09YSl7aWYoYS5uYiRpbmRleClyZXR1cm4gYS5uYiRpbmRleCgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKSlyZXR1cm4gYX19ZnVuY3Rpb24gYyhiLGMpe2NvbnN0IGU9YShiKTtpZih2b2lkIDAhPT1lKXJldHVybiBlO2M9KGN8fFwiJ3t0cCRuYW1lfScgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXCIpLnJlcGxhY2UoXCJ7dHAkbmFtZX1cIixTay5hYnN0ci50eXBlTmFtZShiKSk7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYyk7fVNrLm1pc2NldmFsPXt9O1NrLm1pc2NldmFsLlN1c3BlbnNpb249ZnVuY3Rpb24oYSxjLGYpe3RoaXMuJGlzU3VzcGVuc2lvbj0hMDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiYodGhpcy5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYShjLnJlc3VtZSgpKX0pO3RoaXMuY2hpbGQ9Yzt0aGlzLm9wdGlvbmFsPXZvaWQgMCE9PWMmJmMub3B0aW9uYWw7dGhpcy5kYXRhPXZvaWQgMD09PWYmJnZvaWQgMCE9PWM/Yy5kYXRhOmZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLlN1c3BlbnNpb25cIixTay5taXNjZXZhbC5TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3c9ZnVuY3Rpb24oYSxjKXtmb3IoO2EgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uOyl7aWYoIWEub3B0aW9uYWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKGN8fFwiQ2Fubm90IGNhbGwgYSBmdW5jdGlvbiB0aGF0IGJsb2NrcyBvciBzdXNwZW5kcyBoZXJlXCIpO1xuYT1hLnJlc3VtZSgpfXJldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3dcIixTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3cpO1NrLm1pc2NldmFsLmlzSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5uYiRpbmRleHx8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNJbmRleFwiLFNrLm1pc2NldmFsLmlzSW5kZXgpO1NrLm1pc2NldmFsLmFzSW5kZXg9YTtTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQ9ZnVuY3Rpb24oYSxlLGYpe2Y9YyhhLGYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZjtpZihudWxsPT1lKXJldHVybiBKU0JJLmxlc3NUaGFuKGYsSlNCSS5fX1pFUk8pPy1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbnRocm93IG5ldyBlKFwiY2Fubm90IGZpdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlclwiKTt9O1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93PWM7U2subWlzY2V2YWwuYXBwbHlTbGljZT1mdW5jdGlvbihhLGMsZixsKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGMsZixudWxsKSxsKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlTbGljZVwiLFNrLm1pc2NldmFsLmFwcGx5U2xpY2UpO1NrLm1pc2NldmFsLmFzc2lnblNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwsaCl7Yz1uZXcgU2suYnVpbHRpbi5zbGljZShjLGYpO3JldHVybiBudWxsPT09bD9Tay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYyk6U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLGMsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXNzaWduU2xpY2VcIixTay5taXNjZXZhbC5hc3NpZ25TbGljZSk7XG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMSE9YS5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9YVswXTtjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQ/Yz1jLnRwJGl0ZXIoKS4kb2JqOmMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJihjPVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUua2V5cy5mdW5jX2NvZGUoYykpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3R8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXJldHVybiBjLnY7aWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXthPVtdO2M9U2suYWJzdHIuaXRlcihjKTtmb3IoYj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWMudHAkaXRlcm5leHQoKSlhLnB1c2goYik7cmV0dXJuIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXJyYXlGcm9tQXJndW1lbnRzXCIsXG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHMpO1NrLm1pc2NldmFsLml0ZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy50cCRpdGVybmV4dD1jP2E6ZnVuY3Rpb24oYil7bGV0IGM9YSgpO3JldHVybiBifHwhYy4kaXNTdXNwZW5zaW9uP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0saXRlcm5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoYSl9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2subWlzY2V2YWwuc3dhcHBlZE9wXz17RXE6XCJFcVwiLE5vdEVxOlwiTm90RXFcIixMdDpcIkd0XCIsTHRFOlwiR3RFXCIsR3Q6XCJMdFwiLEd0RTpcIkx0RVwifTtTay5taXNjZXZhbC5vcFN5bWJvbHM9e0VxOlwiPT1cIixOb3RFcTpcIiE9XCIsTHQ6XCI8XCIsTHRFOlwiPD1cIixHdDpcIj5cIixHdEU6XCI+PVwiLElzOlwiaXNcIixJc05vdDpcImlzIG5vdFwiLFxuSW5fOlwiaW5cIixOb3RJbjpcIm5vdCBpblwifTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2w9ZnVuY3Rpb24oYSxjLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQoYS5zayRvYmplY3QmJmMuc2skb2JqZWN0LFwiSlMgb2JqZWN0IHBhc3NlZCB0byByaWNoQ29tcGFyZUJvb2xcIik7dmFyIGI7dmFyIGQ9YS5vYiR0eXBlO3ZhciBlPWMub2IkdHlwZSxuPWUhPT1kJiZ2b2lkIDA9PT1lLnNrJGJhc2VDbGFzcyYmZS4kaXNTdWJUeXBlKGQpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmQhPT1lJiYoXCJHdEVcIj09PWZ8fFwiR3RcIj09PWZ8fFwiTHRFXCI9PT1mfHxcIkx0XCI9PT1mKSl7dmFyIGs9W1NrLmJ1aWx0aW4uZmxvYXRfLFNrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmJvb2xdLHA9W1NrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmVudW1lcmF0ZSxTay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbi5saXN0LFNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGluLnN0cixTay5idWlsdGluLnR1cGxlLFxuU2suYnVpbHRpbi56aXBfXTtjb25zdCBiPWsuaW5kZXhPZihkKSxnPXAuaW5kZXhPZihkKTtrPWsuaW5kZXhPZihlKTtwPXAuaW5kZXhPZihlKTtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMDtjYXNlIFwiTHRFXCI6cmV0dXJuITA7Y2FzZSBcIkd0XCI6cmV0dXJuITE7Y2FzZSBcIkd0RVwiOnJldHVybiExfWlmKGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtjYXNlIFwiR3RFXCI6cmV0dXJuITB9aWYoLTEhPT1iJiYtMSE9PXApc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoLTEhPT1nJiYtMSE9PWspc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtcbmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWcmJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuIGc8cDtjYXNlIFwiTHRFXCI6cmV0dXJuIGc8PXA7Y2FzZSBcIkd0XCI6cmV0dXJuIGc+cDtjYXNlIFwiR3RFXCI6cmV0dXJuIGc+PXB9fWlmKFwiSXNcIj09PWYpe2lmKGQ9PT1lKXtpZihhPT09YylyZXR1cm4hMDtpZihkPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGEudj09PWMudjtpZihkPT09U2suYnVpbHRpbi5pbnRfKXJldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY9PT1jLnY6SlNCSS5lcXVhbChKU0JJLkJpZ0ludChhLnYpLEpTQkkuQmlnSW50KGMudikpfXJldHVybiExfWlmKFwiSXNOb3RcIj09PWYpcmV0dXJuIGQhPT1lPyEwOmQ9PT1Tay5idWlsdGluLmZsb2F0Xz9hLnYhPT1jLnY6ZD09PVNrLmJ1aWx0aW4uaW50Xz9cIm51bWJlclwiPT09dHlwZW9mIGEudiYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52IT09Yy52OkpTQkkubm90RXF1YWwoSlNCSS5CaWdJbnQoYS52KSxcbkpTQkkuQmlnSW50KGMudikpOmEhPT1jO2lmKFwiSW5cIj09PWYpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYyxhLGwpLFNrLm1pc2NldmFsLmlzVHJ1ZSk7aWYoXCJOb3RJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksZnVuY3Rpb24oYSl7cmV0dXJuIVNrLm1pc2NldmFsLmlzVHJ1ZShhKX0pO2U9e0VxOlwib2IkZXFcIixOb3RFcTpcIm9iJG5lXCIsR3Q6XCJvYiRndFwiLEd0RTpcIm9iJGdlXCIsTHQ6XCJvYiRsdFwiLEx0RTpcIm9iJGxlXCJ9O2Q9ZVtmXTtpZihuJiYobD1lW1NrLm1pc2NldmFsLnN3YXBwZWRPcF9bZl1dLGNbbF0hPT1hW2xdJiYoYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXx8KGI9YVtkXShjKSkhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8IW4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sXG4oYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGIpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2lmKG49U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRjbXApKXRyeXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShuLFtjXSk7aWYoU2suYnVpbHRpbi5jaGVja051bWJlcihiKSl7Yj1Tay5idWlsdGluLmFzbnVtJChiKTtpZihcIkVxXCI9PT1mKXJldHVybiAwPT09YjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiAwIT09YjtpZihcIkx0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJHdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiTHRFXCI9PT1mKXJldHVybiAwPj1iO2lmKFwiR3RFXCI9PT1mKXJldHVybiAwPD1ifWlmKGIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTt9aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGMsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2FdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA8YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA8PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA+PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1pZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiZjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZihcIkVxXCI9PT1mKXJldHVybiBhLnY9PT1jLnY7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gYS52IT09Yy52O2lmKFwiR3RcIj09PWYpcmV0dXJuIGEudj5jLnY7aWYoXCJHdEVcIj09PWYpcmV0dXJuIGEudj49Yy52O2lmKFwiTHRcIj09PWYpcmV0dXJuIGEudjxjLnY7aWYoXCJMdEVcIj09PWYpcmV0dXJuIGEudjw9Yy52fX1pZihcIkVxXCI9PT1mKXJldHVybiBhPT09YztpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhIT09YzthPVNrLmFic3RyLnR5cGVOYW1lKGEpO2M9U2suYWJzdHIudHlwZU5hbWUoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLm1pc2NldmFsLm9wU3ltYm9sc1tmXStcIicgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbFwiLFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCk7XG5Tay5taXNjZXZhbC5vYmplY3RSZXByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ0cnlpbmcgdG8gcmVwciB1bmRlZmluZWRcIik7aWYobnVsbCE9PWEmJmEuJHIpcmV0dXJuIGEuJHIoKS52O3RyeXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcilyZXR1cm5cIjx1bmtub3duPlwiO3Rocm93IGU7fX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub2JqZWN0UmVwclwiLFNrLm1pc2NldmFsLm9iamVjdFJlcHIpO1NrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHk9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgXCJMdEVcIjpjYXNlIFwiRXFcIjpjYXNlIFwiR3RFXCI6cmV0dXJuITB9cmV0dXJuITF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHlcIixTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KTtTay5taXNjZXZhbC5pc1RydWU9ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1cbmF8fGE9PT1Tay5idWlsdGluLmJvb2wudHJ1ZSQ/ITA6ITE9PT1hfHxhPT09U2suYnVpbHRpbi5ib29sLmZhbHNlJHx8bnVsbD09PWF8fHZvaWQgMD09PWE/ITE6YS5uYiRib29sP2EubmIkYm9vbCgpOmEuc3EkbGVuZ3RoPzAhPT1hLnNxJGxlbmd0aCgpOiEhYX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNUcnVlXCIsU2subWlzY2V2YWwuaXNUcnVlKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLm1pc2NldmFsLnByaW50Xz1mdW5jdGlvbihhKXtTay5taXNjZXZhbC5zb2Z0c3BhY2VfJiYoXCJcXG5cIiE9PWEmJlNrLm91dHB1dChcIiBcIiksU2subWlzY2V2YWwuc29mdHNwYWNlXz0hMSk7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEuJGQuc3Rkb3V0LndyaXRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLFthLiRkLnN0ZG91dCxcbmJdKX0sZnVuY3Rpb24oKXt2YXIgYTsoYT0wPT09Yi52Lmxlbmd0aCl8fChhPWIudltiLnYubGVuZ3RoLTFdLGE9IShcIlxcblwiPT09YXx8XCJcXHRcIj09PWF8fFwiXFxyXCI9PT1hKSk7aWYoYXx8XCIgXCI9PT1iLnZbYi52Lmxlbmd0aC0xXSlTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSEwfSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByaW50X1wiLFNrLm1pc2NldmFsLnByaW50Xyk7U2subWlzY2V2YWwubG9hZG5hbWU9ZnVuY3Rpb24oYSxjKXtjPWNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmJ1aWx0aW5zW2FdO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTmFtZUVycm9yKFwibmFtZSAnXCIrU2sudW5maXhSZXNlcnZlZChhKStcIicgaXMgbm90IGRlZmluZWRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5sb2FkbmFtZVwiLFNrLm1pc2NldmFsLmxvYWRuYW1lKTtTay5taXNjZXZhbC5jYWxsPWZ1bmN0aW9uKGEsYyxmLGwsaCl7aD1cbkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbFwiLFNrLm1pc2NldmFsLmNhbGwpO1NrLm1pc2NldmFsLmNhbGxBc3luYz1mdW5jdGlvbihhLGMsZixsLGgsZCl7ZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLGYsbCxoLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsQXN5bmNcIixTay5taXNjZXZhbC5jYWxsQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZFwiLFxuU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZCk7U2subWlzY2V2YWwuY2FsbHNpbT1mdW5jdGlvbihhLGMpe2M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltXCIsU2subWlzY2V2YWwuY2FsbHNpbSk7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5PWZ1bmN0aW9uKGEsYyxmKXtjPWN8fFtdO3JldHVybiBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyxmKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSk7U2subWlzY2V2YWwuY2FsbHNpbUFzeW5jPWZ1bmN0aW9uKGEsYyxmKXtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxcbjIpO3JldHVybiBTay5taXNjZXZhbC5hcHBseUFzeW5jKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCxmKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jXCIsU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIHZvaWQgMCE9PWEmJmEudHAkY2FsbD9hLnRwJGNhbGwoYyxmKTpTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLHZvaWQgMCx2b2lkIDAsZixcbmMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXlcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkpO1NrLm1pc2NldmFsLmFwcGx5PWZ1bmN0aW9uKGEsYyxmLGwsaCl7YT1Tay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpO3JldHVybiBhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk6YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlcIixTay5taXNjZXZhbC5hcHBseSk7U2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2U9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYixlKXt0cnl7KGZ1bmN0aW9uIGcoYSl7dHJ5e2Zvcih2YXIgZD1mdW5jdGlvbigpe3RyeXtnKGEucmVzdW1lKCkpfWNhdGNoKHQpe2UodCl9fSxmPWZ1bmN0aW9uKGIpe3RyeXthLmRhdGEucmVzdWx0PWIsXG5kKCl9Y2F0Y2godil7ZSh2KX19LHA9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5lcnJvcj1iLGQoKX1jYXRjaCh2KXtlKHYpfX07YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXt2YXIgbD1jJiYoY1thLmRhdGEudHlwZV18fGNbXCIqXCJdKTtpZihsKXt2YXIgQT1sKGEpO2lmKEEpe0EudGhlbihnLGUpO3JldHVybn19aWYoXCJTay5wcm9taXNlXCI9PWEuZGF0YS50eXBlKXthLmRhdGEucHJvbWlzZS50aGVuKGYscCk7cmV0dXJufWlmKFwiU2sueWllbGRcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKFwiU2suZGVsYXlcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKGEub3B0aW9uYWwpYT1hLnJlc3VtZSgpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKFwiVW5oYW5kbGVkIG5vbi1vcHRpb25hbCBzdXNwZW5zaW9uIG9mIHR5cGUgJ1wiK2EuZGF0YS50eXBlK1wiJ1wiKTtcbn1iKGEpfWNhdGNoKHQpe2UodCl9fSkoYSgpKX1jYXRjaChoKXtlKGgpfX0pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZVwiLFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKTtTay5taXNjZXZhbC5hcHBseUFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtyZXR1cm4gU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYyxmLGwsaCxkKX0sYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFwcGx5QXN5bmNcIixTay5taXNjZXZhbC5hcHBseUFzeW5jKTtTay5taXNjZXZhbC5jaGFpbj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgYj0xLGU9YSxoLGQ7Oyl7aWYoYj09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZTtpZihlJiZlLiRpc1N1c3BlbnNpb24pYnJlYWs7ZT1hcmd1bWVudHNbYl0oZSk7YisrfWQ9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC1iKTtmb3IoaD0wO2g8YXJndW1lbnRzLmxlbmd0aC1cbmI7aCsrKWRbaF09YXJndW1lbnRzW2IraF07aD0wO3JldHVybiBmdW5jdGlvbiBrKGEpe2Zvcig7aDxkLmxlbmd0aDspe2lmKGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXJldHVybiBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbihrLGEpO2E9ZFtoXShhKTtoKyt9cmV0dXJuIGF9KGUpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jaGFpblwiLFNrLm1pc2NldmFsLmNoYWluKTtTay5taXNjZXZhbC50cnlDYXRjaD1mdW5jdGlvbihhLGMpe3RyeXt2YXIgYj1hKCl9Y2F0Y2gobCl7cmV0dXJuIGMobCl9cmV0dXJuIGIgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uPyhhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKHZvaWQgMCxiKSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC50cnlDYXRjaChiLnJlc3VtZSxjKX0sYSk6Yn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwudHJ5Q2F0Y2hcIixTay5taXNjZXZhbC50cnlDYXRjaCk7XG5Tay5taXNjZXZhbC5pdGVyRm9yPWZ1bmN0aW9uKGEsYyxmKXt2YXIgYj1mLGU9ZnVuY3Rpb24oYyl7Yj1jO3JldHVybiBjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWs/YzphLnRwJGl0ZXJuZXh0KCEwKX07cmV0dXJuIGZ1bmN0aW9uIG4oYSl7Zm9yKDt2b2lkIDAhPT1hOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKG4sYSk7aWYoYT09PVNrLm1pc2NldmFsLkJyZWFrfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspcmV0dXJuIGEuYnJWYWx1ZTthPVNrLm1pc2NldmFsLmNoYWluKGMoYSxiKSxlKX1yZXR1cm4gYn0oYS50cCRpdGVybmV4dCghMCkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pdGVyRm9yXCIsU2subWlzY2V2YWwuaXRlckZvcik7U2subWlzY2V2YWwuaXRlckFycmF5PWZ1bmN0aW9uKGEsYyxmKXtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpLFxuXCJpdGVyQXJncyByZXF1aXJlcyBhbiBhcnJheVwiKTtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKHt0cCRpdGVybmV4dDooKT0+YVtiKytdfSxjLGYpfTtTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZT1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpcmV0dXJuW107aWYodm9pZCAwPT09YS5ocCR0eXBlJiZ2b2lkIDAhPT1hLnNrJGFzYXJyYXkpcmV0dXJuIGEuc2skYXNhcnJheSgpO2NvbnN0IGI9W107YT1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2IucHVzaChhKX0pLCgpPT5iKTtyZXR1cm4gYz9hOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKX07U2subWlzY2V2YWwuQnJlYWs9ZnVuY3Rpb24oYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoYSk7dGhpcy5iclZhbHVlPWF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLkJyZWFrXCIsXG5Tay5taXNjZXZhbC5CcmVhayk7U2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYjtpZihudWxsPT1hfHxhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmdm9pZCAwPT09YS50cCRjYWxsJiYoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGEpKTt2YXIgZT1hLnRwJGNhbGw7aWYodm9pZCAwIT09ZSl7aWYoZilmb3IoZj1mLnRwJGl0ZXIoKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKWgucHVzaChiKTtpZihjKWZvcihmPVNrLmFic3RyLml0ZXIoYyksYj1mLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWYudHAkaXRlcm5leHQoKSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiRnVuY3Rpb24ga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO1xubC5wdXNoKGIudik7bC5wdXNoKFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxiLCExKSl9cmV0dXJuIGUuY2FsbChhLGgsbCxjKX1lPWEuX19jYWxsX187aWYodm9pZCAwIT09ZSlyZXR1cm4gaC51bnNoaWZ0KGEpLFNrLm1pc2NldmFsLmFwcGx5KGUsYyxmLGwsaCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmRcIixTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZCk7U2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtiLnJlc3VtZT1mdW5jdGlvbigpe2lmKGIuZGF0YS5lcnJvcil0aHJvdyBiLmRhdGEuZXJyb3I7cmV0dXJuIGIuZGF0YS5yZXN1bHR9O2IuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBifTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb25cIixTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5idWlsZENsYXNzPWZ1bmN0aW9uKGEsYyxmLGwsaCl7dmFyIGI9U2suYnVpbHRpbi50eXBlLGU9e307YyhhLGUsdm9pZCAwPT09aD97fTpoKTthLl9fbmFtZV9fJiYoZS5fX21vZHVsZV9fPWEuX19uYW1lX18pO2E9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO2w9bmV3IFNrLmJ1aWx0aW4udHVwbGUobCk7Yz1bXTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihuKSksYy5wdXNoKGVbbl0pKTtjPW5ldyBTay5idWlsdGluLmRpY3QoYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFthLGwsY10pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5idWlsZENsYXNzXCIsU2subWlzY2V2YWwuYnVpbGRDbGFzcyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXz1cblNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImNhbGxhYmxlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGVcIik7dGhpcy4kY2FsbGFibGU9YTt0aGlzLiRzZW50aW5lbD1jO3RoaXMuJGZsYWc9ITF9LGl0ZXJuZXh0KGEpe2lmKCEwIT09dGhpcy4kZmxhZyl7aWYoYSlyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kY2FsbGFibGUsW10pLFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLHRoaXMuJHNlbnRpbmVsLFwiRXFcIiwhMCkpdGhpcy4kZmxhZz0hMDtlbHNlIHJldHVybiBhfSk7YT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy4kY2FsbGFibGUsW10pO2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxudGhpcy4kc2VudGluZWwsXCJFcVwiLCExKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2VxX2l0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWF9LGl0ZXJuZXh0KGEpe2xldCBjO2M9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PnRoaXMuJHNlcS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5JbmRleEVycm9yfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRmbGFnczp7Tm9BcmdzOiEwfSxcbiRtZXRoKCl7aWYodGhpcy4kc2VxLnNxJGxlbmd0aClyZXR1cm4gdGhpcy4kc2VxLnNxJGxlbmd0aCgpLXRoaXMuJGluZGV4O3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJsZW4gaXMgbm90IGltcGxlbWVudGVkIGZvciBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLiRzZXEpKTt9fX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfXCIsU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5saXN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsaXN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWE/YT1bXTpBcnJheS5pc0FycmF5KGEpfHwoYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCxcImJhZCBjYWxsIHRvIGxpc3QsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO1xudGhpcy52PWE7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJCdWlsdC1pbiBtdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0LlxcblRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGl0ZXJhYmxlIGlmIHNwZWNpZmllZC5cIix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJsaXN0XCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibGlzdFwiLGEsMCwxKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYVswXSwhMCksYT0+e3RoaXMudj1hfSl9LCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbLi4uXVwiKTtcbnRoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbXCIrYS5qb2luKFwiLCBcIikrXCJdXCIpfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgdG8gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuY29uY2F0KGEudikpfSxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsXG5hLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXJldHVybiBhPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvciksXG5hPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGluZGV4IG91dCBvZiByYW5nZVwiKSx0aGlzLnZbYV07aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LG1wJGFzc19zdWJzY3JpcHQoYSxjKXt2b2lkIDA9PT1jP3RoaXMuZGVsJHN1YnNjcmlwdChhKTp0aGlzLmFzcyRzdWJzY3JpcHQoYSxjKX0sc3EkaW5wbGFjZV9jb25jYXQoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLHRoaXMpOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy52LnB1c2goYSl9KSxcbigpPT50aGlzKX0sc3EkaW5wbGFjZV9yZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtpZigwPj1hKXRoaXMudi5sZW5ndGg9MDtlbHNlIGlmKGEqYj5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2ZvcihsZXQgYz0xO2M8YTtjKyspZm9yKGxldCBhPTA7YTxiO2ErKyl0aGlzLnYucHVzaCh0aGlzLnZbYV0pO3JldHVybiB0aGlzfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgYyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgbGlzdC5cIn0sY2xlYXI6eyRtZXRoKCl7dGhpcy52Lmxlbmd0aD0wO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIGxpc3QuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy52LnNsaWNlKDApKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3QuXCJ9LGFwcGVuZDp7JG1ldGgoYSl7dGhpcy52LnB1c2goYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBvYmplY3QsIC8pXCIsJGRvYzpcIkFwcGVuZCBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cIn0saW5zZXJ0OnskbWV0aChhLFxuYyl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpOyh7c3RhcnQ6YX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxhKSk7dGhpcy52LnNwbGljZShhLDAsYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXgsIG9iamVjdCwgLylcIiwkZG9jOlwiSW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXguXCJ9LGV4dGVuZDp7JG1ldGgoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJFeHRlbmQgbGlzdCBieSBhcHBlbmRpbmcgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUuXCJ9LFxucG9wOnskbWV0aChhKXthPXZvaWQgMD09PWE/dGhpcy52Lmxlbmd0aC0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwicG9wIGluZGV4IG91dCBvZiByYW5nZVwiKTtjb25zdCBiPXRoaXMudlthXTt0aGlzLnYuc3BsaWNlKGEsMSk7cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4PS0xLCAvKVwiLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBpdGVtIGF0IGluZGV4IChkZWZhdWx0IGxhc3QpLlxcblxcblJhaXNlcyBJbmRleEVycm9yIGlmIGxpc3QgaXMgZW1wdHkgb3IgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlwifSxyZW1vdmU6eyRtZXRoKGEpe2E9dGhpcy5saXN0JGluZGV4T2YoYSk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdFwiKTt0aGlzLnYuc3BsaWNlKGEsXG4xKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LHNvcnQ6eyRtZXRoKGEsYyl7aWYoYS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic29ydCgpIHRha2VzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImtleVwiLFwicmV2ZXJzZVwiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXSk7cmV0dXJuIHRoaXMubGlzdCRzb3J0KHZvaWQgMCxiLGUpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsXG4kZG9jOlwiU3RhYmxlIHNvcnQgKklOIFBMQUNFKi5cIn0saW5kZXg6eyRtZXRoKGEsYyxmKXtpZih2b2lkIDAhPT1jJiYhU2subWlzY2V2YWwuaXNJbmRleChjKXx8dm9pZCAwIT09ZiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtjPXRoaXMubGlzdCRpbmRleE9mKGEsYyxmKTtpZigtMT09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiIGlzIG5vdCBpbiBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgc3RhcnQ9MCwgc3RvcD1zeXMubWF4c2l6ZSwgLylcIiwkZG9jOlwiUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sXG5jb3VudDp7JG1ldGgoYSl7bGV0IGI9MDtjb25zdCBjPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZih0aGlzLnZbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2VdLGEsXCJFcVwiKSliKz0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlLlwifSxyZXZlcnNlOnskbWV0aCgpe3RoaXMubGlzdCRyZXZlcnNlKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXZlcnNlICpJTiBQTEFDRSouXCJ9fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9LGxpc3Qkc29ydDpmdW5jdGlvbihhLGMsZil7Y29uc3QgYj1udWxsIT1jJiZjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO1xudmFyIGU9bnVsbCE9YSYmYSE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgZDtpZih2b2lkIDA9PT1mKWQ9ITE7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrSW50KGYpKWQ9U2subWlzY2V2YWwuaXNUcnVlKGYpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTtmPW5ldyBTay5idWlsdGluLnRpbVNvcnQodGhpcyk7dGhpcy52PVtdO2NvbnN0IGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtpZihiKXtmLmx0PWU/ZnVuY3Rpb24oYixjKXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiWzBdLGNbMF1dKTtyZXR1cm4gU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZyxcIkx0XCIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYVswXSxiWzBdLFwiTHRcIil9O2ZvcihsZXQgYT0wO2E8Zi5saXN0bGVuZ3RoO2ErKyl7ZT1mLmxpc3QudlthXTtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFxuW2VdKTtmLmxpc3QudlthXT1bYixlXX19ZWxzZSBlJiYoZi5sdD1mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2IsY10pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9KTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7Zi5zb3J0KCk7ZCYmZi5saXN0Lmxpc3QkcmV2ZXJzZSgpO2lmKGIpZm9yKGM9MDtjPGYubGlzdGxlbmd0aDtjKyspZT1mLmxpc3QudltjXVsxXSxmLmxpc3QudltjXT1lO2M9MDx0aGlzLnNxJGxlbmd0aCgpO3RoaXMudj1mLmxpc3QudjtpZihjKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0XCIpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGxpc3QkaW5SYW5nZShhLGMpezA+YSYmKGErPXRoaXMudi5sZW5ndGgpO2lmKDA8PWEmJmE8dGhpcy52Lmxlbmd0aClyZXR1cm4gYTt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKGMpO1xufSxsaXN0JGluZGV4T2YoYSxjLGYpe2Zvcih7c3RhcnQ6YyxlbmQ6Zn09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGYpO2M8ZiYmYzx0aGlzLnYubGVuZ3RoO2MrKylpZih0aGlzLnZbY109PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2NdLGEsXCJFcVwiKSlyZXR1cm4gYztyZXR1cm4tMX0sbGlzdCRyZXZlcnNlKCl7dGhpcy52LnJldmVyc2UoKX0sYXNzJHN1YnNjcmlwdChhLGMpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5hc3MkaW5kZXgoYSxjKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpofT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWg/dGhpcy5hc3Mkc2xpY2UoYixlLGMpOnRoaXMuYXNzJGV4dF9zbGljZShhLGMpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxhc3MkaW5kZXgoYSxjKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLnZbYV09Y30sYXNzJHNsaWNlKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGFzc2lnbiBhbiBpdGVyYWJsZVwiKTtmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGYpO3RoaXMudi5zcGxpY2UoYSxjLWEsLi4uZil9LGFzcyRleHRfc2xpY2UoYSxjKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKGEpfSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGFzc2lnbiBpdGVyYWJsZSB0byBleHRlbmRlZCBzbGljZVwiKTtcbmE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYyk7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2l6ZSBcIithLmxlbmd0aCtcIiB0byBleHRlbmRlZCBzbGljZSBvZiBzaXplIFwiK2IubGVuZ3RoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMudi5zcGxpY2UoYltjXSwxLGFbY10pfSxkZWwkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5kZWwkaW5kZXgoYSk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3Qge3N0YXJ0OmIsc3RvcDpjLHN0ZXA6bH09YS5zbGljZSRpbmRpY2VzKHRoaXMudi5sZW5ndGgpOzE9PT1sP3RoaXMuZGVsJHNsaWNlKGIsYyk6dGhpcy5kZWwkZXh0X3NsaWNlKGEsMDxsPzE6MCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO30sZGVsJGluZGV4KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudi5zcGxpY2UoYSwxKX0sZGVsJHNsaWNlKGEsYyl7dGhpcy52LnNwbGljZShhLGMtYSl9LGRlbCRleHRfc2xpY2UoYSxjKXtsZXQgYj0wO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57dGhpcy52LnNwbGljZShhLWIsMSk7Yis9Y30pfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RcIixTay5idWlsdGluLmxpc3QpO1NrLmJ1aWx0aW4ubGlzdC5weTIkbWV0aG9kcz17c29ydDp7JG5hbWU6XCJzb3J0XCIsJG1ldGgoYSxjKXtjb25zdCBbYixlLGhdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQoYixlLGgpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgY21wPU5vbmUsIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifX07dmFyIGE9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibGlzdF9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD1cbmEudi5sZW5ndGgtMTt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dO2lmKHZvaWQgMD09PWEpdGhpcy50cCRpdGVybmV4dD0oKT0+e307ZWxzZSByZXR1cm4gYX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEsYSl7ZnVuY3Rpb24gYyhhKXt2YXIgYj1hLnJlcGxhY2UoRixcIlwiKS5yZXBsYWNlKE0sXCJfXCIpLnRvTG93ZXJDYXNlKCk7Yj1FW2JdO3JldHVybiB2b2lkIDA9PT1iP2E6Yn1mdW5jdGlvbiBiKGEsYixjKXtpZih2b2lkIDA9PT1iKWI9XCJ1dGYtOFwiO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSliPWIuJGpzc3RyKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IFwiKyhcImJ5dGVzc3RyXCIuaW5jbHVkZXMoYSk/XG4yOjEpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7aWYodm9pZCAwPT09YyljPVwic3RyaWN0XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKWM9Yy4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT8zOjIpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7cmV0dXJue2VuY29kaW5nOmIsZXJyb3JzOmN9fWZ1bmN0aW9uIGUoYSxiLGQpe2E9YS4kanNzdHIoKTtiPWMoYik7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWIpe2I9W107Zm9yKGUgaW4gYSl7Y29uc3QgYz1hLmNoYXJDb2RlQXQoZSk7XG5pZigxMjc8Yyl7aWYoXCJzdHJpY3RcIj09PWQpdGhyb3cgZD1mKGMpLG5ldyBTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciAnXCIrZCtcIicgaW4gcG9zaXRpb24gXCIrZStcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJmIucHVzaCg2Myl9ZWxzZSBiLnB1c2goYyl9dmFyIGU9bmV3IFVpbnQ4QXJyYXkoYil9ZWxzZSBpZihcInV0Zi04XCI9PT1iKWU9Vi5lbmNvZGUoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5Mb29rdXBFcnJvcihcInVua25vd24gZW5jb2Rpbmc6IFwiK2IpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhlKX1mdW5jdGlvbiBmKGEpe3ZhciBiPTI2NT49YT9cIlxcXFx4XCI6XCJcXFxcdVwiO2E9YS50b1N0cmluZygxNik7Mz09PWEubGVuZ3RoJiYoYT1hLnNsaWNlKDEsMykpO3JldHVybiBhPTE9PT1hLmxlbmd0aD9iK1wiMFwiK2E6YithfWZ1bmN0aW9uIGwoYSxkKXsoe2VuY29kaW5nOmEsXG5lcnJvcnM6ZH09YihcImRlY29kZVwiLGEsZCkpO2E9YyhhKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09YSl7YT10aGlzLnY7dmFyIGU9XCJcIjtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrKyl7Y29uc3QgYz1hW2JdO2lmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYy50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrYitcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTMzKSl9ZWxzZSBlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfWE9ZX1lbHNlIGlmKFwidXRmLThcIj09PVxuYSlhOmlmKGE9dGhpcy52LGU9ZCxkPXkuZGVjb2RlKGEpLFwicmVwbGFjZVwiPT09ZSlhPWQ7ZWxzZXtpZihcInN0cmljdFwiPT09ZSl7ZT1kLmluZGV4T2YoXCJcXHVmZmZkXCIpO2lmKC0xPT09ZSl7YT1kO2JyZWFrIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ3V0Zi04JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2FbZV0udG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2UrXCI6IGludmFsaWQgc3RhcnQgYnl0ZVwiKTt9YT1kLnJlcGxhY2UoL1xcdWZmZmQvZyxcIlwiKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXG5cIiBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxkLGUpKTtpZihlPGQpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc3ViYXJyYXkoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksZT1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWEudHAkaXRlcm5leHQoKSlpZihlPXRoaXMuZ2V0JHJhdyhlKSxiKGQsZSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gYihkLGMudik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtiPXRoaXMuZ2V0JHRndChiKTtcbih7c3RhcnQ6YyxlbmQ6ZH09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGQpKTtyZXR1cm4gZDxjPy0xOlwibnVtYmVyXCI9PT10eXBlb2YgYj8oYj1hP3RoaXMudi5sYXN0SW5kZXhPZihiLGQtMSk6dGhpcy52LmluZGV4T2YoYixjKSxiPj1jJiZiPGQ/YjotMSk6YT90aGlzLmZpbmQkc3VicmlnaHQoYixjLGQpOnRoaXMuZmluZCRzdWJsZWZ0KGIsYyxkKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCRyYXcoYik7bGV0IGM7aWYoYSl7aWYoYz10aGlzLmZpbmQkc3VicmlnaHQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmJ5dGVzLG5ldyBTay5idWlsdGluLmJ5dGVzLHRoaXNdKX1lbHNlIGlmKGM9dGhpcy5maW5kJHN1YmxlZnQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsXG5uZXcgU2suYnVpbHRpbi5ieXRlc10pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KDAsYykpLG5ldyBTay5idWlsdGluLmJ5dGVzKGIpLG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjK2IubGVuZ3RoKSldKX19ZnVuY3Rpb24gbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD12b2lkIDA9PT1jfHxjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP25ldyBVaW50OEFycmF5KFs5LDEwLDExLDEyLDEzLDMyLDEzM10pOnRoaXMuZ2V0JHJhdyhjKTtjPTA7dmFyIGU9dGhpcy52Lmxlbmd0aDtpZihhKWZvcig7YzxlJiZkLmluY2x1ZGVzKHRoaXMudltjXSk7KWMrKztpZihiKWZvcig7ZT5jJiZkLmluY2x1ZGVzKHRoaXMudltlLTFdKTspZS0tO2Q9bmV3IFVpbnQ4QXJyYXkoZS1jKTtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV09dGhpcy52W2UrY107cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfX1cbmZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe2lmKHZvaWQgMD09PWUpZT0zMjtlbHNlIGlmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzJiYxPT1lLnYubGVuZ3RoKWU9ZS52WzBdO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBieXRlIHN0cmluZyBvZiBsZW5ndGggMSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtjb25zdCBmPXRoaXMudi5sZW5ndGg7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGQ8PWYpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgZz1uZXcgVWludDhBcnJheShkKTtsZXQgayxoO2M/KGs9TWF0aC5mbG9vcigoZC1mKS8yKSxoPShkLWYpJTI/aysxOmspOmI/KGs9ZC1mLGg9MCk6KGs9MCxoPWQtZik7Zy5maWxsKGUsMCxrKTtmb3IobGV0IGE9MDthPGY7YSsrKWdbYStrXT10aGlzLnZbYV07XG5nLmZpbGwoZSxkLWgpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhnKX19ZnVuY3Rpb24gcChhKXtyZXR1cm4gOTw9YSYmMTM+PWF8fDMyPT09YX1mdW5jdGlvbiB1KGEpe3JldHVybiA5Nzw9YSYmMTIyPj1hfWZ1bmN0aW9uIEEoYSl7cmV0dXJuIDY1PD1hJiY5MD49YX1mdW5jdGlvbiB0KGEpe3JldHVybiA0ODw9YSYmNTc+PWF9ZnVuY3Rpb24gdihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy52Lmxlbmd0aD9iP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkOnRoaXMudi5ldmVyeShiPT5hKGIpKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gQihhLGIpe3JldHVybiBmdW5jdGlvbigpe2xldCBjPSExO2ZvcihsZXQgZD0wO2Q8dGhpcy52Lmxlbmd0aDtkKyspe2lmKGIodGhpcy52W2RdKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDshYyYmYSh0aGlzLnZbZF0pJiZcbihjPSEwKX1yZXR1cm4gYz9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gRChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgpO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT1hKHRoaXMudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfX1hKDMwKTtjb25zdCBFPXt1dGY6XCJ1dGYtOFwiLHV0Zjg6XCJ1dGYtOFwiLHV0Zl84OlwidXRmLThcIixhc2NpaTpcImFzY2lpXCJ9O3ZhciBGPS9cXHMrL2csTT0vW18tXSsvZztjb25zdCBWPW5ldyBUZXh0RW5jb2Rlcix5PW5ldyBUZXh0RGVjb2RlcjtTay5idWlsdGluLmJ5dGVzPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJieXRlc1wiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYnl0ZXMgaXMgYSBjb25zdHJ1Y3RvciB1c2UgJ25ldydcIik7XG5pZih2b2lkIDA9PT1hKXRoaXMudj1uZXcgVWludDhBcnJheTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudj1hO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlTay5hc3NlcnRzLmFzc2VydChhLmV2ZXJ5KGE9PjA8PWEmJjI1NT49YSksXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBieXRlcyB3aXRoIGFycmF5XCIpLHRoaXMudj1uZXcgVWludDhBcnJheShhKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl7bGV0IGI7Y29uc3QgYz1uZXcgVWludDhBcnJheShhLmxlbmd0aCksZD1hLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtiPWEuY2hhckNvZGVBdChlKTtpZigyNTU8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCJpbnZhbGlkIHN0cmluZyBhdCBpbmRleCBcIitlK1wiIChwb3NzaWJseSBjb250YWlucyBhIHVuaWNvZGUgY2hhcmFjdGVyKVwiKTtjW2VdPWJ9dGhpcy52PWN9ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PVxubmV3IFVpbnQ4QXJyYXkoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgYXJndW1lbnQgdG8gYnl0ZXMgY29uc3RydWN0b3JcIik7fSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiYnl0ZXMoaXRlcmFibGVfb2ZfaW50cykgLT4gYnl0ZXNcXG5ieXRlcyhzdHJpbmcsIGVuY29kaW5nWywgZXJyb3JzXSkgLT4gYnl0ZXNcXG5ieXRlcyhieXRlc19vcl9idWZmZXIpIC0+IGltbXV0YWJsZSBjb3B5IG9mIGJ5dGVzX29yX2J1ZmZlclxcbmJ5dGVzKGludCkgLT4gYnl0ZXMgb2JqZWN0IG9mIHNpemUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBpbml0aWFsaXplZCB3aXRoIG51bGwgYnl0ZXNcXG5ieXRlcygpIC0+IGVtcHR5IGJ5dGVzIG9iamVjdFxcblxcbkNvbnN0cnVjdCBhbiBpbW11dGFibGUgYXJyYXkgb2YgYnl0ZXMgZnJvbTpcXG4gIC0gYW4gaXRlcmFibGUgeWllbGRpbmcgaW50ZWdlcnMgaW4gcmFuZ2UoMjU2KVxcbiAgLSBhIHRleHQgc3RyaW5nIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZ1xcbiAgLSBhbnkgb2JqZWN0IGltcGxlbWVudGluZyB0aGUgYnVmZmVyIEFQSS5cXG4gIC0gYW4gaW50ZWdlclwiLFxudHAkbmV3KGEsYyl7aWYodGhpcyE9PVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGMpO2M9Y3x8W107aWYoMT49YS5sZW5ndGgmJjA9PT0rYy5sZW5ndGgpYT1hWzBdO2Vsc2V7W2EsZCxjXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImJ5dGVzXCIsW251bGwsXCJweVNvdXJjZVwiLFwiZXJyb3JzXCJdLGEsYyk7KHtlbmNvZGluZzpkLGVycm9yczpjfT1iKFwiYnl0ZXNcIixkLGMpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJlbmNvZGluZyBvciBlcnJvcnMgd2l0aG91dCBhIHN0cmluZyBhcmd1bWVudFwiKTtyZXR1cm4gZShhLGQsYyl9aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXM7aWYodm9pZCAwIT09KGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxcbltdKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxhPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2J5dGVzX18gcmV0dXJuZWQgbm9uLWJ5dGVzICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiKVwiKTtyZXR1cm4gYX0pfWlmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2Q9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIGNvdW50XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhkKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGEudik7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgYXJndW1lbnQgd2l0aG91dCBhbiBlbmNvZGluZ1wiKTtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpe2xldCBiPVxuW107ZD1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO2lmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtiLnB1c2goYSl9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYikpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0ICdcIitTay5hYnN0ci50eXBlTmFtZShkKStcIicgb2JqZWN0IGludG8gYnl0ZXNcIik7fSwkcigpe2xldCBhLGI9XCInXCI7Y29uc3QgYz0tMSE9PXRoaXMudi5pbmRleE9mKDM0KTtsZXQgZD1cIlwiO2ZvcihsZXQgZT0wO2U8dGhpcy52Lmxlbmd0aDtlKyspaWYoYT10aGlzLnZbZV0sOT5hfHwxMDxhJiYxMz5hfHwxMzxhJiYzMj5hfHwxMjY8YSlkKz1mKGEpO2Vsc2UgaWYoOT09PWF8fDEwPT09YXx8MTM9PT1hfHwzOT09PVxuYXx8OTI9PT1hKXN3aXRjaChhKXtjYXNlIDk6ZCs9XCJcXFxcdFwiO2JyZWFrO2Nhc2UgMTA6ZCs9XCJcXFxcblwiO2JyZWFrO2Nhc2UgMTM6ZCs9XCJcXFxcclwiO2JyZWFrO2Nhc2UgMzk6Yz9kKz1cIlxcXFwnXCI6KGQrPVwiJ1wiLGI9J1wiJyk7YnJlYWs7Y2FzZSA5MjpkKz1cIlxcXFxcXFxcXCJ9ZWxzZSBkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJiXCIrYitkK2IpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBHKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKHRoaXM9PT1hJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGIpKXJldHVybiEwO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBjPXRoaXMudjthPWEudjtpZihjLmxlbmd0aCE9PWEubGVuZ3RoJiYoXCJFcVwiPT09Ynx8XCJOb3RFcVwiPT09YikpcmV0dXJuXCJFcVwiPT09XG5iPyExOiEwO2xldCBkO2NvbnN0IGU9TWF0aC5taW4oYy5sZW5ndGgsYS5sZW5ndGgpO2ZvcihkPTA7ZDxlJiZjW2RdPT09YVtkXTtkKyspO3N3aXRjaChiKXtjYXNlIFwiTHRcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPGEubGVuZ3RofHxjW2RdPGFbZF07Y2FzZSBcIkx0RVwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8PWEubGVuZ3RofHxjW2RdPD1hW2RdO2Nhc2UgXCJFcVwiOnJldHVybiBkPT09ZTtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZDxlO2Nhc2UgXCJHdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg+YS5sZW5ndGh8fGNbZF0+YVtkXTtjYXNlIFwiR3RFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD49YS5sZW5ndGh8fGNbZF0+PWFbZF19fSx0cCRoYXNoKCl7cmV0dXJuKG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRqc3N0cigpKSkudHAkaGFzaCgpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXtsZXQgYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxcblNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7aWYodm9pZCAwIT09Yil7MD5iJiYoYj10aGlzLnYubGVuZ3RoK2IpO2lmKDA+Ynx8Yj49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwiaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudltiXSl9fWVsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYnl0ZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb25jYXQgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIiB0byBieXRlc1wiKTtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgrYS52Lmxlbmd0aCk7bGV0IGM7Zm9yKGM9MDtjPHRoaXMudi5sZW5ndGg7YysrKWJbY109dGhpcy52W2NdO2ZvcihsZXQgZD0wO2Q8YS52Lmxlbmd0aDtkKyssYysrKWJbY109YS52W2RdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhiKX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBiPWEqdGhpcy52Lmxlbmd0aDtpZihiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7aWYoMD49XG5hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlczthPW5ldyBVaW50OEFycmF5KGIpO2xldCBjPTA7Zm9yKDtjPGI7KWZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYVtjKytdPXRoaXMudltiXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYSl9LHNxJGNvbnRhaW5zKGEpe3JldHVybi0xIT09dGhpcy5maW5kJGxlZnQoYSl9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLm5iJHJlbWFpbmRlcn0scHJvdG86eyRqc3N0cigpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMudltiXSk7cmV0dXJuIGF9LGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpcmV0dXJuIGEudjthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJhcmd1bWVudCBzaG91bGQgYmUgaW50ZWdlciBvciBieXRlcy1saWtlIG9iamVjdCwgbm90IHt0cCRuYW1lfVwiKTtcbmlmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtyZXR1cm4gYX0sZ2V0JHJhdyhhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgYnl0ZXMtbGlrZSBvYmplY3QgaXMgcmVxdWlyZWQsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sZ2V0JHNwbGl0QXJnczpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtiPTA+Yj9JbmZpbml0eTpiO2E9U2suYnVpbHRpbi5jaGVja05vbmUoYSk/bnVsbDp0aGlzLmdldCRyYXcoYSk7aWYobnVsbCE9PWEmJiFhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO3JldHVybntzZXA6YSxtYXhzcGxpdDpifX0sZmluZCRsZWZ0OmQoITEpLFxuZmluZCRyaWdodDpkKCEwKSxmaW5kJHN1YmxlZnQ6ZnVuY3Rpb24oYSxiLGMpe2M9Yy1hLmxlbmd0aCsxO2xldCBkPWI7Zm9yKDtkPGM7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QrK31yZXR1cm4tMX0sZmluZCRzdWJyaWdodChhLGIsYyl7bGV0IGQ9Yy1hLmxlbmd0aDtmb3IoO2Q+PWI7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QtLX1yZXR1cm4tMX0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2Mudj1hLnY7cmV0dXJuIGN9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdO3RoaXMudi5mb3JFYWNoKGI9PnthLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhiKSl9KTtyZXR1cm4gYX19LGZsYWdzOntzdHIkZW5jb2RlOmUsJGRlY29kZTpsLGNoZWNrJGVuY29kZUFyZ3M6Yn0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudikpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH0sY2FwaXRhbGl6ZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGg7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz10aGlzLnZbMF07YlswXT11KGMpP2MtMzI6Yztmb3IobGV0IGQ9MTtkPGE7ZCsrKWM9dGhpcy52W2RdLGJbZF09QShjKT9jKzMyOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jYXBpdGFsaXplKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkIChBU0NJSSlcXG5hbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuXCJ9LGNlbnRlcjp7JG1ldGg6ayhcImNlbnRlclwiLCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcXG5kb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aChhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsYykpO2xldCBkPTA7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWZvcig7YjxjO2IrKyl0aGlzLnZbYl09PT1hJiZkKys7ZWxzZXtjPWMtYS5sZW5ndGgrMTtmb3IobGV0IGU9YjtlPGM7ZSsrKWEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZStiXSkmJihkKyssZSs9YS5sZW5ndGgtMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cXG5ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcXG5hcyBpbiBzbGljZSBub3RhdGlvbi5cIn0sXG5kZWNvZGU6eyRtZXRoOmwsJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRGVjb2RlIHRoZSBieXRlcyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2Rpbmcgd2l0aCB3aGljaCB0byBkZWNvZGUgdGhlIGJ5dGVzLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciB0aGUgaGFuZGxpbmcgb2YgZGVjb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZURlY29kZUVycm9yLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZSdcXG4gICAgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXRcXG4gICAgY2FuIGhhbmRsZSBVbmljb2RlRGVjb2RlRXJyb3JzLlwifSxcbmVuZHN3aXRoOnskbWV0aDpoKFwiZW5kc3dpdGhcIiwoYSxiKT0+e2NvbnN0IGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmIuZXZlcnkoKGIsZCk9PmI9PT1hW2MrZF0pfSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sZXhwYW5kdGFiczp7JG1ldGgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIChnb3QgdHlwZSB7dHAkbmFtfSlcIik7XG5jb25zdCBiPVtdO2xldCBjPTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy52W2VdOzk9PT1kPyhkPWEtYyVhLGIucHVzaCguLi5BcnJheShkKS5maWxsKDMyKSksYys9ZCk6MTA9PT1kfHwxMz09PWQ/KGIucHVzaChkKSxjPTApOihiLnB1c2goZCksYysrKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxcbmIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0saGV4OnskbWV0aCgpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz10aGlzLnZbYl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsXCIwXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmhleCgpIC0+IHN0cmluZ1xcblxcbkNyZWF0ZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZyb20gYSBieXRlcyBvYmplY3QuXFxuRXhhbXBsZTogYidcXFxceGI5XFxcXHgwMVxcXFx4ZWYnLmhleCgpIC0+ICdiOTAxZWYnLlwifSxcbmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxpc2FsbnVtOnskbWV0aDp2KGE9PnQoYSl8fFxudShhKXx8QShhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhbG51bSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBhbHBoYW51bWVyaWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYWxwaGE6eyRtZXRoOnYoYT0+NjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FscGhhKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhYmV0aWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYXNjaWk6eyRtZXRoOnYoYT0+MDw9YSYmMTI3Pj1hLCEwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FzY2lpKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgaXMgZW1wdHkgb3IgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgQVNDSUksXFxuRmFsc2Ugb3RoZXJ3aXNlLlwifSxcbmlzZGlnaXQ6eyRtZXRoOnYodCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNkaWdpdCgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBkaWdpdHNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzbG93ZXI6eyRtZXRoOkIodSxBKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2xvd2VyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNzcGFjZTp7JG1ldGg6dihwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3NwYWNlKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIHdoaXRlc3BhY2VcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtsZXQgYT0hMSxiPSExO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspe2NvbnN0IGQ9dGhpcy52W2NdO2lmKEEoZCkpe2lmKGEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj1hPSEwfWVsc2UgaWYodShkKSl7aWYoIWEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGE9ITF9cmV0dXJuIGI/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdGl0bGUoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmVcXG5jaGFyYWN0ZXIgaW4gQiwgaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seSBmb2xsb3cgdW5jYXNlZFxcbmNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy4gUmV0dXJuIEZhbHNlXFxub3RoZXJ3aXNlLlwifSxcbmlzdXBwZXI6eyRtZXRoOkIoQSx1KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3VwcGVyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIHVwcGVyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sam9pbjp7JG1ldGgoYSl7Y29uc3QgYj1bXTtsZXQgYz0wO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYytcIjogZXhwZWN0ZWQgYSBieXRlcy1saWtlIG9iamVjdCwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7YysrO2IubGVuZ3RoJiZiLnB1c2goLi4udGhpcy52KTtiLnB1c2goLi4uYS52KX0pLFxuKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGVfb2ZfYnl0ZXMsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2YgYnl0ZXMgb2JqZWN0cy5cXG5cXG5UaGUgYnl0ZXMgd2hvc2UgbWV0aG9kIGlzIGNhbGxlZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGVhY2ggcGFpci5cXG5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IGJ5dGVzIG9iamVjdC5cXG5cXG5FeGFtcGxlOiBiJy4nLmpvaW4oW2InYWInLCBiJ3BxJywgYidycyddKSAtPiBiJ2FiLnBxLnJzJy5cIn0sbGp1c3Q6eyRtZXRoOmsoXCJsanVzdFwiLCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGg6RChhPT5BKGEpP2ErMzI6YSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubG93ZXIoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBhbGwgQVNDSUkgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOm4oITAsITEpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCBsZWFkaW5nICBBU0NJSSB3aGl0ZXNwYWNlLlwifSxwYXJ0aXRpb246eyRtZXRoOmcoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMuIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlc1xcbm9iamVjdCBhbmQgdHdvIGVtcHR5IGJ5dGVzIG9iamVjdHMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYSxiLGMpe2E9dGhpcy5nZXQkcmF3KGEpO2I9dGhpcy5nZXQkcmF3KGIpO2M9dm9pZCAwPT09Yz8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2M9MD5jP0luZmluaXR5OmM7Y29uc3QgZD1bXTtsZXQgZT0wO2Zvcih2YXIgZj0wO2Y8dGhpcy52Lmxlbmd0aCYmZTxjOyl7Y29uc3QgYz10aGlzLmZpbmQkc3VibGVmdChhLGYsdGhpcy52Lmxlbmd0aCk7aWYoLTE9PT1jKWJyZWFrO2Zvcig7ZjxjO2YrKylkLnB1c2godGhpcy52W2ZdKTtkLnB1c2goLi4uYik7Zj1jK2EubGVuZ3RoO2UrK31mb3IoZjtmPHRoaXMudi5sZW5ndGg7ZisrKWQucHVzaCh0aGlzLnZbZl0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShkKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5yZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxyanVzdDp7JG1ldGg6ayhcInJqdXN0XCIsITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKVwifSxcbnJwYXJ0aXRpb246eyRtZXRoOmcoITApLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMsIHN0YXJ0aW5nIGF0IHRoZSBlbmQuIElmXFxudGhlIHNlcGFyYXRvciBpcyBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlXFxuc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBieXRlc1xcbm9iamVjdHMgYW5kIHRoZSBvcmlnaW5hbCBieXRlcyBvYmplY3QuXCJ9LHJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe3NlcDphLFxubWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W107bGV0IGQ9MCxlPXRoaXMudi5sZW5ndGg7aWYobnVsbCE9PWEpe2Zvcig7MDw9ZSYmZDxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VicmlnaHQoYSwwLGUpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGIrYS5sZW5ndGgsZSkpKTtlPWI7ZCsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxlKSkpfWVsc2V7Zm9yKGUtLTtkPGI7KXtmb3IoO3AodGhpcy52W2VdKTspZS0tO2lmKDA+ZSlicmVhazthPWUrMTtmb3IoZS0tOzA8PWUmJiFwKHRoaXMudltlXSk7KWUtLTtjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGUrMSxhKSkpO2QrK31pZigwPD1lKXtmb3IoO3AodGhpcy52W2VdKTspZS0tOzA8PWUmJmMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxcbmUrMSkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYy5yZXZlcnNlKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHRpbmcgaXMgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBieXRlcyBhbmQgd29ya2luZyB0byB0aGUgZnJvbnQuXCJ9LFxucnN0cmlwOnskbWV0aDpuKCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsbWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W10sZD10aGlzLnYubGVuZ3RoO2xldCBlPTAsZj0wO2lmKG51bGwhPT1hKXtmb3IoO2Y8ZCYmZTxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VibGVmdChhLGYsZCk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZixiKSkpO2Y9YithLmxlbmd0aDtlKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLFxuZCkpKX1lbHNle2Zvcig7ZTxiOyl7Zm9yKDtwKHRoaXMudltmXSk7KWYrKztpZihmPT09ZClicmVhazthPWY7Zm9yKGYrKztmPGQmJiFwKHRoaXMudltmXSk7KWYrKztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGEsZikpKTtlKyt9aWYoZjxkKXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2Y8ZCYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGQpKSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cIn0sXG5zcGxpdGxpbmVzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPVtdO2xldCBjPTA7bGV0IGQ9MDtjb25zdCBlPXRoaXMudi5sZW5ndGg7Zm9yKDtkPGU7KXt2YXIgZj10aGlzLnZbZF07aWYoMTM9PT1mKXtjb25zdCBlPTEwPT09dGhpcy52W2QrMV07Zj1hP2U/ZCsyOmQrMTpkO2IucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpO2Q9Yz1lP2QrMjpkKzF9ZWxzZSAxMD09PWY/KGY9YT9kKzE6ZCxiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZikpKSxkPWM9ZCsxKTpkKyt9YzxlJiZiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wia2VlcGVuZHNcIl0sRGVmYXVsdHM6WyExXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGtlZXBlbmRzPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgYnl0ZXMsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdGFydHN3aXRoOnskbWV0aDpoKFwic3RhcnRzd2l0aFwiLChhLGIpPT5iLmxlbmd0aDw9YS5sZW5ndGgmJmIuZXZlcnkoKGIsYyk9PmI9PT1hW2NdKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuXCJ9LHN0cmlwOnskbWV0aDpuKCEwLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LFxuc3dhcGNhc2U6eyRtZXRoOkQoYT0+QShhKT9hKzMyOnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zd2FwY2FzZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZFxcbnRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS5cIn0sdGl0bGU6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDxhO2QrKyl7Y29uc3QgYT10aGlzLnZbZF07QShhKT8oYltkXT1jP2ErMzI6YSxjPSEwKTp1KGEpPyhiW2RdPWM/YTphLTMyLGM9ITApOihiW2RdPWEsYz0hMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi50aXRsZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiBCLCBpLmUuIEFTQ0lJIHdvcmRzIHN0YXJ0IHdpdGggdXBwZXJjYXNlXFxuY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aDpEKGE9PnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi51cHBlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXCJ9LHpmaWxsOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7Y29uc3QgYj1hLXRoaXMudi5sZW5ndGg7aWYoMD49YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEpO2xldCBkPTAsZTtpZig0Mz09PXRoaXMudlswXXx8NDU9PT10aGlzLnZbMF0pY1swXT10aGlzLnZbMF0sZCsrO2MuZmlsbCg0OCxkLGQrYik7ZT1kO2ZvcihkKz1iO2Q8YTtkKyssZSsrKWNbZF09dGhpcy52W2VdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXFxuXFxuUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcXG5vZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9fSxjbGFzc21ldGhvZHM6e2Zyb21oZXg6eyRtZXRoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7Zm9yKGxldCBjPWY7YzxiO2MrPTIpe2xldCBiPWEuc3Vic3RyKGMsMik7aWYoIWQudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiBmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uIFwiKyhjKzEpKTtlLnB1c2gocGFyc2VJbnQoYiwxNikpfX1pZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmcm9taGV4KCkgYXJndW1lbnQgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7XG5hPWEuJGpzc3RyKCk7Y29uc3QgYz0vXFxzKy9nLGQ9L15bYWJjZGVmQUJDREVGMDEyMzQ1Njc4OV17Mn0kLyxlPVtdO2xldCBmPTAsZztmb3IoO251bGwhPT0oZz1jLmV4ZWMoYSkpOyliKGcuaW5kZXgpLGY9Yy5sYXN0SW5kZXg7YihhLmxlbmd0aCk7cmV0dXJuIG5ldyB0aGlzKGUpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHR5cGUsIHN0cmluZywgLylcIiwkZG9jOlwiQ3JlYXRlIGEgYnl0ZXMgb2JqZWN0IGZyb20gYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgbnVtYmVycy5cXG5cXG5TcGFjZXMgYmV0d2VlbiB0d28gbnVtYmVycyBhcmUgYWNjZXB0ZWQuXFxuRXhhbXBsZTogYnl0ZXMuZnJvbWhleCgnQjkgMDFFRicpIC0+IGInXFxcXFxcXFx4YjlcXFxcXFxcXHgwMVxcXFxcXFxceGVmJy5cIn19fSk7dmFyIEc9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiYnl0ZXNfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9XG50aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ieXRlc1wiLFNrLmJ1aWx0aW4uYnl0ZXMpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMoKXt9dmFyIGw9U3RyaW5nLmZyb21DaGFyQ29kZSxoPXt9LnRvU3RyaW5nLGQ9aC5jYWxsKGEuU2hhcmVkQXJyYXlCdWZmZXIpLGc9aCgpLG49YS5VaW50OEFycmF5LGs9bnx8QXJyYXkscD1uP0FycmF5QnVmZmVyOmssdT1wLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwibGVuZ3RoXCJpbiBhfSxBPWguY2FsbChwLnByb3RvdHlwZSk7cD1jLnByb3RvdHlwZTtcbnZhciB0PWEuVGV4dEVuY29kZXIsbT1uZXcgKG4/VWludDE2QXJyYXk6aykoMzIpO2IucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihhKXtpZighdShhKSl7dmFyIGI9aC5jYWxsKGEpO2lmKGIhPT1BJiZiIT09ZCYmYiE9PWcpdGhyb3cgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlY29kZScgb24gJ1RleHREZWNvZGVyJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7YT1uP25ldyBrKGEpOmF8fFtdfWZvcih2YXIgYz1iPVwiXCIsZT0wLGY9YS5sZW5ndGh8MCxwPWYtMzJ8MCxCLHQsdj0wLHE9MCxQLFE9MCxVPS0xO2U8Zjspe2ZvcihCPWU8PXA/MzI6Zi1lfDA7UTxCO2U9ZSsxfDAsUT1RKzF8MCl7dD1hW2VdJjI1NTtzd2l0Y2godD4+NCl7Y2FzZSAxNTpQPWFbZT1lKzF8MF0mMjU1O2lmKDIhPT1QPj42fHwyNDc8dCl7ZT1lLTF8MDticmVha312PSh0JjcpPDw2fFAmNjM7cT01O3Q9MjU2O2Nhc2UgMTQ6UD1cbmFbZT1lKzF8MF0mMjU1LHY8PD02LHZ8PSh0JjE1KTw8NnxQJjYzLHE9Mj09PVA+PjY/cSs0fDA6MjQsdD10KzI1NiY3Njg7Y2FzZSAxMzpjYXNlIDEyOlA9YVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMzEpPDw2fFAmNjMscT1xKzd8MCxlPGYmJjI9PT1QPj42JiZ2Pj5xJiYxMTE0MTEyPnY/KHQ9dix2PXYtNjU1MzZ8MCwwPD12JiYoVT0odj4+MTApKzU1Mjk2fDAsdD0odiYxMDIzKSs1NjMyMHwwLDMxPlE/KG1bUV09VSxRPVErMXwwLFU9LTEpOihQPVUsVT10LHQ9UCkpKToodD4+PTgsZT1lLXQtMXwwLHQ9NjU1MzMpLHY9cT0wLEI9ZTw9cD8zMjpmLWV8MDtkZWZhdWx0Om1bUV09dDtjb250aW51ZTtjYXNlIDExOmNhc2UgMTA6Y2FzZSA5OmNhc2UgODp9bVtRXT02NTUzM31jKz1sKG1bMF0sbVsxXSxtWzJdLG1bM10sbVs0XSxtWzVdLG1bNl0sbVs3XSxtWzhdLG1bOV0sbVsxMF0sbVsxMV0sbVsxMl0sbVsxM10sbVsxNF0sbVsxNV0sbVsxNl0sbVsxN10sbVsxOF0sbVsxOV0sbVsyMF0sXG5tWzIxXSxtWzIyXSxtWzIzXSxtWzI0XSxtWzI1XSxtWzI2XSxtWzI3XSxtWzI4XSxtWzI5XSxtWzMwXSxtWzMxXSk7MzI+USYmKGM9Yy5zbGljZSgwLFEtMzJ8MCkpO2lmKGU8Zil7aWYobVswXT1VLFE9flU+Pj4zMSxVPS0xLGMubGVuZ3RoPGIubGVuZ3RoKWNvbnRpbnVlfWVsc2UtMSE9PVUmJihjKz1sKFUpKTtiKz1jO2M9XCJcIn1yZXR1cm4gYn07cC5lbmNvZGU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP1wiXCI6XCJcIithO3ZhciBiPWEubGVuZ3RofDAsYz1uZXcgaygoYjw8MSkrOHwwKSxkLGU9MCxmPSFuO2ZvcihkPTA7ZDxiO2Q9ZCsxfDAsZT1lKzF8MCl7dmFyIGc9YS5jaGFyQ29kZUF0KGQpfDA7aWYoMTI3Pj1nKWNbZV09ZztlbHNle2lmKDIwNDc+PWcpY1tlXT0xOTJ8Zz4+NjtlbHNle2E6e2lmKDU1Mjk2PD1nKWlmKDU2MzE5Pj1nKXt2YXIgaD1hLmNoYXJDb2RlQXQoZD1kKzF8MCl8MDtpZig1NjMyMDw9aCYmNTczNDM+PWgpe2c9KGc8PDEwKStoLTU2NjEzODg4fDA7aWYoNjU1MzU8XG5nKXtjW2VdPTI0MHxnPj4xODtjW2U9ZSsxfDBdPTEyOHxnPj4xMiY2MztjW2U9ZSsxfDBdPTEyOHxnPj42JjYzO2NbZT1lKzF8MF09MTI4fGcmNjM7Y29udGludWV9YnJlYWsgYX1nPTY1NTMzfWVsc2UgNTczNDM+PWcmJihnPTY1NTMzKTshZiYmZDw8MTxlJiZkPDwxPChlLTd8MCkmJihmPSEwLGg9bmV3IGsoMypiKSxoLnNldChjKSxjPWgpfWNbZV09MjI0fGc+PjEyO2NbZT1lKzF8MF09MTI4fGc+PjYmNjN9Y1tlPWUrMXwwXT0xMjh8ZyY2M319cmV0dXJuIG4/Yy5zdWJhcnJheSgwLGUpOmMuc2xpY2UoMCxlKX07dHx8KGEuVGV4dERlY29kZXI9YixhLlRleHRFbmNvZGVyPWMpfSkoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGE/XCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/dGhpczpzZWxmOmEpfSkuY2FsbCh0aGlzLGEoMCkpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udHVwbGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInR1cGxlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PVxuYT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSxcImJhZCBjYWxsIHRvIHR1cGxlLCB1c2UgJ25ldycgd2l0aCBhbiBBcnJheSBvZiBweXRob24gb2JqZWN0c1wiKTt0aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcIkJ1aWx0LWluIGltbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYW4gZW1wdHkgdHVwbGUuXFxuSWYgaXRlcmFibGUgaXMgc3BlY2lmaWVkIHRoZSB0dXBsZSBpcyBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LlwiLFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT10aGlzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTthPWEuam9pbihcIiwgXCIpOzE9PT10aGlzLnYubGVuZ3RoJiYoYSs9XCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIoXCIrYStcIilcIil9LHRwJG5ldyhhLGIpe2lmKHRoaXMhPT1Tay5idWlsdGluLnR1cGxlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwidHVwbGVcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJ0dXBsZVwiLGEsMCwxKTthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4udHVwbGUoW10pOmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlP2E6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSxcbiEwKSxhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSl9LHRwJGhhc2goKXtsZXQgYSxiPTM0MzAwMDgsZT0xMDAwMDAzO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGM9MDtjPGY7KytjKXthPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy52W2NdKTtpZigtMT09PWEpcmV0dXJuLTE7Yj0oYl5hKSplO2UrPTgyNTIwK2YrZn1iKz05NzUzMTstMT09PWImJihiPS0yKTtyZXR1cm4gYnwwfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInR1cGxlIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy52W2FdfWlmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigxPT09YSYmdGhpcy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIHRoaXM7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJykgdG8gdHVwbGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9fSxwcm90bzp7JHN1YnR5cGVfbmV3KGEsYil7Yj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlLnRwJG5ldyhhKTtiLnY9YS52O3JldHVybiBifSxzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LG1ldGhvZHM6e19fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnYuc2xpY2UoMCkpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOm51bGx9LGluZGV4OnskbWV0aChhLGIsZSl7aWYodm9pZCAwIT09YiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYil8fHZvaWQgMCE9PWUmJiFTay5taXNjZXZhbC5pc0luZGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7KHtzdGFydDpiLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsZSkpO2NvbnN0IGM9dGhpcy52O2Zvcig7YjxlO2IrKylpZihjW2JdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbYl0sYSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0dXBsZS5pbmRleCh4KTogeCBub3QgaW4gdHVwbGVcIik7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnYubGVuZ3RoLGM9dGhpcy52O2xldCBmPTA7Zm9yKGxldCBlPTA7ZTxiOysrZSlpZihjW2VdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbZV0sYSxcIkVxXCIpKWYrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udHVwbGVcIixTay5idWlsdGluLnR1cGxlKTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ0dXBsZV9pdGVyYXRvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEuc2skYXNhcnJheSgpfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS4kc2F2ZWRLZXlIYXNoO3JldHVybiB2b2lkIDAhPT1iP2I6Yj1Tay5hYnN0ci5vYmplY3RIYXNoKGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSl9ZnVuY3Rpb24gYihhLGIpe2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpaWYoIVNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYixcbmQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGUoYSxiLGQpe2NvbnN0IGU9e2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjcmVhdGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBpbnN0YW5jZXNcIik7dGhpcy5kaWN0PWE7dGhpcy5pbiRyZXByPSExfX07ZS5zbG90cz1PYmplY3QuYXNzaWduKGIsaCk7ZS5tZXRob2RzPXtpc2Rpc2pvaW50OnskbWV0aChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaXNkaXNqb2ludC4kbWV0aC5jYWxsKGIsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBhbmQgdGhlIGdpdmVuIGl0ZXJhYmxlIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0sX19yZXZlcnNlZF9fOnskbWV0aDpkLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn19O1xuZS5mbGFncz17c2skYWNjZXB0YWJsZV9hc19iYXNlOiExfTtcImRpY3RfdmFsdWVzXCI9PT1hJiYoZGVsZXRlIGUuc2xvdHMudHAkYXNfbnVtYmVyLGRlbGV0ZSBlLnNsb3RzLnRwJHJpY2hjb21wYXJlKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGUpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRvcmlnPWE7dGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMuJHNlcT1hLiRpdGVtcygpO3RoaXMuJHZlcnNpb249YS4kdmVyc2lvbjtjJiYodGhpcy4kc2VxPXRoaXMuJHNlcS5yZXZlcnNlKCkpO3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0OmIsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LFxuZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0scHJvdG86e25leHQkaXRlbTpsfX0pfWZ1bmN0aW9uIGwoKXtpZih0aGlzLiR2ZXJzaW9uIT09dGhpcy4kb3JpZy4kdmVyc2lvbil7aWYodGhpcy4kbGVuIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcImRpY3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdGlvbmFyeSBrZXlzIGNoYW5nZWQgZHVyaW5nIGl0ZXJhdGlvblwiKTt9cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXX1Tay5idWlsdGluLmRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImRpY3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJjA9PT1hLmxlbmd0aCUyJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0LFxuXCJiYWQgY2FsbCB0byBkaWN0IGNvbnN0cnVjdG9yXCIpO3RoaXMuc2l6ZT0wO3RoaXMuZW50cmllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYnVja2V0cz17fTtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrPTIpdGhpcy5zZXQkaXRlbShhW2JdLGFbYisxXSk7dGhpcy5pbiRyZXByPSExO3RoaXMuJHZlcnNpb249MH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkYXNfbnVtYmVyOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcImRpY3QoKSAtPiBuZXcgZW1wdHkgZGljdGlvbmFyeVxcbmRpY3QobWFwcGluZykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhIG1hcHBpbmcgb2JqZWN0J3NcXG4gICAgKGtleSwgdmFsdWUpIHBhaXJzXFxuZGljdChpdGVyYWJsZSkgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgYXMgaWYgdmlhOlxcbiAgICBkID0ge31cXG4gICAgZm9yIGssIHYgaW4gaXRlcmFibGU6XFxuICAgICAgICBkW2tdID0gdlxcbmRpY3QoKiprd2FyZ3MpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWU9dmFsdWUgcGFpcnNcXG4gICAgaW4gdGhlIGtleXdvcmQgYXJndW1lbnQgbGlzdC4gIEZvciBleGFtcGxlOiAgZGljdChvbmU9MSwgdHdvPTIpXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiey4uLn1cIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIjogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7XCIrYS5qb2luKFwiLCBcIikrXCJ9XCIpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe3JldHVybiB0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwiZGljdFwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtsZXQgYztpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpfHxcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1iKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtpZihhPT09dGhpcyljPSEwO2Vsc2UgaWYodGhpcy5zaXplIT09XG5hLnNpemUpYz0hMTtlbHNle2xldCBiO2M9dGhpcy4kaXRlbXMoKS5ldmVyeSgoW2MsZF0pPT57Yj1hLm1wJGxvb2t1cChjKTtyZXR1cm4gdm9pZCAwIT09YiYmKGI9PT1kfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxiLFwiRXFcIikpfSl9cmV0dXJuXCJFcVwiPT09Yj9jOiFjfSxuYiRvcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPXRoaXMuZGljdCRjb3B5KCk7Yi5kaWN0JG1lcmdlKGEpO3JldHVybiBifSxuYiRyZWZsZWN0ZWRfb3IoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT1hLmRpY3QkY29weSgpO2EuZGljdCRtZXJnZSh0aGlzKTtyZXR1cm4gYX0sbmIkaW5wbGFjZV9vcihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy51cGRhdGUkb25lYXJnKGEpLFxuKCk9PnRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy5nZXQkc2l6ZSgpfSxzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5tcCRsb29rdXAoYSl9LG1wJHN1YnNjcmlwdChhLGIpe3ZhciBjPXRoaXMubXAkbG9va3VwKGEpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1pc3NpbmcpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGE9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxiP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMD09PXRoaXMucG9wJGl0ZW0oYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgQSh0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9LGdldDp7JG1ldGgoYSxiKXtyZXR1cm4gdGhpcy5tcCRsb29rdXAoYSl8fGJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0sc2V0ZGVmYXVsdDp7JG1ldGgoYixjKXtsZXQgZDtjb25zdCBlPWEoYik7ZD1cInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsZSk7aWYodm9pZCAwIT09ZClyZXR1cm4gZFsxXTtjPWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdPVtiLGNdOlxudGhpcy5zZXQkYnVja2V0X2l0ZW0oYixjLGUpO3RoaXMuc2l6ZSsrO3RoaXMuJHZlcnNpb24rKztyZXR1cm4gY30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIkluc2VydCBrZXkgd2l0aCBhIHZhbHVlIG9mIGRlZmF1bHQgaWYga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cXG5cXG5SZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYga2V5IGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlIGRlZmF1bHQuXCJ9LHBvcDp7JG1ldGgoYSxiKXtjb25zdCBjPXRoaXMucG9wJGl0ZW0oYSk7aWYodm9pZCAwIT09YylyZXR1cm4gY1sxXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cXG5JZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkXCJ9LFxucG9waXRlbTp7JG1ldGgoKXtjb25zdCBhPXRoaXMuZ2V0JHNpemUoKTtpZigwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eVwiKTtjb25zdCBbYixjXT10aGlzLiRpdGVtcygpW2EtMV07dGhpcy5wb3AkaXRlbShiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2IsY10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZW1vdmUgYW5kIHJldHVybiBzb21lIChrZXksIHZhbHVlKSBwYWlyIGFzIGFcXG4yLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBuZXcgbih0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gbmV3IGcodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sdXBkYXRlOnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwidXBkYXRlXCIpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxcbklmIEUgaXMgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrIGluIEU6IERba10gPSBFW2tdXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBsYWNrcyBhIC5rZXlzKCkgbWV0aG9kLCB0aGVuIGRvZXM6ICBmb3IgaywgdiBpbiBFOiBEW2tdID0gdlxcbkluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiAgRFtrXSA9IEZba11cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNpemU9MDt0aGlzLiR2ZXJzaW9uKys7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9fSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gRC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy5kaWN0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LGNsYXNzbWV0aG9kczp7ZnJvbWtleXM6eyRtZXRoOmZ1bmN0aW9uKGEsYil7Yj1ifHxTay5idWlsdGluLm5vbmUubm9uZSQ7bGV0IGM9dGhpcz09PVNrLmJ1aWx0aW4uZGljdD9uZXcgdGhpczp0aGlzLnRwJGNhbGwoW10sW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGQ9PntjPWQ7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT5cbmMubXAkYXNzX3N1YnNjcmlwdChhLGIsITApKX0sKCk9PmMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCR0eXBlLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSwgLylcIiwkZG9jOlwiQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gaXRlcmFibGUgYW5kIHZhbHVlcyBzZXQgdG8gdmFsdWUuXCJ9fSxwcm90bzp7cXVpY2skbG9va3VwOmZ1bmN0aW9uKGEpe2E9dGhpcy5lbnRyaWVzW2EuJHNhdmVkS2V5SGFzaF07aWYodm9pZCAwIT09YSlyZXR1cm4gYVsxXX0sbXAkbG9va3VwOmZ1bmN0aW9uKGIpe2NvbnN0IGM9YShiKTtiPVwic3RyaW5nXCI9PT10eXBlb2YgYz90aGlzLmVudHJpZXNbY106dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixjKTtpZih2b2lkIDAhPT1iKXJldHVybiBiWzFdfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnNpemV9LHNrJGFzYXJyYXkoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpLm1hcChhPT5hWzBdKX0sdXBkYXRlJGNvbW1vbjpmdW5jdGlvbihhLFxuYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oYyxhLDAsMSk7YT1hWzBdO2xldCBkO3ZvaWQgMCE9PWEmJihkPXRoaXMudXBkYXRlJG9uZWFyZyhhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9PntpZihiKWZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil0aGlzLnNldCRpdGVtKG5ldyBTay5idWlsdGluLnN0cihiW2FdKSxiW2ErMV0pfSl9LHVwZGF0ZSRvbmVhcmcoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fHZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyk/dGhpcy5kaWN0JG1lcmdlKGEpOnRoaXMuZGljdCRtZXJnZV9zZXEoYSl9LGRpY3QkY29weSgpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7YS5zaXplPXRoaXMuc2l6ZTt2YXIgYj1PYmplY3QuZW50cmllcyh0aGlzLmVudHJpZXMpO2Zvcih2YXIgYyBpbiBiKXt2YXIgZD1iW2NdWzFdO2EuZW50cmllc1tiW2NdWzBdXT1bZFswXSxcbmRbMV1dfWZvcihsZXQgZSBpbiB0aGlzLmJ1Y2tldHMpZm9yKGM9dGhpcy5idWNrZXRzW2VdLGEuYnVja2V0c1tlXT1iPVtdLGQ9MDtkPGMubGVuZ3RoO2QrKyliLnB1c2goYS5lbnRyaWVzW1wiI1wiK2UrXCJfXCIrZF0pO3JldHVybiBhfSwkaXRlbXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpfSxzZXQkaXRlbTpmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YShiKTtsZXQgZTtcInN0cmluZ1wiPT09dHlwZW9mIGQ/KGU9dGhpcy5lbnRyaWVzW2RdLHZvaWQgMD09PWU/KHRoaXMuZW50cmllc1tkXT1bYixjXSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyk6KGU9dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixkKSx2b2lkIDA9PT1lPyh0aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZCksdGhpcy5zaXplKyssdGhpcy4kdmVyc2lvbisrKTplWzFdPWMpfSxnZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtiPXRoaXMuYnVja2V0c1tiXTtpZih2b2lkIDAhPT1iKWZvcihsZXQgZD1cbjA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF07aWYodm9pZCAwIT09YyYmKGNbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjWzBdLFwiRXFcIikpKXJldHVybiBjfX0scG9wJGJ1Y2tldF9pdGVtOmZ1bmN0aW9uKGEsYil7Y29uc3QgYz10aGlzLmJ1Y2tldHNbYl07bGV0IGQ7aWYodm9pZCAwIT09Yylmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKylpZihkPWNbZV0sdm9pZCAwIT09ZCYmKGRbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxkWzBdLFwiRXFcIikpKXJldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzW1wiI1wiK2IrXCJfXCIrZV0sY1tlXT12b2lkIDAsYy5ldmVyeShhPT52b2lkIDA9PT1hKSYmZGVsZXRlIHRoaXMuYnVja2V0c1tiXSxkfSxzZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiLGMpe2xldCBkPXRoaXMuYnVja2V0c1tjXTthPVthLGJdO3ZvaWQgMD09PWQ/KHRoaXMuYnVja2V0c1tjXT1bYV0sYz1cIiNcIitjK1wiXzBcIik6KGI9ZC5pbmRleE9mKHZvaWQgMCksXG4tMSE9PWI/KGM9XCIjXCIrYytcIl9cIitiLGRbYl09YSk6KGM9XCIjXCIrYytcIl9cIitkLmxlbmd0aCxkLnB1c2goYSkpKTt0aGlzLmVudHJpZXNbY109YX0scG9wJGl0ZW06ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO1wic3RyaW5nXCI9PT10eXBlb2YgYz8oYj10aGlzLmVudHJpZXNbY10sZGVsZXRlIHRoaXMuZW50cmllc1tjXSk6Yj10aGlzLnBvcCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuc2l6ZS0tLHRoaXMuJHZlcnNpb24rKyxifSxkaWN0JG1lcmdlOmZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcj09PVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaXRlcil7dmFyIGI9YS50cCRpdGVyKCk7Zm9yKGxldCBjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKXtjb25zdCBiPWEubXAkc3Vic2NyaXB0KGMpO3RoaXMuc2V0JGl0ZW0oYyxiKX19ZWxzZSByZXR1cm4gYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGtleXMpLFxuU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGIsW10pLGI9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihiKSxiPT5Tay5taXNjZXZhbC5jaGFpbihhLm1wJHN1YnNjcmlwdChiLCEwKSxhPT57dGhpcy5zZXQkaXRlbShiLGEpfSkpKX0sZGljdCRtZXJnZV9zZXE6ZnVuY3Rpb24oYSl7bGV0IGI9MDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlIHNlcXVlbmNlIGVsZW1lbnQgI1wiK2IrXCIgdG8gYSBzZXF1ZW5jZVwiKTthPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpO2lmKDIhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrXG5iK1wiIGhhcyBsZW5ndGggXCIrYS5sZW5ndGgrXCI7IDIgaXMgcmVxdWlyZWRcIik7dGhpcy5zZXQkaXRlbShhWzBdLGFbMV0pO2IrK30pfX19KTtjb25zdCBoPXt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLi4uXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZSh0aGlzKTthPWEubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8YSBpbnN0YW5jZW9mIGR8fFxuYSBpbnN0YW5jZW9mIG4pKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCksZj1hLnNxJGxlbmd0aCgpO3N3aXRjaChjKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpsZXQgZDt0aGlzPT09YT9kPSEwOmU9PT1mJiYoZD1iKHRoaXMsYSkpO3JldHVyblwiTm90RXFcIj09PWM/IWQ6ZDtjYXNlIFwiTHRcIjpyZXR1cm4gZTxmJiZiKHRoaXMsYSk7Y2FzZSBcIkx0RVwiOnJldHVybiBlPD1mJiZiKHRoaXMsYSk7Y2FzZSBcIkd0XCI6cmV0dXJuIGU+ZiYmYihhLHRoaXMpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZT49ZiYmYihhLHRoaXMpfX0sbmIkc3VidHJhY3QoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmRpZmZlcmVuY2UuJG1ldGguY2FsbChiLGEpfSxuYiRhbmQoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKGIsYSl9LG5iJG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi51bmlvbi4kbWV0aC5jYWxsKGIsXG5hKX0sbmIkeG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmRpY3QuZ2V0JHNpemUoKX19O3ZhciBkPWUoXCJkaWN0X2tleXNcIix7c3EkY29udGFpbnMoYSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZGljdC5tcCRsb29rdXAoYSl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGsodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBKHRoaXMuZGljdCl9KSxnPWUoXCJkaWN0X3ZhbHVlc1wiLHt0cCRpdGVyKCl7cmV0dXJuIG5ldyB1KHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmRpY3QpfSksbj1lKFwiZGljdF9pdGVtc1wiLHtzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiYyPT09YS5zcSRsZW5ndGgoKSkpcmV0dXJuITE7dmFyIGI9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygwKSk7XG5hPWEubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLmludF8oMSkpO2I9dGhpcy5kaWN0Lm1wJGxvb2t1cChiKTtyZXR1cm4gdm9pZCAwPT09Yj8hMTpiPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsYSxcIkVxXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBwKHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLmRpY3QpfSksaz1mKFwiZGljdF9rZXlpdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZhWzBdfSkscD1mKFwiZGljdF9pdGVtaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2FbMF0sYVsxXV0pfSksdT1mKFwiZGljdF92YWx1ZWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMV19KSxBPWYoXCJkaWN0X3JldmVyc2VrZXlpdGVyYXRvclwiLGsucHJvdG90eXBlLnRwJGl0ZXJuZXh0LFxuITApLHQ9ZihcImRpY3RfcmV2ZXJzZWl0ZW1pdGVyYXRvclwiLHAucHJvdG90eXBlLnRwJGl0ZXJuZXh0LCEwKSx2PWYoXCJkaWN0X3JldmVyc2V2YWx1ZWl0ZXJhdG9yXCIsdS5wcm90b3R5cGUudHAkaXRlcm5leHQsITApO1NrLmJ1aWx0aW4uZGljdC5weTIkbWV0aG9kcz17aGFzX2tleTp7JG5hbWU6XCJoYXNfa2V5XCIsJGZsYWdzOntPbmVBcmc6ITB9LCRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMuc3EkY29udGFpbnMoYSkpfSwkZG9jOlwiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZVwifSxrZXlzOnskbmFtZTpcImtleXNcIiwkbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuc2skYXNhcnJheSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRuYW1lOlwiaXRlbXNcIixcbiRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2EsYl0pKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbmFtZTpcInZhbHVlc1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFssYV0pPT5hKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLHtlbnRyaWVzOntnZXQ6KCk9Pntjb25zdCBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsXG5jXSk9PntiPVNrLnVuZml4UmVzZXJ2ZWQoYik7Yi5pbmNsdWRlcyhcIiRcIil8fChiPW5ldyBTay5idWlsdGluLnN0cihiKSxhW2IuJHNhdmVkS2V5SGFzaF09W2IsY10pfSk7cmV0dXJuIGF9LGNvbmZpZ3VyYWJsZTohMH0sc2l6ZTp7Z2V0OigpPT5PYmplY3Qua2V5cyhiKS5tYXAoYT0+U2sudW5maXhSZXNlcnZlZChhKSkuZmlsdGVyKGE9PiFhLmluY2x1ZGVzKFwiJFwiKSkubGVuZ3RoLGNvbmZpZ3VyYWJsZTohMH19KX1Tay5idWlsdGluLm1hcHBpbmdwcm94eT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWFwcGluZ3Byb3h5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSxcImJhZCBjYWxsIHRvIG1hcHBpbmcgcHJveHksIHVzZSAnbmV3J1wiKTt0aGlzLm1hcHBpbmc9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7dm9pZCAwIT09YyYmYSh0aGlzLm1hcHBpbmcsYyl9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cixcbnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcHBpbmdwcm94eVwiLGIpO1NrLmFic3RyLmNoZWNrT25lQXJnKFwibWFwcGluZ3Byb3h5XCIsYSxiKTthPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1hcHBpbmdwcm94eSgpIGFyZ3VtZW50IG11c3QgYmUgYSBtYXBwaW5nLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2I9bmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5O2IubWFwcGluZz1hO3JldHVybiBifSx0cCRyaWNoY29tcGFyZShhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5tYXBwaW5nLGEsYil9LHRwJHN0cigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkc3RyKCl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIm1hcHBpbmdwcm94eShcIitcblNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5tYXBwaW5nKStcIilcIil9LG1wJHN1YnNjcmlwdChhLGIpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkc3Vic2NyaXB0KGEsYil9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkY29udGFpbnMoYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkbGVuZ3RoKCl9LHRwJGl0ZXIoKXtyZXR1cm4gdGhpcy5tYXBwaW5nLnRwJGl0ZXIoKX0sdHAkYXNfbnVtYmVyOiEwLG5iJG9yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy5tYXBwaW5nLGEsXCJCaXRPclwiKX0sbmIkcmVmbGVjdGVkX29yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLm1hcHBpbmcsXCJCaXRPclwiKX0sbmIkaW5wbGFjZV9vcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInfD0nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXCIrXG5Tay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIjsgdXNlICd8JyBpbnN0ZWFkXCIpO319LG1ldGhvZHM6e2dldDp7JG1ldGgoYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGdldCksYSxiKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgayBpbiBELCBlbHNlIGQuICBkIGRlZmF1bHRzIHRvIE5vbmUuXCJ9LGtleXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRrZXlzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpLFxuW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJHZhbHVlcyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC52YWx1ZXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGNvcHkpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LHByb3RvOntzdHIkZ2V0Om5ldyBTay5idWlsdGluLnN0cihcImdldFwiKSxcbnN0ciRjb3B5Om5ldyBTay5idWlsdGluLnN0cihcImNvcHlcIiksc3RyJGtleXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwia2V5c1wiKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaXRlbXNcIiksc3RyJHZhbHVlczpuZXcgU2suYnVpbHRpbi5zdHIoXCJ2YWx1ZXNcIiksbXAkbG9va3VwKGEpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkbG9va3VwKGEpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnByb3BlcnR5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJwcm9wZXJ0eVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlKXt0aGlzLnByb3AkZ2V0PWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3Akc2V0PWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZGVsPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZG9jPWV8fGEmJmEuJGRvY3x8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbnNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJwcm9wZXJ0eVwiLFtcImZnZXRcIixcImZzZXRcIixcImZkZWxcIixcImRvY1wiXSxhLGMsQXJyYXkoNCkuZmlsbChTay5idWlsdGluLm5vbmUubm9uZSQpKTt0aGlzLnByb3AkZ2V0PWFbMF07dGhpcy5wcm9wJHNldD1hWzFdO3RoaXMucHJvcCRkZWw9YVsyXTtTay5idWlsdGluLmNoZWNrTm9uZShhWzNdKT9Tay5idWlsdGluLmNoZWNrTm9uZShhWzBdKXx8KHRoaXMucHJvcCRkb2M9YVswXS4kZG9jfHxhWzNdKTp0aGlzLnByb3AkZG9jPWFbM119LHRwJGRvYzpcIlByb3BlcnR5IGF0dHJpYnV0ZS5cXG5cXG4gIGZnZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZ2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZzZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZkZWxcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZGVsJ2luZyBhbiBhdHRyaWJ1dGVcXG4gIGRvY1xcbiAgICBkb2NzdHJpbmdcXG5cXG5UeXBpY2FsIHVzZSBpcyB0byBkZWZpbmUgYSBtYW5hZ2VkIGF0dHJpYnV0ZSB4OlxcblxcbmNsYXNzIEMob2JqZWN0KTpcXG4gICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94XFxuICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKTogc2VsZi5feCA9IHZhbHVlXFxuICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5feFxcbiAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgJ0knbSB0aGUgJ3gnIHByb3BlcnR5LicpXFxuXFxuRGVjb3JhdG9ycyBtYWtlIGRlZmluaW5nIG5ldyBwcm9wZXJ0aWVzIG9yIG1vZGlmeWluZyBleGlzdGluZyBvbmVzIGVhc3k6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHgoc2VsZik6XFxuICAgICAgICAnSSBhbSB0aGUgJ3gnIHByb3BlcnR5LidcXG4gICAgICAgIHJldHVybiBzZWxmLl94XFxuICAgIEB4LnNldHRlclxcbiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBzZWxmLl94ID0gdmFsdWVcXG4gICAgQHguZGVsZXRlclxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgIGRlbCBzZWxmLl94XCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZihudWxsPT09YSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT10aGlzLnByb3AkZ2V0KXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidW5yZWFkYWJsZSBhdHRyaWJ1dGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLnByb3AkZ2V0LFthXSl9LHRwJGRlc2NyX3NldChhLGMpe2xldCBiO2I9bnVsbD09Yz90aGlzLnByb3AkZGVsOnRoaXMucHJvcCRzZXQ7aWYoU2suYnVpbHRpbi5jaGVja05vbmUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJjYW4ndCBcIisobnVsbD09Yz9cImRlbGV0ZVwiOlwic2V0XCIpK1wiIGF0dHJpYnV0ZVwiKTtpZighYi50cCRjYWxsKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgaXMgbm90IGNhbGxhYmxlXCIpO3JldHVybiBudWxsPT1jP2IudHAkY2FsbChbYV0pOmIudHAkY2FsbChbYSxjXSl9fSxcbm1ldGhvZHM6e2dldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KGEsdGhpcy5wcm9wJHNldCx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LHNldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsYSx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LGRlbGV0ZXI6eyRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5wcm9wZXJ0eSh0aGlzLnByb3AkZ2V0LHRoaXMucHJvcCRzZXQsYSx0aGlzLnByb3AkZG9jKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0sZ2V0c2V0czp7ZmdldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZ2V0fX0sZnNldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3Akc2V0fX0sZmRlbDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZGVsfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZG9jfSxcbiRzZXQoYSl7dGhpcy5wcm9wJGRvYz1hPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNsYXNzbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuY20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJjbGFzc21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImNsYXNzbWV0aG9kXCIsYSwxLDEpO3RoaXMuY20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwiY2xhc3NtZXRob2QoZnVuY3Rpb24pIC0+IG1ldGhvZFxcblxcbkNvbnZlcnQgYSBmdW5jdGlvbiB0byBiZSBhIGNsYXNzIG1ldGhvZC5cXG5cXG5BIGNsYXNzIG1ldGhvZCByZWNlaXZlcyB0aGUgY2xhc3MgYXMgaW1wbGljaXQgZmlyc3QgYXJndW1lbnQsXFxuanVzdCBsaWtlIGFuIGluc3RhbmNlIG1ldGhvZCByZWNlaXZlcyB0aGUgaW5zdGFuY2UuXFxuVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICBjbGFzcyBDOlxcbiAgICAgIEBjbGFzc21ldGhvZFxcbiAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTpcXG4gICAgICAgICAgLi4uXFxuXFxuSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZVxcbihlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXFxuSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzXFxub2JqZWN0IGlzIHBhc3NlZCBhcyB0aGUgaW1wbGllZCBmaXJzdCBhcmd1bWVudC5cXG5cXG5DbGFzcyBtZXRob2RzIGFyZSBkaWZmZXJlbnQgdGhhbiBDKysgb3IgSmF2YSBzdGF0aWMgbWV0aG9kcy5cXG5JZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2NvbnN0IGI9dGhpcy5jbSRjYWxsYWJsZTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0XCIpO3ZvaWQgMD09PWMmJihjPWEub2IkdHlwZSk7cmV0dXJuKGE9Yi50cCRkZXNjcl9nZXQpP2EuY2FsbChiLGMpOm5ldyBTay5idWlsdGluLm1ldGhvZChiLGMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5jbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KTtTay5idWlsdGluLnN0YXRpY21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RhdGljbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuc20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG50cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN0YXRpY21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInN0YXRpY21ldGhvZFwiLGEsMSwxKTt0aGlzLnNtJGNhbGxhYmxlPWFbMF19LHRwJGRvYzpcInN0YXRpY21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgc3RhdGljIG1ldGhvZC5cXG5cXG5BIHN0YXRpYyBtZXRob2QgZG9lcyBub3QgcmVjZWl2ZSBhbiBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudC5cXG5UbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICAgICBjbGFzcyBDOlxcbiAgICAgICAgIEBzdGF0aWNtZXRob2RcXG4gICAgICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5cXG5TdGF0aWMgbWV0aG9kcyBpbiBQeXRob24gYXJlIHNpbWlsYXIgdG8gdGhvc2UgZm91bmQgaW4gSmF2YSBvciBDKysuXFxuRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uXCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZih2b2lkIDA9PT10aGlzLnNtJGNhbGxhYmxlKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdFwiKTtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuc20kY2FsbGFibGV9fSxfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXtsZXQgZT10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBlJiZcIm51bWJlclwiPT09dHlwZW9mIGMpe2NvbnN0IGI9YShlLGMpO2lmKGQoYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9ZT1uKGUpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGUsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19XG5mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gYShkLGMpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIGIoZCxjKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKGMpKTpuZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52KX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKGQsYykpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oSlNCSS5udW1iZXJJZlNhZmUoYihkLGMpKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYyl7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQpe2NvbnN0IGI9YShkLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9Yz1KU0JJLkJpZ0ludChjKX1lbHNlIGlmKEpTQkkubGVzc1RoYW4oSlNCSS5CaWdJbnQoMCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtcbmQ9bihkKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGQsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXt2YXIgZD10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBkJiZcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIGQ9YShkLGMpLDA+ZCYmKGQrPTQyOTQ5NjcyOTYpLG5ldyBTay5idWlsdGluLmludF8oZCk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGE8PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYTw9XG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSPythOkpTQkkuQmlnSW50KGEpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP0pTQkkuQmlnSW50KGEpOmF9U2suYnVpbHRpbi5pbnRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJpbnRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XyxcImJhZCBjYWxsIHRvIGludCB1c2UgJ25ldydcIik7bGV0IGI7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxKU0JJLl9faXNCaWdJbnQoYSkpYj1hO2Vsc2UgaWYodm9pZCAwPT09YSliPTA7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpYj1nKGEpO2Vsc2V7aWYoYS5uYiRpbnQpcmV0dXJuIGEubmIkaW50KCk7U2suYXNzZXJ0cy5mYWlsKFwiYmFkIGFyZ3VtZW50IHRvIGludCBjb25zdHJ1Y3RvclwiKX10aGlzLnY9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCxcbnRwJGRvYzpcImludCh4PTApIC0+IGludGVnZXJcXG5pbnQoeCwgYmFzZT0xMCkgLT4gaW50ZWdlclxcblxcbkNvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGFuIGludGVnZXIsIG9yIHJldHVybiAwIGlmIG5vIGFyZ3VtZW50c1xcbmFyZSBnaXZlbi4gIElmIHggaXMgYSBudW1iZXIsIHJldHVybiB4Ll9faW50X18oKS4gIEZvciBmbG9hdGluZyBwb2ludFxcbm51bWJlcnMsIHRoaXMgdHJ1bmNhdGVzIHRvd2FyZHMgemVyby5cXG5cXG5JZiB4IGlzIG5vdCBhIG51bWJlciBvciBpZiBiYXNlIGlzIGdpdmVuLCB0aGVuIHggbXVzdCBiZSBhIHN0cmluZyxcXG5ieXRlcywgb3IgYnl0ZWFycmF5IGluc3RhbmNlIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4gdGhlXFxuZ2l2ZW4gYmFzZS4gIFRoZSBsaXRlcmFsIGNhbiBiZSBwcmVjZWRlZCBieSAnKycgb3IgJy0nIGFuZCBiZSBzdXJyb3VuZGVkXFxuYnkgd2hpdGVzcGFjZS4gIFRoZSBiYXNlIGRlZmF1bHRzIHRvIDEwLiAgVmFsaWQgYmFzZXMgYXJlIDAgYW5kIDItMzYuXFxuQmFzZSAwIG1lYW5zIHRvIGludGVycHJldCB0aGUgYmFzZSBmcm9tIHRoZSBzdHJpbmcgYXMgYW4gaW50ZWdlciBsaXRlcmFsLlxcbj4+PiBpbnQoJzBiMTAwJywgYmFzZT0wKVxcbjRcIixcbiRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LHRwJGhhc2goKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/YTpKU0JJLnRvTnVtYmVyKEpTQkkucmVtYWluZGVyKGEsSlNCSS5fX01BWF9TQUZFKSl9LHRwJG5ldyhhLGIpezE9PT1hLmxlbmd0aCsoYj9iLmxlbmd0aDowKT8oYj1hWzBdLGE9U2suYnVpbHRpbi5ub25lLm5vbmUkKTooYT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImludFwiLFtudWxsLFwiYmFzZVwiXSxhLGIsW25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSksYj1hWzBdLGE9YVsxXSk7YT1hIT09U2suYnVpbHRpbi5ub25lLm5vbmUkP1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpOm51bGw7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKW51bGw9PT1hJiYoYT0xMCksYj1uZXcgU2suYnVpbHRpbi5pbnRfKFNrLnN0cjJudW1iZXIoYi52LFxuYSkpO2Vsc2V7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZVwiKTtpZihiLm5iJGludCliPWIubmIkaW50KCk7ZWxzZSBpZihhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4kdHJ1bmMpKXthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYnVpbHRpbi5zdHIuJHRydW5jLiRqc3N0cigpK1wiIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSBcIitTay5hYnN0ci50eXBlTmFtZShiKStcIilcIik7Yj1uZXcgU2suYnVpbHRpbi5pbnRfKGEudil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ5dGVzLWxpa2Ugb2JqZWN0IG9yIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYikrXCInXCIpO31pZih0aGlzPT09U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZSlyZXR1cm4gYjthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2Eudj1iLnY7cmV0dXJuIGF9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLG9iJGVxOmMoKGEsYik9PmE9PWIsSlNCSS5lcXVhbCksb2IkbmU6YygoYSxiKT0+YSE9YixKU0JJLm5vdEVxdWFsKSxvYiRndDpjKChhLGIpPT5hPmIsSlNCSS5ncmVhdGVyVGhhbiksb2IkZ2U6YygoYSxiKT0+YT49YixKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbCksb2IkbHQ6YygoYSxiKT0+YTxiLEpTQkkubGVzc1RoYW4pLG9iJGxlOmMoKGEsYik9PmE8PWIsSlNCSS5sZXNzVGhhbk9yRXF1YWwpLG5iJGludDplLG5iJGluZGV4KCl7cmV0dXJuIHRoaXMudn0sbmIkZmxvYXQoKXt2YXIgYT10aGlzLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk7YT1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYSkpO1xuaWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX0sbmIkaXNuZWdhdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKX0sbmIkaXNwb3NpdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5ncmVhdGVyVGhhbk9yRXF1YWwoYSxKU0JJLl9fWkVSTyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkcG9zaXRpdmU6ZSxuYiRuZWdhdGl2ZTpiKGE9Pi1hLEpTQkkudW5hcnlNaW51cyksbmIkYWRkOmEoKGEsYik9PmErYiwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5hZGQoYSxiKSkpLG5iJHN1YnRyYWN0OmEoKGEsYik9PmEtYiwoYSxiKT0+XG5KU0JJLm51bWJlcklmU2FmZShKU0JJLnN1YnRyYWN0KGEsYikpKSxuYiRtdWx0aXBseTphKChhLGIpPT5hKmIsSlNCSS5tdWx0aXBseSksbmIkZGl2aWRlKGEpe3JldHVybiBTay5fX2Z1dHVyZV9fLmRpdmlzaW9uP3RoaXMubmIkZmxvYXQoKS5uYiRkaXZpZGUoYSk6dGhpcy5uYiRmbG9vcl9kaXZpZGUoYSl9LG5iJGZsb29yX2RpdmlkZTpmKChhLGIpPT5NYXRoLmZsb29yKGEvYiksSlNCSS5kaXZpZGUpLG5iJHJlbWFpbmRlcjpmKChhLGIpPT5hLU1hdGguZmxvb3IoYS9iKSpiLEpTQkkucmVtYWluZGVyKSxuYiRkaXZtb2QoYSl7Y29uc3QgYj10aGlzLm5iJGZsb29yX2RpdmlkZShhKTthPXRoaXMubmIkcmVtYWluZGVyKGEpO3JldHVybiBiPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR8fGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDpuZXcgU2suYnVpbHRpbi50dXBsZShbYixcbmFdKX0sbmIkYW5kOmgoKGEsYik9PmEmYixKU0JJLmJpdHdpc2VBbmQpLG5iJG9yOmgoKGEsYik9PmF8YixKU0JJLmJpdHdpc2VPciksbmIkeG9yOmgoKGEsYik9PmFeYixKU0JJLmJpdHdpc2VYb3IpLG5iJGFiczpiKE1hdGguYWJzLGE9PkpTQkkubGVzc1RoYW4oYSxKU0JJLl9fWkVSTyk/SlNCSS51bmFyeU1pbnVzKGEpOmEpLG5iJGxzaGlmdDpsKChhLGIpPT57aWYoNTM+YiYmKGE9MiphKnBbYl0sZChhKSkpcmV0dXJuIGF9LEpTQkkubGVmdFNoaWZ0KSxuYiRyc2hpZnQ6bCgoYSxiKT0+e2NvbnN0IGM9YT4+YjtyZXR1cm4gMDxhJiYwPmM/YyZNYXRoLnBvdygyLDMyLWIpLTE6Y30sKGEsYik9PkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc2lnbmVkUmlnaHRTaGlmdChhLGIpKSksbmIkaW52ZXJ0OmIoYT0+fmEsSlNCSS5iaXR3aXNlTm90KSxuYiRwb3dlcihhLGIpe2xldCBjO3ZvaWQgMCE9PWImJlNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpJiYoYj12b2lkIDApO2lmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5pbnRfJiYodm9pZCAwPT09Ynx8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xykpe2xldCBlPXRoaXMudixmPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgZil7Y29uc3QgYT1NYXRoLnBvdyhlLGYpO2lmKGQoYSkmJihjPTA+Zj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSx2b2lkIDA9PT1iKSlyZXR1cm4gY31pZih2b2lkIDAhPT1iKXtpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgMm5kIGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWRcIik7aWYoMD09PWIudil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwXCIpO3JldHVybiB2b2lkIDAhPT1jP2MubmIkcmVtYWluZGVyKGIpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5wb3dlcm1vZChuKGUpLFxubihmKSxuKGIudikpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLmV4cG9uZW50aWF0ZShuKGUpLG4oZikpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMudil9fSxnZXRzZXRzOntyZWFsOnskZ2V0OmUsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LlwifSxiaXRfbGVuZ3RoOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmJ1aWx0aW4uYmluKHRoaXMpLnNxJGxlbmd0aCgpLVxuMil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cXG5cXG4+Pj4gYmluKDM3KVxcbicwYjEwMDEwMSdcXG4+Pj4gKDM3KS5iaXRfbGVuZ3RoKClcXG42XCJ9LHRvX2J5dGVzOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTt9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBsZW5ndGgsIGJ5dGVvcmRlciwgKiwgc2lnbmVkPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGFuIGludGVnZXIuXFxuXFxuICBsZW5ndGhcXG4gICAgTGVuZ3RoIG9mIGJ5dGVzIG9iamVjdCB0byB1c2UuICBBbiBPdmVyZmxvd0Vycm9yIGlzIHJhaXNlZCBpZiB0aGVcXG4gICAgaW50ZWdlciBpcyBub3QgcmVwcmVzZW50YWJsZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuXFxuICBieXRlb3JkZXJcXG4gICAgVGhlIGJ5dGUgb3JkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuICBJZiBieXRlb3JkZXIgaXMgJ2JpZycsXFxuICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnl0ZSBhcnJheS4gIElmXFxuICAgIGJ5dGVvcmRlciBpcyAnbGl0dGxlJywgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZVxcbiAgICBieXRlIGFycmF5LiAgVG8gcmVxdWVzdCB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3Qgc3lzdGVtLCB1c2VcXG4gICAgYHN5cy5ieXRlb3JkZXInIGFzIHRoZSBieXRlIG9yZGVyIHZhbHVlLlxcbiAgc2lnbmVkXFxuICAgIERldGVybWluZXMgd2hldGhlciB0d28ncyBjb21wbGVtZW50IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBpbnRlZ2VyLlxcbiAgICBJZiBzaWduZWQgaXMgRmFsc2UgYW5kIGEgbmVnYXRpdmUgaW50ZWdlciBpcyBnaXZlbiwgYW4gT3ZlcmZsb3dFcnJvclxcbiAgICBpcyByYWlzZWQuXCJ9LFxuX190cnVuY19fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2Zsb29yX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkZsb29yaW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2NlaWxfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQ2VpbGluZyBvZiBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUm91bmRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXFxuUm91bmRpbmcgd2l0aCBhbiBuZGlnaXRzIGFyZ3VtZW50IGFsc28gcmV0dXJucyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy52KV0pfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X18oITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9fSxwcm90bzp7c3RyJChhLGIpe2E9dm9pZCAwPT09YXx8MTA9PT1hP3RoaXMudi50b1N0cmluZygpOnRoaXMudi50b1N0cmluZyhhKTtifHx2b2lkIDA9PT1ifHxcIi1cIj09PWFbMF0mJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gYX0scm91bmQkKGEpe2E9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTt2YXIgYj10aGlzLnYsYz1NYXRoLnBvdygxMCwtYSk7aWYoMDxhKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYiYmU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXJldHVybiBhPVxuYi9jLGI9TWF0aC5yb3VuZChhKSxuZXcgU2suYnVpbHRpbi5pbnRfKCguNT09PSgwPGE/YTotYSklMT8wPT09YiUyP2I6Yi0xOmIpKmMpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhNYXRoLnJvdW5kKGIvYykqYyk7e2M9SlNCSS5CaWdJbnQoMTAqYyk7YT1KU0JJLkJpZ0ludCgxMCk7Yj1KU0JJLmRpdmlkZShiLGMpO2NvbnN0IGQ9SlNCSS5kaXZpZGUoYixhKSxlPUpTQkkuc3VidHJhY3QoYixKU0JJLm11bHRpcGx5KGEsZCkpOzU+SlNCSS50b051bWJlcihlKT9iPUpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShkLGEpLGMpOkpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShKU0JJLmFkZChkLEpTQkkuQmlnSW50KDEpLGEpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX19fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uaW50X1wiLFNrLmJ1aWx0aW4uaW50Xyk7Y29uc3Qgaz0vXyg/PVteX10pL2c7U2suc3RyMm51bWJlcj1cbmZ1bmN0aW9uKGEsYil7dmFyIGM9YSxlPSExLGY7YT1hLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7XCItXCI9PT1hLmNoYXJBdCgwKSYmKGU9ITAsYT1hLnN1YnN0cmluZygxKSk7XCIrXCI9PT1hLmNoYXJBdCgwKSYmKGE9YS5zdWJzdHJpbmcoMSkpO2lmKG51bGw9PT1ifHx2b2lkIDA9PT1iKWI9MTA7aWYoKDI+Ynx8MzY8YikmJjAhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzZcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1OdW1iZXIoYikpO2lmKFwiMHhcIj09PWEuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKSlpZigxNj09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj0xNjtlbHNle2lmKDM0PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBiXCI9PT1hLnN1YnN0cmluZygwLFxuMikudG9Mb3dlckNhc2UoKSlpZigyPT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTI7ZWxzZXtpZigxMj5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwb1wiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDg9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9ODtlbHNle2lmKDI1PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBcIj09PWEuY2hhckF0KDApKXtpZihcIjBcIj09PWEpcmV0dXJuIDA7aWYoOD09PWJ8fDA9PT1iKWI9OH0wPT09YiYmKGI9MTApO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoXCJfX1wiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrXG5iK1wiOiAnXCIrYytcIidcIik7YT0xMCE9PWI/YS5yZXBsYWNlKGssXCJcIik6YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShrLFwiXCIpfWlmKDA9PT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKXt2YXIgZz1hLmNoYXJDb2RlQXQoZik7dmFyIGg9Yjs0ODw9ZyYmNTc+PWc/aD1nLTQ4OjY1PD1nJiY5MD49Zz9oPWctNjUrMTA6OTc8PWcmJjEyMj49ZyYmKGg9Zy05NysxMCk7aWYoaD49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lJiYoYT1cIi1cIithKTtoPXBhcnNlSW50KGEsYik7aWYoZChoKSlyZXR1cm4gaDtjPSExO1wiLVwiPT09YVswXSYmKGM9ITAsYT1hLnN1YnN0cmluZygxKSk7Yj1KU0JJLkJpZ0ludChiKTtcbmU9SlNCSS5CaWdJbnQoMSk7Zj1KU0JJLkJpZ0ludCgwKTtmb3IoZz1hLmxlbmd0aC0xOzA8PWc7Zy0tKWg9YS5jaGFyQ29kZUF0KGcpLDQ4PD1oJiY1Nz49aD9oLT00ODo2NTw9aCYmOTA+PWg/aD1oLTY1KzEwOjk3PD1oJiYxMjI+PWgmJihoPWgtOTcrMTApLGg9SlNCSS5tdWx0aXBseShKU0JJLkJpZ0ludChoKSxlKSxmPUpTQkkuYWRkKGYsaCksZT1KU0JJLm11bHRpcGx5KGUsYik7YyYmKGY9SlNCSS5tdWx0aXBseShmLEpTQkkuQmlnSW50KC0xKSkpO3JldHVybiBhPWZ9O1NrLmJ1aWx0aW4uaW50Xy5weTIkbWV0aG9kcz17fTtTay5sb25nRnJvbVN0cj1mdW5jdGlvbihhLGIpe2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhnKGEpKTthPVNrLnN0cjJudW1iZXIoYSxiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5sb25nRnJvbVN0clwiLFNrLmxvbmdGcm9tU3RyKTtTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkPVxuZDtTay5idWlsdGluLmludF8uc3RyaW5nVG9OdW1iZXJPckJpZz1nO2NvbnN0IHA9Wy41LDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNiwxMzEwNzIsMjYyMTQ0LDUyNDI4OCwxMDQ4NTc2LDIwOTcxNTIsNDE5NDMwNCw4Mzg4NjA4LDE2Nzc3MjE2LDMzNTU0NDMyLDY3MTA4ODY0LDEzNDIxNzcyOCwyNjg0MzU0NTYsNTM2ODcwOTEyLDEwNzM3NDE4MjQsMjE0NzQ4MzY0OCw0Mjk0OTY3Mjk2LDg1ODk5MzQ1OTIsMTcxNzk4NjkxODQsMzQzNTk3MzgzNjgsNjg3MTk0NzY3MzYsMTM3NDM4OTUzNDcyLDI3NDg3NzkwNjk0NCw1NDk3NTU4MTM4ODgsMTA5OTUxMTYyNzc3NiwyMTk5MDIzMjU1NTUyLDQzOTgwNDY1MTExMDQsODc5NjA5MzAyMjIwOCwxNzU5MjE4NjA0NDQxNiwzNTE4NDM3MjA4ODgzMiw3MDM2ODc0NDE3NzY2NCwweDgwMDAwMDAwMDAwMCwyODE0NzQ5NzY3MTA2NTYsNTYyOTQ5OTUzNDIxMzEyLDB4NDAwMDAwMDAwMDAwMCxcbjB4ODAwMDAwMDAwMDAwMCw0NTAzNTk5NjI3MzcwNDk2LDkwMDcxOTkyNTQ3NDA5OTJdO1NrLmJ1aWx0aW4ubG5nPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsb25nXCIse2Jhc2U6U2suYnVpbHRpbi5pbnRfLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4uaW50Xy5jYWxsKHRoaXMsYSl9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkrXCJMXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkbmVnYXRpdmUuY2FsbCh0aGlzKS52KX0sbmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkcG9zaXRpdmUuY2FsbCh0aGlzKS52KX19fSk7Y29uc3QgdT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZTtTay5idWlsdGluLmJvb2w9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJvb2xcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSxiYXNlOlNrLmJ1aWx0aW4uaW50XyxzbG90czp7dHAkZG9jOlwiYm9vbCh4KSAtPiBib29sXFxuXFxuUmV0dXJucyBUcnVlIHdoZW4gdGhlIGFyZ3VtZW50IHggaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblRoZSBidWlsdGlucyBUcnVlIGFuZCBGYWxzZSBhcmUgdGhlIG9ubHkgdHdvIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYm9vbC5cXG5UaGUgY2xhc3MgYm9vbCBpcyBhIHN1YmNsYXNzIG9mIHRoZSBjbGFzcyBpbnQsIGFuZCBjYW5ub3QgYmUgc3ViY2xhc3NlZC5cIix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiYm9vbFwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImJvb2xcIixhLDAsMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYVswXSl9LCRyKCl7cmV0dXJuIHRoaXMudj90aGlzLnN0ciRUcnVlOlxudGhpcy5zdHIkRmFsc2V9LHRwJGFzX251bWJlcjohMCxuYiRhbmQoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudiZjLnYpOmEubmIkYW5kLmNhbGwodGhpcyxjKX0sbmIkb3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudnxjLnYpOmEubmIkb3IuY2FsbCh0aGlzLGMpfSxuYiR4b3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudl5jLnYpOmEubmIkeG9yLmNhbGwodGhpcyxjKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LG1ldGhvZHM6e19fZm9ybWF0X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3N0ciRGYWxzZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJGYWxzZVwiKSxzdHIkVHJ1ZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJUcnVlXCIpfX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ib29sXCIsU2suYnVpbHRpbi5ib29sKTtTay5idWlsdGluLmJvb2wudHJ1ZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmJvb2wucHJvdG90eXBlLHt2Ont2YWx1ZToxLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5ib29sLmZhbHNlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjAsZW51bWVyYWJsZTohMH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9dGhpcy52O2I9Yi52O2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYilpZihKU0JJLl9faXNCaWdJbnQoYikpe2lmKGI9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGIpKSxJbmZpbml0eT09Ynx8LUluZmluaXR5PT1iKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7XG59ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoYyxiKX19ZnVuY3Rpb24gYihhKXtjb25zdCBiPWMoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInBvdygpIDNyZCBhcmd1bWVudCBub3QgYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnNcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGEpfX1mdW5jdGlvbiBlKGEsYil7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWE/SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1hP25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA+Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpOlxuLUluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvYil9ZnVuY3Rpb24gZihhLGIpe2lmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWI/MD5hP25ldyBTay5idWlsdGluLmZsb2F0XygtMSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApOi1JbmZpbml0eT09PWI/MD5hfHwwIT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5mbG9vcihhL1xuYikpfWZ1bmN0aW9uIGwoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygwKTtpZihJbmZpbml0eT09PWIpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09dGhpcy52P25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA8YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTtsZXQgYz1hJWI7MD5hPzA8YiYmMD5jJiYoYys9Yik6MD5iJiYwIT09YyYmKGMrPWIpOzA9PT1jJiYoMD5iP2M9LTA6LUluZmluaXR5PT09SW5maW5pdHkvYyYmKGM9MCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9ZnVuY3Rpb24gaChhLGIpe2lmKDA+YSYmMCE9PWIlMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgbnVtYmVyIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyXCIpO1xuaWYoMD09PWEmJjA+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXJcIik7Y29uc3QgYz1NYXRoLnBvdyhhLGIpO2lmKEluZmluaXR5PT09TWF0aC5hYnMoYykmJkluZmluaXR5IT09TWF0aC5hYnMoYSkmJkluZmluaXR5IT09TWF0aC5hYnMoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcIk51bWVyaWNhbCByZXN1bHQgb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9Y29uc3QgZD1PYmplY3QuY3JlYXRlKG51bGwse0luZmluaXR5Ont2YWx1ZTozMTQxNTl9LFwiLUluZmluaXR5XCI6e3ZhbHVlOi0zMTQxNTl9LE5hTjp7dmFsdWU6MH19KTtTay5idWlsdGluLmZsb2F0Xz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZmxvYXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfLFxuXCJiYWQgY2FsbCB0byBmbG9hdCB1c2UgJ25ldydcIik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXRoaXMudj1hO2Vsc2UgaWYodm9pZCAwPT09YSl0aGlzLnY9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl0aGlzLnY9cGFyc2VGbG9hdChhKTtlbHNle2lmKGEubmIkZmxvYXQpcmV0dXJuIGEubmIkZmxvYXQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gZmxvYXQgY29uc3RydWN0b3JcIil9fSxzbG90czp7dHAkZ2V0dGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDb252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgaWYgcG9zc2libGUuXCIsdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O2xldCBiPWRbYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtiPU51bWJlci5pc0ludGVnZXIoYSk/dGhpcy5uYiRpbnQoKS50cCRoYXNoKCk6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLVxuTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIvMik7cmV0dXJuIGRbdGhpcy52XT1ifSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy5zdHIkKDEwLCEwKSl9LHRwJG5ldyhhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7aWYoYSYmMTxhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCBleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgXCIrYS5sZW5ndGgpO2E9YVswXTtpZih2b2lkIDA9PT1hKXZhciBjPW5ldyBTay5idWlsdGluLmZsb2F0XygwKTtlbHNlIGlmKGEubmIkZmxvYXQpYz1hLm5iJGZsb2F0KCk7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtjPWEudjthPWM7aWYoLTEhPT1jLmluZGV4T2YoXCJfXCIpKXtpZihnLnRlc3QoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogJ1wiK1xuYytcIidcIik7YT1jLmNoYXJBdCgwKStjLnN1YnN0cmluZygxKS5yZXBsYWNlKG4sXCJcIil9aWYoYy5tYXRjaCgvXi1pbmYkL2kpKXZhciBkPS1JbmZpbml0eTtlbHNlIGMubWF0Y2goL15bK10/aW5mJC9pKT9kPUluZmluaXR5OmMubWF0Y2goL15bLStdP25hbiQvaSk/ZD1OYU46aXNOYU4oYSl8fChkPXBhcnNlRmxvYXQoYSksTnVtYmVyLmlzTmFOKGQpJiYoZD12b2lkIDApKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQ6IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIobmV3IFNrLmJ1aWx0aW4uc3RyKGMpKSk7Yz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXJcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZSlyZXR1cm4gYztcbmQ9bmV3IHRoaXMuY29uc3RydWN0b3I7ZC52PWMudjtyZXR1cm4gZH0sbmIkaW50KCl7bGV0IGE9dGhpcy52O2E9MD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjYW5ub3QgY29udmVydCBmbG9hdCBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMpK1wiIHRvIGludGVnZXJcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKX0sbmIkZmxvYXQ6YSxuYiRsb25nKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyh0aGlzLm5iJGludCgpLnYpfSxuYiRhZGQ6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGErYikpLG5iJHN1YnRyYWN0OmMoKGEsYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhhLWIpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YygoYSxcbmIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYi1hKSksbmIkbXVsdGlwbHk6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEqYikpLG5iJGRpdmlkZTpjKGUpLG5iJHJlZmxlY3RlZF9kaXZpZGU6YygoYSxiKT0+ZShiLGEpKSxuYiRmbG9vcl9kaXZpZGU6YyhmKSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOmMoKGEsYik9PmYoYixhKSksbmIkcmVtYWluZGVyOmMobCksbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpjKChhLGIpPT5sKGIsYSkpLG5iJGRpdm1vZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi50dXBsZShbZihhLGIpLGwoYSxiKV0pKSxuYiRyZWZsZWN0ZWRfZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGIsYSksbChiLGEpXSkpLG5iJHBvd2VyOmIoaCksbmIkcmVmbGVjdGVkX3Bvd2VyOmIoKGEsYik9PmgoYixhKSksbmIkYWJzKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmFicyh0aGlzLnYpKX0sbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC10aGlzLnYpfSxcbm5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnZ9LG5iJGlzbmVnYXRpdmUoKXtyZXR1cm4gMD50aGlzLnZ9LG5iJGlzcG9zaXRpdmUoKXtyZXR1cm4gMDw9dGhpcy52fSxvYiRlcTpjKChhLGIpPT5hPT1iKSxvYiRuZTpjKChhLGIpPT5hIT1iKSxvYiRndDpjKChhLGIpPT5hPmIpLG9iJGdlOmMoKGEsYik9PmE+PWIpLG9iJGx0OmMoKGEsYik9PmE8Yiksb2IkbGU6YygoYSxiKT0+YTw9Yil9LGdldHNldHM6e3JlYWw6eyRnZXQ6YSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApfSwkZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGg6YSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LlwifSxcbl9fdHJ1bmNfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy5uYiRpbnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuZGlnaXRzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4LCByb3VuZGluZyBoYWxmIHRvd2FyZCBldmVuLlxcblxcbldoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkLCB3b3JrIGxpa2UgYnVpbHQtaW4gcm91bmQoeCwgbmRpZ2l0cykuXCJ9LGlzX2ludGVnZXI6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woTnVtYmVyLmlzSW50ZWdlcih0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSk7Y29uc3QgZz0vX1tlRV18W2VFXV98XFwuX3xfXFwufFsrLV1ffF9fLyxuPS9fKD89W15fXSkvZztTay5idWlsdGluLmZsb2F0Xy5QeUZsb2F0X0NoZWNrPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOlNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8YS5vYiR0eXBlLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5mbG9hdF8pP1xuITA6ITF9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS50b0ZpeGVkPWZ1bmN0aW9uKGEpe2E9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIHRoaXMudi50b0ZpeGVkKGEpfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUucm91bmQkPWZ1bmN0aW9uKGEpe3ZhciBiPVNrLmJ1aWx0aW4uYXNudW0kKHRoaXMpO3ZhciBjPXZvaWQgMD09PWE/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXtiKj1NYXRoLnBvdygxMCxjKTt2YXIgZD1NYXRoLnJvdW5kKGIpO2M9KC41PT09KDA8Yj9iOi1iKSUxPzA9PT1kJTI/ZDpkLTE6ZCkvTWF0aC5wb3coMTAsYyk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4uaW50XyhjKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9YT1NYXRoLnBvdygxMCxjKTtjPU1hdGgucm91bmQoYiphKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5zdHIkPVxuZnVuY3Rpb24oYSxiKXtpZihpc05hTih0aGlzLnYpKXJldHVyblwibmFuXCI7dm9pZCAwPT09YiYmKGI9ITApO2lmKEluZmluaXR5PT10aGlzLnYpcmV0dXJuXCJpbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmYilyZXR1cm5cIi1pbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmIWIpcmV0dXJuXCJpbmZcIjtiPWI/dGhpcy52Ok1hdGguYWJzKHRoaXMudik7aWYodm9pZCAwPT09YXx8MTA9PT1hKXt2YXIgYz1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yi50b1ByZWNpc2lvbigxNik6Yi50b1ByZWNpc2lvbigxMik7dmFyIGQ9Yy5pbmRleE9mKFwiLlwiKTthPWIudG9TdHJpbmcoKS5zbGljZSgwLGQpO2Q9Yi50b1N0cmluZygpLnNsaWNlKGQpO2EubWF0Y2goL14tPzAkLykmJmQuc2xpY2UoMSkubWF0Y2goL14wezQsfS8pJiYoYz0xMj5jLmxlbmd0aD9iLnRvRXhwb25lbnRpYWwoKTpiLnRvRXhwb25lbnRpYWwoMTEpKTtpZigwPmMuaW5kZXhPZihcImVcIikmJjA8PWMuaW5kZXhPZihcIi5cIikpe2Zvcig7XCIwXCI9PVxuYy5jaGFyQXQoYy5sZW5ndGgtMSk7KWM9Yy5zdWJzdHJpbmcoMCxjLmxlbmd0aC0xKTtcIi5cIj09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJihjKz1cIjBcIil9Yz1jLnJlcGxhY2UoL1xcLjArZS8sXCJlXCIsXCJpXCIpO2M9Yy5yZXBsYWNlKC8oZVstK10pKFsxLTldKSQvLFwiJDEwJDJcIik7Yz1jLnJlcGxhY2UoLzArKGUuKikvLFwiJDFcIil9ZWxzZSBjPWIudG9TdHJpbmcoYSk7MD09PXRoaXMudiYmLUluZmluaXR5PT09MS90aGlzLnYmJihjPVwiLVwiK2MpOzA+Yy5pbmRleE9mKFwiLlwiKSYmMD5jLmluZGV4T2YoXCJFXCIpJiYwPmMuaW5kZXhPZihcImVcIikmJihjKz1cIi4wXCIpO3JldHVybiBjfTtTay5idWlsdGluLmZsb2F0Xy5weTIkbWV0aG9kcz17fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI7YS5uYiRmbG9hdCYmKGI9YS5uYiRmbG9hdCgpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5yZXR1cm4gYi52fWZ1bmN0aW9uIGMoYSxiLGMpe2lmKGM9PT1Tay5idWlsdGluLmNvbXBsZXgucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGEsYik7Yz1uZXcgYy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmNvbXBsZXguY2FsbChjLGEsYik7cmV0dXJuIGN9ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtjb25zdCBkPXRoaXMucmVhbCxlPXRoaXMuaW1hZzt2YXIgZj1jLnJlYWw7Y29uc3QgZz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKWM9Yy5pbWFnO2Vsc2UgaWYoXCJudW1iZXJcIj09PXR5cGVvZiBnKWY9ZyxjPTA7ZWxzZSBpZihKU0JJLl9faXNCaWdJbnQoZykpe2lmKHZvaWQgMD09PWIpe2lmKGY9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGcpKSxJbmZpbml0eT09Znx8LUluZmluaXR5PT1mKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7fWVsc2UgZj1cbmcudG9TdHJpbmcoKTtjPTB9ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoZCxlLGYsYyl9fWZ1bmN0aW9uIGUoYSxiLGMsZCl7dmFyIGU9TWF0aC5hYnMoYyk7Y29uc3QgZj1NYXRoLmFicyhkKTtpZihlPj1mKXtpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtlPWQvYztjKz1kKmU7ZD0oYStiKmUpL2M7YT0oYi1hKmUpL2N9ZWxzZSBmPj1lPyhlPWMvZCxjPWMqZStkLFNrLmFzc2VydHMuYXNzZXJ0KDAhPT1kKSxkPShhKmUrYikvYyxhPShiKmUtYSkvYyk6YT1kPU5hTjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGEpfWZ1bmN0aW9uIGYoYSxiLGMsZCl7aWYoMD09PWMmJjA9PT1kKXtkPTE7dmFyIGU9MH1lbHNlIGlmKDA9PT1hJiYwPT09Yil7aWYoMCE9PWR8fDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtcbmU9ZD0wfWVsc2V7Y29uc3QgZj1NYXRoLmh5cG90KGEsYik7ZT1NYXRoLnBvdyhmLGMpO2E9TWF0aC5hdGFuMihiLGEpO2MqPWE7MCE9PWQmJihlLz1NYXRoLmV4cChhKmQpLGMrPWQqTWF0aC5sb2coZikpO2Q9ZSpNYXRoLmNvcyhjKTtlKj1NYXRoLnNpbihjKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGUpfWZ1bmN0aW9uIGwoYSxiLGMpe2xldCBkPTE7dmFyIGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleCgxLDApO2ZvcihhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTswPGQmJmM+PWQ7KWMmZCYmKGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChlLnJlYWwqYS5yZWFsLWUuaW1hZyphLmltYWcsZS5yZWFsKmEuaW1hZythLnJlYWwqZS5pbWFnKSksZDw8PTEsYT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGEucmVhbCphLnJlYWwtYS5pbWFnKmEuaW1hZywyKmEucmVhbCphLmltYWcpO3JldHVybiBlfWZ1bmN0aW9uIGgoYSxiLGMsZCxlKXtlPSExO3N3aXRjaChiKXtjYXNlIFwiZVwiOmNhc2UgXCJmXCI6Y2FzZSBcImdcIjpicmVhaztcbmNhc2UgXCJFXCI6ZT0hMDtiPVwiZVwiO2JyZWFrO2Nhc2UgXCJGXCI6ZT0hMDtiPVwiZlwiO2JyZWFrO2Nhc2UgXCJyXCI6aWYoMCE9PWMpdGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7Yz0xNztiPVwiZ1wiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7fWlmKGlzTmFOKGEpKWE9XCJuYW5cIjtlbHNlIGlmKEluZmluaXR5PT09YSlhPVwiaW5mXCI7ZWxzZSBpZigtSW5maW5pdHk9PT1hKWE9XCItaW5mXCI7ZWxzZXtkJmguUHlfRFRTRl9BRERfRE9UXzAmJihiPVwiZ1wiKTt2YXIgZj1cIiVcIisoZCZoLlB5X0RUU0ZfQUxUP1wiI1wiOlwiXCIpO251bGwhPWMmJihmPWYrXCIuXCIrYyk7Zj1uZXcgU2suYnVpbHRpbi5zdHIoZitiKTthPWYubmIkcmVtYWluZGVyKG5ldyBTay5idWlsdGluLmZsb2F0XyhhKSk7YT1hLnZ9ZCZoLlB5X0RUU0ZfU0lHTiYmXCItXCIhPT1hWzBdJiYoYT1cIitcIithKTtlJiYoYT1hLnRvVXBwZXJDYXNlKCkpO3JldHVybiBhfVNrLmJ1aWx0aW4uY29tcGxleD1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjb21wbGV4XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleCxcImJhZCBjYWxsIHRvIGNvbXBsZXggY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLnJlYWw9YTt0aGlzLmltYWc9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDcmVhdGUgYSBjb21wbGV4IG51bWJlciBmcm9tIGEgcmVhbCBwYXJ0IGFuZCBhbiBvcHRpb25hbCBpbWFnaW5hcnkgcGFydC5cXG5cXG5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuXCIsdHAkaGFzaCgpe3ZhciBhPShuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSkudHAkaGFzaCgpO2E9MTAwMyoobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZykpLnRwJGhhc2goKSthO3JldHVybiBTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkKGEpP1xuYToobmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLkJpZ0ludChhKSkpLnRwJGhhc2goKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGIsZSl7Yj1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImNvbXBsZXhcIixbXCJyZWFsXCIsXCJpbWFnXCJdLGIsZSxbbnVsbCxudWxsXSk7e3ZhciBmPWJbMV0sZztsZXQgaz1lPSExO3ZhciBoPWJbMF07aWYobnVsbCE9aCYmaC5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uY29tcGxleCYmbnVsbD09ZillPWg7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGgpKXtpZihudWxsIT1mKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmcgaWYgZmlyc3QgaXMgYSBzdHJpbmdcIik7ZT1Tay5idWlsdGluLmNvbXBsZXguY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKGgsdGhpcyl9ZWxzZXtpZihudWxsIT1mJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJnIGNhbid0IGJlIGEgc3RyaW5nXCIpO1xubnVsbD09aD9iPW51bGw6KGI9U2suYWJzdHIubG9va3VwU3BlY2lhbChoLFNrLmJ1aWx0aW4uc3RyLiRjb21wbGV4KSxiPXZvaWQgMCE9PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW10pOm51bGwpO2lmKG51bGwhPWImJmIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl7aWYoIWQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0XCIpO2g9Yn1pZihudWxsIT1oJiZ2b2lkIDA9PT1oLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtpZihudWxsIT1mJiZ2b2lkIDA9PT1mLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciwgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtudWxsPT1oP2g9Yj0wOmQoaCk/KGI9aC5yZWFsLGg9aC5pbWFnLGU9ITApOihiPWEoaCksaD0wKTtudWxsPT1mP2Y9Zz0wOmQoZik/KGc9Zi5yZWFsLGY9Zi5pbWFnLGs9ITApOihnPWEoZiksZj0wKTshMD09PWsmJihiLT1mKTshMD09PWUmJihnKz1oKTtlPWMoYixnLHRoaXMpfX1yZXR1cm4gZX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jKXtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpfHxkKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVyc1wiKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGIoZnVuY3Rpb24oYSxiLGQsZSl7YT1hPT1kJiZiPT1lO3JldHVyblwiRXFcIj09PWM/YTohYX0sITApLmNhbGwodGhpcyxhKX0sJHIoKXt7dmFyIGEsXG5iO2xldCBlPWE9XCJcIjt2YXIgYz10aGlzLnJlYWw7dmFyIGQ9dGhpcy5pbWFnO2lmKGI9MD09PWMpYj0xPT0oYz8wPmM/LTE6MTowPjEvYz8tMToxKTtiPyhjPVwiXCIsYj1oKGQsXCJnXCIsbnVsbCwwLG51bGwpKTooYz1hPWgoYyxcImdcIixudWxsLDAsbnVsbCksYj1oKGQsXCJnXCIsbnVsbCxoLlB5X0RUU0ZfU0lHTixudWxsKSwwPT09ZCYmLUluZmluaXR5PT09MS9kJiZiJiZcIi1cIiE9PWJbMF0mJihiPVwiLVwiK2IpLGE9XCIoXCIsZT1cIilcIik7ZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIithK2MrYitcImpcIitlKX1yZXR1cm4gZH0sbmIkaW50KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludFwiKTt9LG5iJGxvbmcoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gbG9uZ1wiKTt9LG5iJGZsb2F0KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0XCIpO1xufSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCx0aGlzLmltYWcpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KC10aGlzLnJlYWwsLXRoaXMuaW1hZyl9LG5iJGJvb2woKXtyZXR1cm4gdGhpcy5yZWFsfHx0aGlzLmltYWd9LG5iJGFkZDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhK2MsYitkKSksbmIkc3VidHJhY3Q6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYS1jLGItZCkpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjLWEsZC1iKSksbmIkbXVsdGlwbHk6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYyphLWQqYixhKmQrYipjKSksbmIkZGl2aWRlOmIoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpiKChhLGIsYyxkKT0+ZShjLGQsYSxiKSksbmIkZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO1xufSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO30sbmIkcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkcmVmbGVjdGVkX3JlbWFpbmRlcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtb2QgY29tcGxleCBudW1iZXJzLlwiKTt9LG5iJGRpdm1vZChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9yIG1vZCBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRwb3dlcihhLGIpe2lmKG51bGwhPWImJiFTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCBtb2R1bG9cIik7cmV0dXJuIGsuY2FsbCh0aGlzLGEpfSxuYiRhYnMoKXt2YXIgYT1cbnRoaXMucmVhbDtjb25zdCBiPXRoaXMuaW1hZztpZighTnVtYmVyLmlzRmluaXRlKGEpfHwhTnVtYmVyLmlzRmluaXRlKGIpKXJldHVybiBJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGEpKTpJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGIpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTthPU1hdGguaHlwb3QoYSxiKTtpZighTnVtYmVyLmlzRmluaXRlKGEpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJhYnNvbHV0ZSB2YWx1ZSB0b28gbGFyZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LGdldHNldHM6e3JlYWw6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCl9LCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKX0sXG4kZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCh0aGlzLnJlYWwsLXRoaXMuaW1hZyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4LmNvbmp1Z2F0ZSgpIC0+IGNvbXBsZXhcXG5cXG5SZXR1cm4gdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGl0cyBhcmd1bWVudC4gKDMtNGopLmNvbmp1Z2F0ZSgpID09IDMrNGouXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZyldKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fZm9ybWF0X18gaXMgbm90IGltcGxlbWVudGVkIGZvciBjb21wbGV4IHR5cGUuXCIpO1xudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyByZXF1aXJlcyBzdHJcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5fX2Zvcm1hdF9fKCkgLT4gc3RyXFxuXFxuQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY29tcGxleFwiLFNrLmJ1aWx0aW4uY29tcGxleCk7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrQ29tcGxleCxnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X2p8al8vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmc9ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGU7dmFyIGQ9MCxlPTAsZj0hMTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKWE9U2suZmZpLnJlbWFwVG9KcyhhKTtlbHNlIGlmKFwic3RyaW5nXCIhPT1cbnR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm92aWRlZCB1bnN1cHBvcnRlZCBzdHJpbmctYWxpa2UgYXJndW1lbnRcIik7aWYoLTEhPT1hLmluZGV4T2YoXCJcXHgwMFwiKXx8MD09PWEubGVuZ3RofHxcIlwiPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmdcIik7dmFyIGg9MDthPWEucmVwbGFjZSgvaW5mfGluZmluaXR5L2dpLFwiSW5maW5pdHlcIik7Zm9yKGE9YS5yZXBsYWNlKC9uYW4vZ2ksXCJOYU5cIik7XCIgXCI9PT1hW2hdOyloKys7aWYoXCIoXCI9PT1hW2hdKWZvcihmPSEwLGgrKztcIiBcIj09PWFbaF07KWgrKztpZigtMSE9PWEuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGNvbXBsZXg6ICdcIithK1wiJ1wiKTthPWEuY2hhckF0KDApK2Euc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX12YXIgaz0vXig/OlsrLV0/KD86KD86KD86XFxkKlxcLlxcZCspfCg/OlxcZCtcXC4/KSkoPzpbZUVdWystXT9cXGQrKT98TmFOfEluZmluaXR5KSkvO1xudmFyIGw9YS5zdWJzdHIoaCk7dmFyIHA9bC5tYXRjaChrKTtpZihudWxsIT09cClpZihoKz1wWzBdLmxlbmd0aCxcImpcIj09PWFbaF18fFwiSlwiPT09YVtoXSllPXBhcnNlRmxvYXQocFswXSksaCsrO2Vsc2UgaWYoXCIrXCI9PT1hW2hdfHxcIi1cIj09PWFbaF0pe2Q9cGFyc2VGbG9hdChwWzBdKTtwPWEuc3Vic3RyKGgpLm1hdGNoKGspO251bGwhPT1wPyhlPXBhcnNlRmxvYXQocFswXSksaCs9cFswXS5sZW5ndGgpOihlPVwiK1wiPT09YVtoXT8xOi0xLGgrKyk7aWYoXCJqXCIhPT1hW2hdJiZcIkpcIiE9PWFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtoKyt9ZWxzZSBkPXBhcnNlRmxvYXQocFswXSk7ZWxzZSBwPXA9bC5tYXRjaCgvXihbKy1dP1tqSl0pLyksbnVsbCE9PXAmJihlPTE9PT1wWzBdLmxlbmd0aD8xOlwiK1wiPT09cFswXVswXT8xOi0xLGgrPXBbMF0ubGVuZ3RoKTtmb3IoO1wiIFwiPT09YVtoXTspaCsrO2lmKGYpe2lmKFwiKVwiIT09XG5hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7Zm9yKGgrKztcIiBcIj09PWFbaF07KWgrK31pZihhLmxlbmd0aCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtyZXR1cm4gYyhkLGUsYil9O2NvbnN0IGs9YigoYSxiLGMsZCk9Pntjb25zdCBnPWN8MDtyZXR1cm4gMD09PWQmJmM9PT1nPygxMDA8Z3x8LTEwMD5nP2E9ZihhLGIsZywwKTowPGc/YT1sKGEsYixnKTooYT1sKGEsYiwtZyksYT1lKDEsMCxhLnJlYWwsYS5pbWFnKSksYSk6ZihhLGIsYyxkKX0pO2guUHlfRFRTRl9TSUdOPTE7aC5QeV9EVFNGX0FERF9ET1RfMD0yO2guUHlfRFRTRl9BTFQ9NDtoLlB5X0RUU1RfRklOSVRFPTA7aC5QeV9EVFNUX0lORklOSVRFPTE7aC5QeV9EVFNUX05BTj0yfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc2xpY2U9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNsaWNlXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3ZvaWQgMD09PWMmJnZvaWQgMD09PWImJihjPWEsYT1Tay5idWlsdGluLm5vbmUubm9uZSQpO3ZvaWQgMD09PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWM7dGhpcy5zdGVwPWJ9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJzbGljZShzdG9wKVxcbnNsaWNlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXFxuXFxuQ3JlYXRlIGEgc2xpY2Ugb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZCBzbGljaW5nIChlLmcuIGFbMDoxMDoyXSkuXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInNsaWNlXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2xpY2VcIixhLDEsMyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnNsaWNlKC4uLmEpfSxcbiRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RhcnQpLGM9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0b3ApLGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJzbGljZShcIithK1wiLCBcIitjK1wiLCBcIitiK1wiKVwiKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihhLm9iJHR5cGUhPT1Tay5idWlsdGluLnNsaWNlKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPW5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLnN0YXJ0LHRoaXMuc3RvcCx0aGlzLnN0ZXBdKTthPW5ldyBTay5idWlsdGluLnR1cGxlKFthLnN0YXJ0LGEuc3RvcCxhLnN0ZXBdKTtyZXR1cm4gYi50cCRyaWNoY29tcGFyZShhLGMpfX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGFydH19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGVwfX0sc3RvcDp7JGdldCgpe3JldHVybiB0aGlzLnN0b3B9fX0sXG5tZXRob2RzOntpbmRpY2VzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxlbmd0aCBzaG91bGQgbm90IGJlIG5lZ2F0aXZlXCIpO2NvbnN0IHtzdGFydDpjLHN0b3A6YixzdGVwOmV9PXRoaXMuc2xpY2UkaW5kaWNlcyhhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oYyksbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSl9LCRkb2M6XCJTLmluZGljZXMobGVuKSAtPiAoc3RhcnQsIHN0b3AsIHN0cmlkZSlcXG5cXG5Bc3N1bWluZyBhIHNlcXVlbmNlIG9mIGxlbmd0aCBsZW4sIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIHN0b3BcXG5pbmRpY2VzLCBhbmQgdGhlIHN0cmlkZSBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIHNsaWNlIGRlc2NyaWJlZCBieVxcblMuIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlXFxuaGFuZGxpbmcgb2Ygbm9ybWFsIHNsaWNlcy5cIixcbiR0ZXh0c2lnOm51bGwsJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3NsaWNlJGFzX2luZGljZXMoYSl7bGV0IGM7dmFyIGI9YT9hPT5Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIE5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpOmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7aWYoU2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGVwKSljPTE7ZWxzZSBpZihjPWIodGhpcy5zdGVwKSwwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVyb1wiKTthPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RhcnQpP251bGw6Yih0aGlzLnN0YXJ0KTtiPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RvcCk/bnVsbDpcbmIodGhpcy5zdG9wKTtyZXR1cm57c3RhcnQ6YSxzdG9wOmIsc3RlcDpjfX0sJHdydChhLGMsYixlLGYpe2Y9Zj9iPT5KU0JJLl9faXNCaWdJbnQoYik/SlNCSS5hZGQoYixKU0JJLkJpZ0ludChhKSk6YithOmI9PmIrYTswPGU/KG51bGw9PT1jP2M9MDowPmMmJihjPWYoYyksMD5jJiYoYz0wKSksbnVsbD09PWI/Yj1hOmI+YT9iPWE6MD5iJiYoYj1mKGIpKSk6KG51bGw9PT1jP2M9YS0xOmM+PWE/Yz1hLTE6MD5jJiYoYz1mKGMpKSxudWxsPT09Yj9iPS0xOjA+YiYmKGI9ZihiKSwwPmImJihiPS0xKSkpO3JldHVybntzdGFydDpjLHN0b3A6YixzdGVwOmV9fSxzbGljZSRpbmRpY2VzKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkYXNfaW5kaWNlcyghMCxjKTtyZXR1cm4gdGhpcy4kd3J0KGEsYixlLGYsYyl9LHNzc2l0ZXIkKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkaW5kaWNlcyhhLCEwKTtpZigwPGYpZm9yKGE9YjthPFxuZTthKz1mKWMoYSk7ZWxzZSBmb3IoYT1iO2E+ZTthKz1mKWMoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0PWZ1bmN0aW9uKGEsYyxiKXthPWEuc3EkbGVuZ3RoKCk7dm9pZCAwPT09Y3x8U2suYnVpbHRpbi5jaGVja05vbmUoYyk/Yz0wOihjPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+YyYmKGMrPWEsMD5jJiYoYz0wKSkpO3ZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpP2I9YTooYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKSwwPmI/KGIrPWEsMD5iJiYoYj0wKSk6Yj5hJiYoYj1hKSk7cmV0dXJue3N0YXJ0OmMsZW5kOmJ9fX0sZnVuY3Rpb24obSxcbnEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBTay5idWlsdGluLmNoZWNrQW55U2V0KGIpP2EuY2FsbCh0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBjKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCYmYS50cCRoYXNoPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYT1uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpKTtyZXR1cm4gYX1tPXt9O1NrLmJ1aWx0aW4uc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQsXCJCYWQgY2FsbCB0byBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtcbmNvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pLGIucHVzaCghMCk7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoYik7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwic2V0KCkgLT4gbmV3IGVtcHR5IHNldCBvYmplY3RcXG5zZXQoaXRlcmFibGUpIC0+IG5ldyBzZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2V0XCIsYSwwLDEpO3RoaXMuc2V0JGNsZWFyKCk7cmV0dXJuKGE9YVswXSkmJnRoaXMuc2V0JHVwZGF0ZShhKX0sdHAkbmV3OlNrLmdlbmVyaWMubmV3LFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMuc2skYXNhcnJheSgpLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz8wPT09YS5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKClcIik6dGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zZXQ/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKHtcIithLmpvaW4oXCIsIFwiKStcIn0pXCIpOm5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLFxuYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO3N3aXRjaChiKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpyZXR1cm4gYT10aGlzPT09YT8hMDp0aGlzLmdldCRzaXplKCkhPT1hLmdldCRzaXplKCk/ITE6U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKSxcIkVxXCI9PT1iP2E6IWE7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzPT09YXx8U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKTtjYXNlIFwiR3RFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpO2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk8YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk+YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpfX0sXG5uYiRzdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5pb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkeG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmRpZmZlcmVuY2VfdXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX2FuZDphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmludGVyc2VjdGlvbl91cGRhdGUuJG1ldGguY2FsbCh0aGlzLFxuYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9vcjphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV94b3I6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe2E9YyhhKTtyZXR1cm4gdGhpcy52LnNxJGNvbnRhaW5zKGEpfX0sbWV0aG9kczp7YWRkOnskbWV0aChhKXt0aGlzLnNldCRhZGQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LlxcblxcblRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuXCJ9LFxuY2xlYXI6eyRtZXRoKCl7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLnNldCRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBzZXQuXCJ9LGRpc2NhcmQ6eyRtZXRoKGEpe2E9YyhhKTt0aGlzLnNldCRkaXNjYXJkKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy5cIn0sZGlmZmVyZW5jZTp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkZGlmZmVyZW5jZV91cGRhdGUoYSkpLCgpPT5iKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gb3IgbW9yZSBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYnV0IG5vdCB0aGUgb3RoZXJzLilcIn0sZGlmZmVyZW5jZV91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT50aGlzLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIG9mIGFub3RoZXIgc2V0IGZyb20gdGhpcyBzZXQuXCJ9LGludGVyc2VjdGlvbjp7JG1ldGgoLi4uYSl7cmV0dXJuIHRoaXMuc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKVwifSxpbnRlcnNlY3Rpb25fdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpLGE9Pnt0aGlzLnN3YXAkYm9kaWVzKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSxpc2Rpc2pvaW50OnskbWV0aChhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZih0aGlzLnNxJGNvbnRhaW5zKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxcbmE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0d28gc2V0cyBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uXCJ9LGlzc3Vic2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRpc3N1YnNldChhKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC5cIn0saXNzdXBlcnNldDp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+YS5zZXQkaXNzdWJzZXQodGhpcykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC5cIn0scG9wOnskbWV0aCgpe2lmKDA9PT10aGlzLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXCJwb3AgZnJvbSBhbiBlbXB0eSBzZXRcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnYucG9waXRlbSxbdGhpcy52XSkudlswXX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC5cXG5SYWlzZXMgS2V5RXJyb3IgaWYgdGhlIHNldCBpcyBlbXB0eS5cIn0scmVtb3ZlOnskbWV0aChhKXtjb25zdCBiPWMoYSk7aWYodGhpcy52Lm1wJGxvb2t1cChiKSlyZXR1cm4gdGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYiksU2suYnVpbHRpbi5ub25lLm5vbmUkO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci5cXG5cXG5JZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlOnskbWV0aChhKXtsZXQgYjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSxhPT57Yj1hO3JldHVybiBiLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUodGhpcyl9LCgpPT5iKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSx1bmlvbjp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PmIuc2V0JHVwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSB1bmlvbiBvZiBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pXCJ9LHVwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLFxuYT0+dGhpcy5zZXQkdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIG90aGVycy5cIn19LHByb3RvOk9iamVjdC5hc3NpZ24obSx7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2skYXNhcnJheSgpfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnYuc3EkbGVuZ3RoKCl9LHNldCRhZGQoYSl7dGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYSwhMCl9LHNldCRtYWtlX2Jhc2V0eXBlKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5uZXcgdGhpcy5zayRidWlsdGluQmFzZShhKSl9LHNldCRkaXNjYXJkKGEpe3JldHVybiB0aGlzLnYucG9wJGl0ZW0oYSl9LHNldCRjbGVhcigpe3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKX0sc2V0JGNvcHkoKXtjb25zdCBhPVxubmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7YS52PXRoaXMudi5kaWN0JGNvcHkoKTtyZXR1cm4gYX0sc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGRpc2NhcmQoYSl9KX0sc2V0JGludGVyc2VjdGlvbihhKXtjb25zdCBiPW5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc3EkY29udGFpbnMoYSkmJmIuc2V0JGFkZChhKX0pLCgpPT5iKX0sc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKXtpZighYS5sZW5ndGgpcmV0dXJuIHRoaXMuc2V0JGNvcHkoKTtsZXQgYj10aGlzO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5Tay5taXNjZXZhbC5jaGFpbihiLnNldCRpbnRlcnNlY3Rpb24oYSksYT0+e2I9YX0pKSwoKT0+Yil9LFxuc2V0JGlzc3Vic2V0KGEpe2NvbnN0IGI9dGhpcy5nZXQkc2l6ZSgpLGM9YS5nZXQkc2l6ZSgpO2lmKGI+YylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZighYS5zcSRjb250YWlucyhjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkfSxzZXQkc3ltbWV0cmljX2RpZmZfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3ZvaWQgMD09PXRoaXMuc2V0JGRpc2NhcmQoYSkmJnRoaXMuc2V0JGFkZChhKX0pfSxzZXQkdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGFkZChhKX0pfSxzd2FwJGJvZGllcyhhKXt0aGlzLnY9YS52fX0pfSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zZXRcIixcblNrLmJ1aWx0aW4uc2V0KTtxPVNrLmJ1aWx0aW4uc2V0LnByb3RvdHlwZTtTay5idWlsdGluLmZyb3plbnNldD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnJvemVuc2V0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXQsXCJiYWQgY2FsbCB0byBmcm96ZW4gc2V0IC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBBcnJheSBhbmQgJ25ldydcIik7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJmcm96ZW5zZXQoKSAtPiBlbXB0eSBmcm96ZW5zZXQgb2JqZWN0XFxuZnJvemVuc2V0KGl0ZXJhYmxlKSAtPiBmcm96ZW5zZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gaW1tdXRhYmxlIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy5cIixcbnRwJGhhc2goKXtsZXQgYT0xOTI3ODY4MjM3O2NvbnN0IGI9dGhpcy5zayRhc2FycmF5KCk7YSo9Yi5sZW5ndGgrMTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKyl7Y29uc3QgZT1Tay5hYnN0ci5vYmplY3RIYXNoKGJbY10pO2FePTM2NDQ3OTgxNjcqKGVeZTw8MTZeODk4Njk3NDcpfXJldHVybiA2OTA2OSphKzkwNzEzMzkyM30sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiZnJvemVuc2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiZnJvemVuc2V0XCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwIT09YSYmYS5vYiR0eXBlPT09U2suYnVpbHRpbi5mcm96ZW5zZXQ/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoYSk6XG5Tay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQpfSwkcjpxLiRyLHRwJGl0ZXI6cS50cCRpdGVyLHRwJHJpY2hjb21wYXJlOnEudHAkcmljaGNvbXBhcmUsbmIkc3VidHJhY3Q6cS5uYiRzdWJ0cmFjdCxuYiRhbmQ6cS5uYiRhbmQsbmIkb3I6cS5uYiRvcixuYiR4b3I6cS5uYiR4b3Isc3EkbGVuZ3RoOnEuc3EkbGVuZ3RoLHNxJGNvbnRhaW5zOnEuc3EkY29udGFpbnN9LG1ldGhvZHM6e2NvcHk6T2JqZWN0LmFzc2lnbih7fSxxLmNvcHkuZCRkZWYseyRtZXRoKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT10aGlzLnNrJGJ1aWx0aW5CYXNlP3RoaXM6bmV3IFNrLmJ1aWx0aW4uZnJvemVuc2V0KHRoaXMuc2skYXNhcnJheSgpKX19KSxkaWZmZXJlbmNlOnEuZGlmZmVyZW5jZS5kJGRlZixpbnRlcnNlY3Rpb246cS5pbnRlcnNlY3Rpb24uZCRkZWYsaXNkaXNqb2ludDpxLmlzZGlzam9pbnQuZCRkZWYsaXNzdWJzZXQ6cS5pc3N1YnNldC5kJGRlZixpc3N1cGVyc2V0OnEuaXNzdXBlcnNldC5kJGRlZixcbnN5bW1ldHJpY19kaWZmZXJlbmNlOnEuc3ltbWV0cmljX2RpZmZlcmVuY2UuZCRkZWYsdW5pb246cS51bmlvbi5kJGRlZn0scHJvdG86T2JqZWN0LmFzc2lnbih7JHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlLnRwJG5ldyhhKSxhPT57Yy52PWEudjtyZXR1cm4gY30pfX0sbSl9KTtTay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUse3Y6e3ZhbHVlOm5ldyBTay5idWlsdGluLmRpY3QoW10pLGVudW1lcmFibGU6ITB9LGluJHJlcHI6e3ZhbHVlOiExLGVudW1lcmFibGU6ITB9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5mcm96ZW5zZXRcIixTay5idWlsdGluLmZyb3plbnNldCk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwic2V0X2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCk7dGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJpbnQ9ZnVuY3Rpb24oYSxjKXtsZXQgW2IsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByaW50XCIsW1wic2VwXCIsXCJlbmRcIixcImZpbGVcIixcImZsdXNoXCJdLFtdLGMpO2lmKHZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKWI9XCIgXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1lfHxTay5idWlsdGluLmNoZWNrTm9uZShlKSllPVwiXFxuXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGUpKWU9ZS4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShlKSk7bGV0IGw7aWYodm9pZCAwIT09ZiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpJiYobD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSx2b2lkIDA9PT1sKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShmKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dyaXRlJ1wiKTtjb25zdCBoPW5ldyBTay5idWlsdGluLnN0cihhLm1hcChhPT4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS50b1N0cmluZygpKS5qb2luKGIpK2UpO1xuaWYodm9pZCAwIT09bClTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobCxbaF0pO2Vsc2UgcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxhPT4obD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEuJGQuc3Rkb3V0LFNrLmJ1aWx0aW4uc3RyLiR3cml0ZSkpJiZTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkobCxbaF0pKX07U2suYnVpbHRpbi5wcmludC5jb19mYXN0Y2FsbD0xfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubW9kdWxlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtb2R1bGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLiRkPXt9fSxzbG90czp7dHAkZG9jOlwiQ3JlYXRlIGEgbW9kdWxlIG9iamVjdC5cXG5cXG5UaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOyB0aGUgb3B0aW9uYWwgZG9jIGFyZ3VtZW50IGNhbiBoYXZlIGFueSB0eXBlLlwiLHRwJGdldGF0dHIoYSxjKXt2YXIgYj10aGlzLiRkW2EuJG1hbmdsZWRdO1xuaWYodm9pZCAwIT09YilyZXR1cm4gYjtiPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1iKXtjb25zdCBhPWIudHAkZGVzY3JfZ2V0O3JldHVybiBhP2EuY2FsbChiLHRoaXMsdGhpcy5vYiR0eXBlLGMpOmJ9Y29uc3QgZT10aGlzLiRkLl9fZ2V0YXR0cl9fO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSksYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sdHAkc2V0YXR0cjpTay5nZW5lcmljLnNldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtjb25zdCBbYixlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1vZHVsZVwiLFtcIm5hbWVcIixcImRvY1wiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1xuU2suYnVpbHRpbi5weUNoZWNrVHlwZShcIm1vZHVsZVwiLFwic3RyaW5nXCIsYik7dGhpcy5pbml0JGRpY3QoYixlKX0sJHIoKXtsZXQgYT10aGlzLmdldCRuYW1lKCk7aWYodm9pZCAwIT09YSl7dmFyIGM9dGhpcy5nZXQkbW9kX3JlcHJmKCk7aWYodm9pZCAwIT09YylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW3RoaXNdKX1hPXZvaWQgMD09PWE/XCInPydcIjphO2M9dGhpcy5mcm9tJGZpbGUoKTtjPXZvaWQgMD09PWM/dGhpcy5lbXB0eV9vciRsb2FkZXIoKTpjO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8bW9kdWxlIFwiK2ErYytcIj5cIil9fSxnZXRzZXRzOntfX2RpY3RfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHkodGhpcy4kZCl9fX0sbWV0aG9kczp7X19kaXJfXzp7JG1ldGgoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZGljdCk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnlcIik7XG5jb25zdCBjPWEubXAkbG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaXIpO3JldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKTpuZXcgU2suYnVpbHRpbi5saXN0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJfX2Rpcl9fKCkgLT4gbGlzdFxcbnNwZWNpYWxpemVkIGRpcigpIGltcGxlbWVudGF0aW9uXCJ9fSxwcm90bzp7aW5pdCRkaWN0KGEsYyl7dGhpcy4kZC5fX25hbWVfXz1hO3RoaXMuJGQuX19kb2NfXz1jO3RoaXMuJGQuX19wYWNrYWdlX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19zcGVjX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19sb2FkZXJfXz1Tay5idWlsdGluLm5vbmUubm9uZSR9LHNrJGF0dHJFcnJvcigpe2NvbnN0IGE9dGhpcy5nZXQkbmFtZSgpO3JldHVybiB2b2lkIDA9PT1hP1wibW9kdWxlXCI6XCJtb2R1bGUgXCIrYX0sZ2V0JG5hbWUoKXtjb25zdCBhPVxudGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtyZXR1cm4gYSYmU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZnJvbSRmaWxlKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGZpbGUpO3JldHVybiBhJiZcIiBmcm9tIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSl9LGVtcHR5X29yJGxvYWRlcigpe2lmKHRoaXMuJGpzJiZ0aGlzLiRqcy5pbmNsdWRlcyhcIiRidWlsdGlubW9kdWxlXCIpKXJldHVyblwiIChidWlsdC1pbilcIjtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbG9hZGVyKTtyZXR1cm4gdm9pZCAwPT09YXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/XCJcIjpcIiAoXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIilcIn0sZ2V0JG1vZF9yZXByZigpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiBhJiZhLnRwJGdldGF0dHIodGhpcy5zdHIkbW9kX3JlcHIpfSxcbnN0ciRtb2RfcmVwcjpuZXcgU2suYnVpbHRpbi5zdHIoXCJtb2R1bGVfcmVwclwiKX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1vZHVsZVwiLFNrLmJ1aWx0aW4ubW9kdWxlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0cnVjdHNlcV90eXBlcz17fTtTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxPWZ1bmN0aW9uKGEsYyxiLGUpe2NvbnN0IGY9YStcIi5cIitjLGw9W107YT1bXTtmb3IobGV0IGMgaW4gYilsLnB1c2goYyksYS5wdXNoKGJbY10pO2I9e307Zm9yKGxldCBjPTA7YzxsLmxlbmd0aDtjKyspYltsW2NdXT17JGdldCgpe3JldHVybiB0aGlzLnZbY119LCRkb2M6YVtjXX07dmFyIGg9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhmLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgoQXJyYXkuaXNBcnJheShhKXx8dm9pZCAwPT09YSkmJnRoaXMgaW5zdGFuY2VvZiBoKTtTay5idWlsdGluLnR1cGxlLmNhbGwodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLnR1cGxlLFxuc2xvdHM6e3RwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrT25lQXJnKGYsYSxiKTtiPVtdO2E9YVswXTtmb3IobGV0IGM9U2suYWJzdHIuaXRlcihhKSxkPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9Yy50cCRpdGVybmV4dCgpKWIucHVzaChkKTtpZihiLmxlbmd0aCE9bC5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGYrXCIoKSB0YWtlcyBhIFwiK2wubGVuZ3RoK1wiLXNlcXVlbmNlIChcIitiLmxlbmd0aCtcIi1zZXF1ZW5jZSBnaXZlbilcIik7cmV0dXJuIG5ldyBoKGIpfSx0cCRkb2M6ZT9lOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe3ZhciBhO2lmKDA9PT10aGlzLnYubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIigpXCIpO3ZhciBiPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoOysrYSliW2FdPWxbYV0rXCI9XCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbYV0pO2E9Yi5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cblwiLFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoXCIrYStcIilcIil9fSxtZXRob2RzOntfX3JlZHVjZV9fOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX3JlZHVjZV9fIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTt9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6Yixwcm90bzp7bnVtX3NlcXVlbmNlX2ZpZWxkczpuZXcgU2suYnVpbHRpbi5pbnRfKGwubGVuZ3RoKX19KTtyZXR1cm4gaH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcVwiLFNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZ2VuZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImdlbmVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsO2lmKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIGludGVybmFsIGNhbGwgdG8gZ2VuZXJhdG9yLCB1c2UgJ25ldydcIik7XG50aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy5naSRydW5uaW5nPSExO3RoaXMuZ2kkcmVzdW1lYXQ9MDt0aGlzLmdpJHNlbnR2YWx1ZT12b2lkIDA7dGhpcy5naSRsb2NhbHM9e307dGhpcy5naSRjZWxscz17fTtpZigwPGIubGVuZ3RoKWZvcihjPTA7YzxhLmNvX3Zhcm5hbWVzLmxlbmd0aDsrK2MpdGhpcy5naSRsb2NhbHNbYS5jb192YXJuYW1lc1tjXV09YltjXTtpZih2b2lkIDAhPT1mKWZvcihsIGluIGYpZVtsXT1mW2xdO3RoaXMuZnVuY19jbG9zdXJlPWV9fSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmVyYXRvciBvYmplY3QgXCIrdGhpcy5mdW5jX2NvZGUuY29fbmFtZS52K1wiPlwiKX19LGl0ZXJuZXh0KGEsYyl7dmFyIGI9dGhpczt0aGlzLmdpJHJ1bm5pbmc9ITA7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLmdpJHNlbnR2YWx1ZT1jO2M9W3RoaXNdO3RoaXMuZnVuY19jbG9zdXJlJiZcbmMucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIGZ1bmN0aW9uIGwoYyl7aWYoYyBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pe2lmKGEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGwsYyk7Yz1Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9Yi5naSRydW5uaW5nPSExO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWMpO2lmKGMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIGIuZ2kkcmVzdW1lYXQ9Y1swXSxjPWNbMV19KHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGMpKX0sbWV0aG9kczp7c2VuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoITAsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsXFxucmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLlwifX19KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZ2VuZXJhdG9yXCIsU2suYnVpbHRpbi5nZW5lcmF0b3IpO1NrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcj1mdW5jdGlvbihhLGMpe3ZhciBiLGU9bmV3IFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKG51bGwsbnVsbCxudWxsKTtlLnRwJGl0ZXJuZXh0PWE7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1jW2JdKTtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yXCIsU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbGU9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmlsZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGIpO3RoaXMubW9kZT1jO3RoaXMubmFtZT1Tay5mZmkucmVtYXBUb0pzKGEpO3RoaXMuY2xvc2VkPSExO2lmKFwiL2Rldi9zdGRvdXRcIj09PXRoaXMubmFtZSl0aGlzLmRhdGEkPVxuU2suYnVpbHRpbi5ub25lLm5vbmUkLHRoaXMuZmlsZW5vPTE7ZWxzZSBpZihcIi9kZXYvc3RkaW5cIj09PXRoaXMubmFtZSl0aGlzLmZpbGVubz0wO2Vsc2UgaWYoXCIvZGV2L3N0ZGVyclwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTI7ZWxzZXtpZihcIndcIj09PVNrLmZmaS5yZW1hcFRvSnModGhpcy5tb2RlKSl0aGlzLmZpbGVubz1Tay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubysrO2Vsc2UgZm9yKGUgaW4gdGhpcy5maWxlbm89U2suaW5Ccm93c2VyPzEwOjExLHRoaXMuZGF0YSQ9U2sucmVhZChhLnYpLHRoaXMubGluZUxpc3Q9dGhpcy5kYXRhJC5zcGxpdChcIlxcblwiKSx0aGlzLmxpbmVMaXN0PXRoaXMubGluZUxpc3Quc2xpY2UoMCwtMSksdGhpcy5saW5lTGlzdCl0aGlzLmxpbmVMaXN0W2VdKz1cIlxcblwiO3RoaXMuY3VycmVudExpbmU9MH10aGlzLnBvcyQ9MDtTay5maWxlb3BlbiYmMTA8PXRoaXMuZmlsZW5vJiZTay5maWxlb3Blbih0aGlzKTtyZXR1cm4gdGhpc307U2suYnVpbHRpbi5maWxlLmN1cnJlbnRGaWxlbm89XG4xMjtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKFwiZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSxTay5idWlsdGluLm9iamVjdCk7U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrKHRoaXMuY2xvc2VkP1wiY2xvc2VkXCI6XCJvcGVuXCIpK1wiZmlsZSAnXCIrdGhpcy5uYW1lK1wiJywgbW9kZSAnXCIrU2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpK1wiJz5cIil9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHAkaXRlcj1mdW5jdGlvbigpe3ZhciBhPXt0cCRpdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LCRvYmo6dGhpcywkaW5kZXg6dGhpcy5jdXJyZW50TGluZSwkbGluZXM6dGhpcy5saW5lTGlzdCx0cCRpdGVybmV4dDpmdW5jdGlvbigpe2lmKCEoYS4kaW5kZXg+PWEuJGxpbmVzLmxlbmd0aCkpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLiRsaW5lc1thLiRpbmRleCsrXSl9fTtcbnJldHVybiBhfTtTay5hYnN0ci5zZXRVcFNsb3RzKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2VudGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuX19leGl0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2UsW2FdKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmNsb3NlZD0hMDtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5mbHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe30pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuZmlsZW5vPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlsZW5vfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLmlzYXR0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiExfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1hLmRhdGEkLmxlbmd0aDtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTt2YXIgZT12b2lkIDA9PT1jP2I6U2suZmZpLnJlbWFwVG9KcyhjKTtlPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsZSkpO2EucG9zJD12b2lkIDA9PT1jP2I6YS5wb3MkK1NrLmZmaS5yZW1hcFRvSnMoYyk7YS5wb3MkPj1iJiYoYS5wb3MkPWIpO3JldHVybiBlfSk7U2suYnVpbHRpbi5maWxlLiRyZWFkbGluZT1mdW5jdGlvbihhLGMsYil7aWYoMD09PWEuZmlsZW5vKXthPVNrLmZmaS5yZW1hcFRvSnMoYik7YT1Tay5pbnB1dGZ1bihhP1xuYTpcIlwiKTtpZihhIGluc3RhbmNlb2YgUHJvbWlzZXx8YSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGEudGhlbil7dmFyIGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247ZS5yZXN1bWU9ZnVuY3Rpb24oKXtpZihlLmRhdGEuZXJyb3IpdGhyb3cgZS5kYXRhLmVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZS5kYXRhLnJlc3VsdCl9O2UuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBlfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9Yz1cIlwiO2EuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihjPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5maWxlLiRyZWFkbGluZShhLGMsdm9pZCAwKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmVzPVxubmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe2lmKDA9PT1hLmZpbGVubylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlYWRsaW5lcyBpbnMndCBpbXBsZW1lbnRlZCBiZWNhdXNlIHRoZSB3ZWIgZG9lc24ndCBzdXBwb3J0IEN0cmwrRFwiKTt2YXIgYj1bXTtmb3IoYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5zZWVrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGIpe2M9U2suZmZpLnJlbWFwVG9KcyhjKTt2b2lkIDA9PT1iJiYoYj0wKTswPT09Yj9hLnBvcyQ9YzoxPT1iP2EucG9zJD1hLmRhdGEkLmxlbmd0aCtjOjI9PWImJihhLnBvcyQ9YS5kYXRhJC5sZW5ndGgrYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xuU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50ZWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYS5wb3MkKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHJ1bmNhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuZmFpbCgpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS53cml0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLm1vZGUpO1NrLmZmaS5yZW1hcFRvSnMoYyk7aWYoXCJ3XCI9PT1ifHxcIndiXCI9PT1ifHxcImFcIj09PWJ8fFwiYWJcIj09PWIpaWYoU2suZmlsZXdyaXRlKXtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTsxPT09YS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmZpbGV3cml0ZShhLGMpfWVsc2UgMT09PVxuYS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmFzc2VydHMuZmFpbCgpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZpbGVcIixTay5idWlsdGluLmZpbGUpfSxmdW5jdGlvbihtLHEpe1NrLmZmaT1Tay5mZml8fHt9O1NrLmZmaS5yZW1hcFRvUHk9ZnVuY3Rpb24oYSl7dmFyIGM7aWYobnVsbD09PWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO2lmKGEub2IkdHlwZXx8YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIGE7aWYoXCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXt2YXIgYj1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpe2I9XG5bXTtmb3IoYyBpbiBhKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLmFzc2skKGEpO2lmKFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYSk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZ1bmMoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIHJlbWFwIHR5cGUgXCIrdHlwZW9mIGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb1B5XCIsU2suZmZpLnJlbWFwVG9QeSk7U2suZmZpLnJlbWFwVG9Kcz1mdW5jdGlvbihhKXt2YXIgYyxcbmI7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl7dmFyIGU9e307YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxjXSk9PntiPVNrLmZmaS5yZW1hcFRvSnMoYSk7ZVtiXT1Tay5mZmkucmVtYXBUb0pzKGMpfSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpe2U9W107Zm9yKGM9MDtjPGEudi5sZW5ndGg7KytjKWUucHVzaChTay5mZmkucmVtYXBUb0pzKGEudltjXSkpO3JldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2wpcmV0dXJuIGEudj8hMDohMTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxcImJvb2xlYW5cIj09PXR5cGVvZiBhfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7XG5pZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvSnNcIixTay5mZmkucmVtYXBUb0pzKTtTay5mZmkuY2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/YTpmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuY2FsbGJhY2tcIixTay5mZmkuY2FsbGJhY2spO1NrLmZmaS5zdGR3cmFwPWZ1bmN0aW9uKGEsYyl7YT1uZXcgYTthLnY9YztyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnN0ZHdyYXBcIixTay5mZmkuc3Rkd3JhcCk7U2suZmZpLmJhc2ljd3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0eXBlIGZvciBiYXNpY3dyYXBcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5iYXNpY3dyYXBcIixTay5mZmkuYmFzaWN3cmFwKTtTay5mZmkudW53cmFwbz1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS51bndyYXBvXCIsU2suZmZpLnVud3JhcG8pO1NrLmZmaS51bndyYXBuPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT9udWxsOmEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG5cIixTay5mZmkudW53cmFwbil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsZSl7YT12b2lkIDA9PT1hP2E6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Yj12b2lkIDA9PT1cbmI/YjpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKTtlPXZvaWQgMD09PWU/ZTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih2b2lkIDA9PT1iJiZ2b2lkIDA9PT1lKWI9YSxhPTAsZT0xO2Vsc2UgaWYodm9pZCAwPT09ZSllPTE7ZWxzZSBpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm9cIik7Y29uc3QgZD1bXTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEmJlwibnVtYmVyXCI9PT10eXBlb2YgYiYmXCJudW1iZXJcIj09PXR5cGVvZiBlKWlmKDA8ZSlmb3IodmFyIGY9YTtmPGI7Zis9ZSlkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhmKSk7ZWxzZSBmb3IoZj1hO2Y+YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNle2E9Zj1KU0JJLkJpZ0ludChhKTtlPUpTQkkuQmlnSW50KGUpO2I9SlNCSS5CaWdJbnQoYik7aWYoSlNCSS5ncmVhdGVyVGhhbihlLEpTQkkuX19aRVJPKSlmb3IoO0pTQkkubGVzc1RoYW4oZixcbmIpOylkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhjKGYpKSksZj1KU0JJLmFkZChmLGUpO2Vsc2UgZm9yKDtKU0JJLmdyZWF0ZXJUaGFuKGYsYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7YT1jKGEpO2U9YyhlKTtiPWMoYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhhLGIsZSxkKX1mdW5jdGlvbiBjKGEpe3JldHVybiBKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX01BWF9TQUZFKSYmSlNCSS5ncmVhdGVyVGhhbihhLEpTQkkuX19NSU5fU0FGRSk/SlNCSS50b051bWJlcihhKTphfVNrLmJ1aWx0aW4ucmFuZ2VfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJyYW5nZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWI7dGhpcy5zdGVwPWM7dGhpcy52PWR9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLFxudHAkZG9jOlwicmFuZ2Uoc3RvcCkgLT4gcmFuZ2Ugb2JqZWN0XFxucmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gcmFuZ2Ugb2JqZWN0XFxuXFxuUmV0dXJuIGFuIG9iamVjdCB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKVxcbnRvIHN0b3AgKGV4Y2x1c2l2ZSkgYnkgc3RlcC4gIHJhbmdlKGksIGopIHByb2R1Y2VzIGksIGkrMSwgaSsyLCAuLi4sIGotMS5cXG5zdGFydCBkZWZhdWx0cyB0byAwLCBhbmQgc3RvcCBpcyBvbWl0dGVkISAgcmFuZ2UoNCkgcHJvZHVjZXMgMCwgMSwgMiwgMy5cXG5UaGVzZSBhcmUgZXhhY3RseSB0aGUgdmFsaWQgaW5kaWNlcyBmb3IgYSBsaXN0IG9mIDQgZWxlbWVudHMuXFxuV2hlbiBzdGVwIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCAob3IgZGVjcmVtZW50KS5cIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmFuZ2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyYW5nZVwiLFxuYiwxLDMpO3JldHVybiBhKGJbMF0sYlsxXSxiWzJdKX0sJHIoKXtsZXQgYT1cInJhbmdlKFwiK3RoaXMuc3RhcnQrXCIsIFwiK3RoaXMuc3RvcDsxIT10aGlzLnN0ZXAmJihhKz1cIiwgXCIrdGhpcy5zdGVwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGErXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4ucmFuZ2VfKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPW5ldyBTay5idWlsdGluLmxpc3QoYS52KTtyZXR1cm4obmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYpKS50cCRyaWNoY29tcGFyZShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnYubGVuZ3RofSxzcSRjb250YWlucyhhKXtjb25zdCBiPXRoaXMudjtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxcbmJbY10sXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTswPmEmJihhPXRoaXMudi5sZW5ndGgrYSk7aWYoMD5hfHxhPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W10sYz10aGlzLnY7YS5zc3NpdGVyJChjLmxlbmd0aCxhPT57Yi5wdXNoKGNbYV0pfSk7bGV0IHtzdGFydDpkLHN0b3A6ZSxzdGVwOmZ9PWEuc2xpY2UkaW5kaWNlcyhjLmxlbmd0aCk7ZD1Tay5taXNjZXZhbC5hc0luZGV4KGNbZF0pfHx0aGlzLnN0YXJ0O2U9U2subWlzY2V2YWwuYXNJbmRleChjW2VdKXx8dGhpcy5zdG9wO2Y9XG5cIm51bWJlclwiPT09dHlwZW9mIHRoaXMuc3RlcD9mKnRoaXMuc3RlcDpKU0JJLm11bHRpcGx5KHRoaXMuc3RlcCxKU0JJLkJpZ0ludChmKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhkLGUsZixiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJyYW5nZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO319LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGFydCl9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGVwKX19LHN0b3A6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0b3ApfX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGUodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yLlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2NdLFwiRXFcIikmJmIrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcIn0saW5kZXg6eyRtZXRoKGEpe2ZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspaWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2JdLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiaXMgbm90IGluIHJhbmdlXCIpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGluZGV4IG9mIHZhbHVlLlxcblJhaXNlIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifX0sXG5wcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO3ZhciBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRzZXE9YS52O3RoaXMuJGluZGV4PXRoaXMuJHNlcS5sZW5ndGgtMX0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dfSxcbm1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLnJhbmdlPVNrLmJ1aWx0aW4ueHJhbmdlPWZ1bmN0aW9uKGIsYyxlKXtiPWEoYixjLGUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIudil9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZW51bWVyYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImVudW1lcmF0ZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZW51bWVyYXRlKSl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdlbnVtZXJhdGUnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvclwiKTt0aGlzLiRpdGVyYWJsZT1hO3RoaXMuJGluZGV4PWM7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9U2subWlzY2V2YWwuY2hhaW4odGhpcy4kaXRlcmFibGUudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgrKyksYV0pfSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYW4gZW51bWVyYXRlIG9iamVjdC5cXG5cXG4gIGl0ZXJhYmxlXFxuICAgIGFuIG9iamVjdCBzdXBwb3J0aW5nIGl0ZXJhdGlvblxcblxcblRoZSBlbnVtZXJhdGUgb2JqZWN0IHlpZWxkcyBwYWlycyBjb250YWluaW5nIGEgY291bnQgKGZyb20gc3RhcnQsIHdoaWNoXFxuZGVmYXVsdHMgdG8gemVybykgYW5kIGEgdmFsdWUgeWllbGRlZCBieSB0aGUgaXRlcmFibGUgYXJndW1lbnQuXFxuXFxuZW51bWVyYXRlIGlzIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDpcXG4gICAgKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uXCIsdHAkbmV3KGEsYyl7bGV0IFtiLFxuZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJlbnVtZXJhdGVcIixbXCJpdGVyYWJsZVwiLFwic3RhcnRcIl0sYSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7Yj1Tay5hYnN0ci5pdGVyKGIpO2U9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coZSk7aWYodGhpcz09PVNrLmJ1aWx0aW4uZW51bWVyYXRlLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZW51bWVyYXRlKGIsZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmVudW1lcmF0ZS5jYWxsKGEsYixlKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5lbnVtZXJhdGVcIixTay5idWlsdGluLmVudW1lcmF0ZSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5maWx0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImZpbHRlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVyYWJsZT1jfSxpdGVybmV4dChhKXtjb25zdCBjPVxuU2subWlzY2V2YWwuaXRlckZvcih0aGlzLiRpdGVyYWJsZSxhPT5Tay5taXNjZXZhbC5jaGFpbih0aGlzLmNoZWNrJGZpbHRlcihhKSxhPT5hP25ldyBTay5taXNjZXZhbC5CcmVhayhhKTp2b2lkIDApKTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBpdGVyYXRvciB5aWVsZGluZyB0aG9zZSBpdGVtcyBvZiBpdGVyYWJsZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSlcXG5pcyB0cnVlLiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuXCIsdHAkbmV3KGEsYyl7bGV0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZmlsdGVyXCIsW1wicHJlZGljYXRlXCIsXCJpdGVyYWJsZVwiXSxhLGMsW10pO2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDpiO2U9U2suYWJzdHIuaXRlcihlKTtpZih0aGlzPT09U2suYnVpbHRpbi5maWx0ZXJfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsdGVyXyhiLFxuZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmZpbHRlcl8uY2FsbChhLGIsZSk7cmV0dXJuIGF9fSxwcm90bzp7Y2hlY2skZmlsdGVyKGEpe2xldCBjO2M9bnVsbD09PXRoaXMuJGZ1bmM/YTpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxbYV0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGI9PlNrLm1pc2NldmFsLmlzVHJ1ZShiKT9hOnZvaWQgMCl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsdGVyX1wiLFNrLmJ1aWx0aW4uZmlsdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tYXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIm1hcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVycz1jfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMuJGZ1bmMsYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwibWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tXFx4M2UgbWFwIG9iamVjdFxcblxcbk1ha2UgYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgZnVuY3Rpb24gdXNpbmcgYXJndW1lbnRzIGZyb21cXG5lYWNoIG9mIHRoZSBpdGVyYWJsZXMuICBTdG9wcyB3aGVuIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJtYXBcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJtYXBcIixhLDIpO2M9YVswXTtjb25zdCBiPVxuW107Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspYi5wdXNoKFNrLmFic3RyLml0ZXIoYVtjXSkpO2lmKHRoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5tYXBfKGMsYik7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLm1hcF8uY2FsbChhLGMsYik7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubWFwX1wiLFNrLmJ1aWx0aW4ubWFwXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5yZXZlcnNlZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyZXZlcnNlZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpZHg9YS5zcSRsZW5ndGgoKS0xO3RoaXMuJHNlcT1hO3JldHVybiB0aGlzfSxpdGVybmV4dChhKXtpZighKDA+dGhpcy4kaWR4KSl7dmFyIGM9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0odGhpcy4kc2VxLG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4LS0pLFxuYSksYT0+e2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3IpdGhpcy4kaWR4PS0xO2Vsc2UgdGhyb3cgYTt9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX19LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlJiZTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmV2ZXJzZWRcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyZXZlcnNlZFwiLGEsMSwxKTthPWFbMF07Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJldmVyc2VkKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKXx8dm9pZCAwPT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFxuU2suYnVpbHRpbi5zdHIuJGxlbikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGEgc2VxdWVuY2VcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5yZXZlcnNlZChhKTtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ucmV2ZXJzZWQuY2FsbChjLGEpO3JldHVybiBjfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLiRpZHg/bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi56aXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInppcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpdGVycz1hOzA9PT1hLmxlbmd0aCYmXG4odGhpcy50cCRpdGVybmV4dD0oKT0+e30pfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOm5ldyBTay5idWlsdGluLnR1cGxlKGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcInppcChpdGVyMSBbLGl0ZXIyIFsuLi5dXSkgLS1cXHgzZSB6aXAgb2JqZWN0XFxuXFxuUmV0dXJuIGEgemlwIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLlwiLFxudHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4uemlwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ6aXBcIixjKTtjPVtdO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXRyeXtjLnB1c2goU2suYWJzdHIuaXRlcihhW2JdKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInppcCBhcmd1bWVudCAjXCIrKGIrMSkrXCIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt0aHJvdyBlO31pZih0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uemlwXyhjKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uemlwXy5jYWxsKGEsYyk7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uemlwX1wiLFNrLmJ1aWx0aW4uemlwXyl9LGZ1bmN0aW9uKG0scSl7dmFyIGE9e1RfRU5ETUFSS0VSOjAsVF9OQU1FOjEsXG5UX05VTUJFUjoyLFRfU1RSSU5HOjMsVF9ORVdMSU5FOjQsVF9JTkRFTlQ6NSxUX0RFREVOVDo2LFRfTFBBUjo3LFRfUlBBUjo4LFRfTFNRQjo5LFRfUlNRQjoxMCxUX0NPTE9OOjExLFRfQ09NTUE6MTIsVF9TRU1JOjEzLFRfUExVUzoxNCxUX01JTlVTOjE1LFRfU1RBUjoxNixUX1NMQVNIOjE3LFRfVkJBUjoxOCxUX0FNUEVSOjE5LFRfTEVTUzoyMCxUX0dSRUFURVI6MjEsVF9FUVVBTDoyMixUX0RPVDoyMyxUX1BFUkNFTlQ6MjQsVF9MQlJBQ0U6MjUsVF9SQlJBQ0U6MjYsVF9FUUVRVUFMOjI3LFRfTk9URVFVQUw6MjgsVF9MRVNTRVFVQUw6MjksVF9HUkVBVEVSRVFVQUw6MzAsVF9USUxERTozMSxUX0NJUkNVTUZMRVg6MzIsVF9MRUZUU0hJRlQ6MzMsVF9SSUdIVFNISUZUOjM0LFRfRE9VQkxFU1RBUjozNSxUX1BMVVNFUVVBTDozNixUX01JTkVRVUFMOjM3LFRfU1RBUkVRVUFMOjM4LFRfU0xBU0hFUVVBTDozOSxUX1BFUkNFTlRFUVVBTDo0MCxUX0FNUEVSRVFVQUw6NDEsVF9WQkFSRVFVQUw6NDIsXG5UX0NJUkNVTUZMRVhFUVVBTDo0MyxUX0xFRlRTSElGVEVRVUFMOjQ0LFRfUklHSFRTSElGVEVRVUFMOjQ1LFRfRE9VQkxFU1RBUkVRVUFMOjQ2LFRfRE9VQkxFU0xBU0g6NDcsVF9ET1VCTEVTTEFTSEVRVUFMOjQ4LFRfQVQ6NDksVF9BVEVRVUFMOjUwLFRfUkFSUk9XOjUxLFRfRUxMSVBTSVM6NTIsVF9PUDo1MyxUX0FXQUlUOjU0LFRfQVNZTkM6NTUsVF9FUlJPUlRPS0VOOjU2LFRfTlRfT0ZGU0VUOjI1NixUX05fVE9LRU5TOjYwLFRfQ09NTUVOVDo1NyxUX05MOjU4LFRfRU5DT0RJTkc6NTl9O209e1wiIT1cIjphLlRfTk9URVFVQUwsXCIlXCI6YS5UX1BFUkNFTlQsXCIlPVwiOmEuVF9QRVJDRU5URVFVQUwsXCImXCI6YS5UX0FNUEVSLFwiJj1cIjphLlRfQU1QRVJFUVVBTCxcIihcIjphLlRfTFBBUixcIilcIjphLlRfUlBBUixcIipcIjphLlRfU1RBUixcIioqXCI6YS5UX0RPVUJMRVNUQVIsXCIqKj1cIjphLlRfRE9VQkxFU1RBUkVRVUFMLFwiKj1cIjphLlRfU1RBUkVRVUFMLFwiK1wiOmEuVF9QTFVTLFwiKz1cIjphLlRfUExVU0VRVUFMLFxuXCIsXCI6YS5UX0NPTU1BLFwiLVwiOmEuVF9NSU5VUyxcIi09XCI6YS5UX01JTkVRVUFMLFwiLT5cIjphLlRfUkFSUk9XLFwiLlwiOmEuVF9ET1QsXCIuLi5cIjphLlRfRUxMSVBTSVMsXCIvXCI6YS5UX1NMQVNILFwiLy9cIjphLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjphLlRfRE9VQkxFU0xBU0hFUVVBTCxcIi89XCI6YS5UX1NMQVNIRVFVQUwsXCI6XCI6YS5UX0NPTE9OLFwiO1wiOmEuVF9TRU1JLFwiPFwiOmEuVF9MRVNTLFwiPDxcIjphLlRfTEVGVFNISUZULFwiPDw9XCI6YS5UX0xFRlRTSElGVEVRVUFMLFwiPD1cIjphLlRfTEVTU0VRVUFMLFwiPVwiOmEuVF9FUVVBTCxcIj09XCI6YS5UX0VRRVFVQUwsXCI+XCI6YS5UX0dSRUFURVIsXCI+PVwiOmEuVF9HUkVBVEVSRVFVQUwsXCI+PlwiOmEuVF9SSUdIVFNISUZULFwiPj49XCI6YS5UX1JJR0hUU0hJRlRFUVVBTCxcIkBcIjphLlRfQVQsXCJAPVwiOmEuVF9BVEVRVUFMLFwiW1wiOmEuVF9MU1FCLFwiXVwiOmEuVF9SU1FCLFwiXlwiOmEuVF9DSVJDVU1GTEVYLFwiXj1cIjphLlRfQ0lSQ1VNRkxFWEVRVUFMLFwie1wiOmEuVF9MQlJBQ0UsXG5cInxcIjphLlRfVkJBUixcInw9XCI6YS5UX1ZCQVJFUVVBTCxcIn1cIjphLlRfUkJSQUNFLFwiflwiOmEuVF9USUxERX07dmFyIGM9e307KGZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIGEpY1thW2JdXT1ifSkoKTtbXCJ0b2tfbmFtZVwiLFwiSVNURVJNSU5BTFwiLFwiSVNOT05URVJNSU5BTFwiLFwiSVNFT0ZcIl0uY29uY2F0KE9iamVjdC5rZXlzKGMpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXX0pKTtTay50b2tlbj17fTtTay50b2tlbi50b2tlbnM9YTtTay50b2tlbi50b2tfbmFtZT1jO1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTPW07U2sudG9rZW4uSVNURVJNSU5BTD1mdW5jdGlvbihiKXtyZXR1cm4gYjxhLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU05PTlRFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPj1hLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU0VPRj1mdW5jdGlvbihiKXtyZXR1cm4gYj09YS5UX0VORE1BUktFUn07U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW5cIixTay50b2tlbik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rZW5zXCIsXG5Tay50b2tlbi50b2tlbnMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva19uYW1lXCIsU2sudG9rZW4udG9rX25hbWUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTXCIpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTVEVSTUlOQUxcIixTay50b2tlbi5JU1RFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU05PTlRFUk1JTkFMXCIsU2sudG9rZW4uSVNOT05URVJNSU5BTCk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNFT0ZcIixTay50b2tlbi5JU0VPRil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyxkLGUpe3RoaXMudHlwZT1hO3RoaXMuc3RyaW5nPWI7dGhpcy5zdGFydD1jO3RoaXMuZW5kPWQ7dGhpcy5saW5lPWV9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIihcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCJ8XCIpK1wiKVwifWZ1bmN0aW9uIGIoYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1xuXCI/XCJ9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGYoKXtyZXR1cm5cIiBGUiBSRiBCciBCUiBGciByIEIgUiBiIGJSIGYgcmIgckIgRiBSZiBVIHJGIHUgUkIgYnIgZlIgZnIgcmYgUmJcIi5zcGxpdChcIiBcIil9ZnVuY3Rpb24gbChhKXthP2RlbGV0ZSBTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFU1tcIjw+XCJdOlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl09U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUw7dD1PYmplY3Qua2V5cyhTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUykuc29ydCgpO3Y9Yy5hcHBseSh0aGlzLHQucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYSYmay50ZXN0KGEpP2EucmVwbGFjZShuLFwiXFxcXCQmXCIpOmF9KSk7Qj1jKFwiXFxcXHI/XFxcXG5cIix2KX12YXIgaD1Tay50b2tlbi50b2tlbnM7Y29uc3QgZD1Tay5idWlsdGluLlN5bnRheEVycm9yLGc9U2suYnVpbHRpbi5TeW50YXhFcnJvcjtcbmEucHJvdG90eXBlLmV4YWN0X3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlPT1oLlRfT1AmJnRoaXMuc3RyaW5nIGluIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTP1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW3RoaXMuc3RyaW5nXTp0aGlzLnR5cGV9O3ZhciBuPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxrPVJlZ0V4cChuLnNvdXJjZSk7Y29uc3QgcD1mdW5jdGlvbigpe3ZhciBhPWMoXCJbQS1aXVwiLFwiW2Etel1cIixcIltcXFxcdXsxMEI5OX0tXFxcXHV7MTBCOUN9XFxcXHV7MTEyQTl9XFxcXHV7MTE1REN9LVxcXFx1ezExNUREfVxcXFx1MDM0RlxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTE3QjQtXFxcXHUxN0I1XFxcXHUyMDY1XFxcXHUzMTY0XFxcXHVGRkEwXFxcXHVGRkYwLVxcXFx1RkZGOFxcXFx1e0UwMDAwfVxcXFx1e0UwMDAyfS1cXFxcdXtFMDAxRn1cXFxcdXtFMDA4MH0tXFxcXHV7RTAwRkZ9XFxcXHV7RTAxRjB9LVxcXFx1e0UwRkZGfVxcXFx1ezExMkE5fVxcXFx1MDBEN11cIixcIltcXFxcdTAyQjAtXFxcXHUwMkMxXFxcXHUwMkM2LVxcXFx1MDJEMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAyRUNcXFxcdTAyRUVcXFxcdTAzNzRcXFxcdTAzN0FcXFxcdTA1NTlcXFxcdTA2RTUtXFxcXHUwNkU2XFxcXHUwN0Y0LVxcXFx1MDdGNVxcXFx1MDk3MVxcXFx1MUM3OC1cXFxcdTFDN0RcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxREZELVxcXFx1MURGRlxcXFx1MkUyRlxcXFx1MzBGQ1xcXFx1QTY3RlxcXFx1QTY5Qy1cXFxcdUE2OURcXFxcdUE3MTctXFxcXHVBNzFGXFxcXHVBNzg4XFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGNzBcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHV7MTZGOTN9LVxcXFx1ezE2RjlGfVxcXFx1MDJEMC1cXFxcdTAyRDFcXFxcdTA2NDBcXFxcdTA3RkFcXFxcdTBFNDZcXFxcdTBFQzZcXFxcdTE4NDNcXFxcdTFBQTdcXFxcdTFDN0JcXFxcdTMwMDVcXFxcdTMwMzEtXFxcXHUzMDM1XFxcXHUzMDlELVxcXFx1MzA5RVxcXFx1MzBGQy1cXFxcdTMwRkVcXFxcdUEwMTVcXFxcdUE2MENcXFxcdUE5Q0ZcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdUFBRERcXFxcdUFBRjMtXFxcXHVBQUY0XFxcXHVGRjcwXFxcXHV7MTZCNDJ9LVxcXFx1ezE2QjQzfVxcXFx1ezE2RkUwfS1cXFxcdXsxNkZFMX1cXFxcdTAyQjAtXFxcXHUwMkI4XFxcXHUwMkMwLVxcXFx1MDJDMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAzN0FcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxRDc4XFxcXHUxRDlCLVxcXFx1MURCRlxcXFx1MjA3MVxcXFx1MjA3RlxcXFx1MjA5MC1cXFxcdTIwOUNcXFxcdTJDN0MtXFxcXHUyQzdEXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTc3MFxcXFx1QTdGOC1cXFxcdUE3RjlcXFxcdUFCNUMtXFxcXHVBQjVGXFxcXHVGRjlFLVxcXFx1RkY5RlxcXFx1MDJCMlxcXFx1MUQ2MlxcXFx1MURBNFxcXFx1MURBOFxcXFx1MjA3MVxcXFx1MkM3Q1xcXFx1MkUxOC1cXFxcdTJFMTlcXFxcdTJFMkZdXCIsXG5cIltcXFxcdTIxMzUtXFxcXHUyMTM4XFxcXHV7MUVFMDB9LVxcXFx1ezFFRTAzfVxcXFx1ezFFRTA1fS1cXFxcdXsxRUUxRn1cXFxcdXsxRUUyMX0tXFxcXHV7MUVFMjJ9XFxcXHV7MUVFMjR9XFxcXHV7MUVFMjd9XFxcXHV7MUVFMjl9LVxcXFx1ezFFRTMyfVxcXFx1ezFFRTM0fS1cXFxcdXsxRUUzN31cXFxcdXsxRUUzOX1cXFxcdXsxRUUzQn1cXFxcdXsxRUU0Mn1cXFxcdXsxRUU0N31cXFxcdXsxRUU0OX1cXFxcdXsxRUU0Qn1cXFxcdXsxRUU0RH0tXFxcXHV7MUVFNEZ9XFxcXHV7MUVFNTF9LVxcXFx1ezFFRTUyfVxcXFx1ezFFRTU0fVxcXFx1ezFFRTU3fVxcXFx1ezFFRTU5fVxcXFx1ezFFRTVCfVxcXFx1ezFFRTVEfVxcXFx1ezFFRTVGfVxcXFx1ezFFRTYxfS1cXFxcdXsxRUU2Mn1cXFxcdXsxRUU2NH1cXFxcdXsxRUU2N30tXFxcXHV7MUVFNkF9XFxcXHV7MUVFNkN9LVxcXFx1ezFFRTcyfVxcXFx1ezFFRTc0fS1cXFxcdXsxRUU3N31cXFxcdXsxRUU3OX0tXFxcXHV7MUVFN0N9XFxcXHV7MUVFN0V9XFxcXHV7MUVFODB9LVxcXFx1ezFFRTg5fVxcXFx1ezFFRThCfS1cXFxcdXsxRUU5Qn1cXFxcdXsxRUVBMX0tXFxcXHV7MUVFQTN9XFxcXHV7MUVFQTV9LVxcXFx1ezFFRUE5fVxcXFx1ezFFRUFCfS1cXFxcdXsxRUVCQn1cXFxcdTMwMDZcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RjkwMC1cXFxcdUZBNkRcXFxcdUZBNzAtXFxcXHVGQUQ5XFxcXHV7MTcwMDB9LVxcXFx1ezE4N0YxfVxcXFx1ezE4ODAwfS1cXFxcdXsxOEFGMn1cXFxcdXsxQjE3MH0tXFxcXHV7MUIyRkJ9XFxcXHV7MjAwMDB9LVxcXFx1ezJBNkQ2fVxcXFx1ezJBNzAwfS1cXFxcdXsyQjczNH1cXFxcdXsyQjc0MH0tXFxcXHV7MkI4MUR9XFxcXHV7MkI4MjB9LVxcXFx1ezJDRUExfVxcXFx1ezJDRUIwfS1cXFxcdXsyRUJFMH1cXFxcdXsyRjgwMH0tXFxcXHV7MkZBMUR9XFxcXHVBQUMwXFxcXHVBQUMyXFxcXHVGRTIwLVxcXFx1RkUyRlxcXFx1ezEwRDIyfS1cXFxcdXsxMEQyM31cXFxcdXsxMTM1RH1cXFxcdTAwQUFcXFxcdTAwQkFcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RkEwRS1cXFxcdUZBMEZcXFxcdUZBMTFcXFxcdUZBMTMtXFxcXHVGQTE0XFxcXHVGQTFGXFxcXHVGQTIxXFxcXHVGQTIzLVxcXFx1RkEyNFxcXFx1RkEyNy1cXFxcdUZBMjlcXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdTA2NzNcXFxcdTE3QTMtXFxcXHUxN0E0XFxcXHUwRTQwLVxcXFx1MEU0NFxcXFx1MEVDMC1cXFxcdTBFQzRcXFxcdTE5QjUtXFxcXHUxOUI3XFxcXHUxOUJBXFxcXHVBQUI1LVxcXFx1QUFCNlxcXFx1QUFCOVxcXFx1QUFCQi1cXFxcdUFBQkNdXCIsXG5cIltcXFxcdTMwMDdcXFxcdTMwMjEtXFxcXHUzMDI5XFxcXHUzMDM4LVxcXFx1MzAzQVxcXFx1MjE3MC1cXFxcdTIxN0ZcXFxcdTIxNjAtXFxcXHUyMTZGXVwiLFwiX1wiLFwiW1xcXFx1MTg4NS1cXFxcdTE4ODZcXFxcdTIxMThcXFxcdTIxMkVcXFxcdTMwOUItXFxcXHUzMDlDXVwiKSxiPWMoYSxcIltcXFxcdTEwNEEtXFxcXHUxMDRCXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAyRC1cXFxcdTEwMzBcXFxcdTEwMzFcXFxcdTEwMzItXFxcXHUxMDM2XFxcXHUxMDM4XFxcXHUxMDNCLVxcXFx1MTAzQ1xcXFx1MTAzRC1cXFxcdTEwM0VcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDU4LVxcXFx1MTA1OVxcXFx1MTA1RS1cXFxcdTEwNjBcXFxcdTEwNjJcXFxcdTEwNjctXFxcXHUxMDY4XFxcXHUxMDcxLVxcXFx1MTA3NFxcXFx1MTA4MlxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwODUtXFxcXHUxMDg2XFxcXHUxMDlDXFxcXHUxMDlEXFxcXHUxMDM3XFxcXHUxMDM5LVxcXFx1MTAzQVxcXFx1MTA4Ny1cXFxcdTEwOENcXFxcdTEwOERcXFxcdTEwOEZcXFxcdTEwOUEtXFxcXHUxMDlCXFxcXHVBOUU1XFxcXHVBQTdCXFxcXHVBQTdDXFxcXHVBQTdEXFxcXHVBOUU2XFxcXHVBQTcwXFxcXHUxMDRBLVxcXFx1MTA0Ql1cIixcIltcXFxcdTA5MDNcXFxcdTA5M0JcXFxcdTA5M0UtXFxcXHUwOTQwXFxcXHUwOTQ5LVxcXFx1MDk0Q1xcXFx1MDk0RS1cXFxcdTA5NEZcXFxcdTA5ODItXFxcXHUwOTgzXFxcXHUwOUJFLVxcXFx1MDlDMFxcXFx1MDlDNy1cXFxcdTA5QzhcXFxcdTA5Q0ItXFxcXHUwOUNDXFxcXHUwOUQ3XFxcXHUwQTAzXFxcXHUwQTNFLVxcXFx1MEE0MFxcXFx1MEE4M1xcXFx1MEFCRS1cXFxcdTBBQzBcXFxcdTBBQzlcXFxcdTBBQ0ItXFxcXHUwQUNDXFxcXHUwQjAyLVxcXFx1MEIwM1xcXFx1MEIzRVxcXFx1MEI0MFxcXFx1MEI0Ny1cXFxcdTBCNDhcXFxcdTBCNEItXFxcXHUwQjRDXFxcXHUwQjU3XFxcXHUwQkJFLVxcXFx1MEJCRlxcXFx1MEJDMS1cXFxcdTBCQzJcXFxcdTBCQzYtXFxcXHUwQkM4XFxcXHUwQkNBLVxcXFx1MEJDQ1xcXFx1MEJEN1xcXFx1MEMwMS1cXFxcdTBDMDNcXFxcdTBDNDEtXFxcXHUwQzQ0XFxcXHUwQzgyLVxcXFx1MEM4M1xcXFx1MENCRVxcXFx1MENDMC1cXFxcdTBDQzRcXFxcdTBDQzctXFxcXHUwQ0M4XFxcXHUwQ0NBLVxcXFx1MENDQlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEMDItXFxcXHUwRDAzXFxcXHUwRDNFLVxcXFx1MEQ0MFxcXFx1MEQ0Ni1cXFxcdTBENDhcXFxcdTBENEEtXFxcXHUwRDRDXFxcXHUwRDU3XFxcXHUwRDgyLVxcXFx1MEQ4M1xcXFx1MERDRi1cXFxcdTBERDFcXFxcdTBERDgtXFxcXHUwRERGXFxcXHUwREYyLVxcXFx1MERGM1xcXFx1MEY3RlxcXFx1MTAyQi1cXFxcdTEwMkNcXFxcdTEwMzFcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDU2LVxcXFx1MTA1N1xcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwODMtXFxcXHUxMDg0XFxcXHUxMDlDXFxcXHUxN0I2XFxcXHUxN0JFLVxcXFx1MTdDNVxcXFx1MTdDNy1cXFxcdTE3QzhcXFxcdTE5MjMtXFxcXHUxOTI2XFxcXHUxOTI5LVxcXFx1MTkyQlxcXFx1MTkzMC1cXFxcdTE5MzFcXFxcdTE5MzMtXFxcXHUxOTM4XFxcXHUxQTE5LVxcXFx1MUExQVxcXFx1MUE1NVxcXFx1MUE1N1xcXFx1MUE2MVxcXFx1MUE2My1cXFxcdTFBNjRcXFxcdTFBNkQtXFxcXHUxQTcyXFxcXHUxQjA0XFxcXHUxQjM1XFxcXHUxQjNCXFxcXHUxQjNELVxcXFx1MUI0MVxcXFx1MUI0M1xcXFx1MUI4MlxcXFx1MUJBMVxcXFx1MUJBNi1cXFxcdTFCQTdcXFxcdTFCRTdcXFxcdTFCRUEtXFxcXHUxQkVDXFxcXHUxQkVFXFxcXHUxQzI0LVxcXFx1MUMyQlxcXFx1MUMzNC1cXFxcdTFDMzVcXFxcdTFDRjItXFxcXHUxQ0YzXFxcXHVBODIzLVxcXFx1QTgyNFxcXFx1QTgyN1xcXFx1QTg4MC1cXFxcdUE4ODFcXFxcdUE4QjQtXFxcXHVBOEMzXFxcXHVBOTUyXFxcXHVBOTgzXFxcXHVBOUI0LVxcXFx1QTlCNVxcXFx1QTlCQS1cXFxcdUE5QkJcXFxcdUE5QkQtXFxcXHVBOUJGXFxcXHVBQTJGLVxcXFx1QUEzMFxcXFx1QUEzMy1cXFxcdUFBMzRcXFxcdUFBNERcXFxcdUFBRUJcXFxcdUFBRUUtXFxcXHVBQUVGXFxcXHVBQUY1XFxcXHVBQkUzLVxcXFx1QUJFNFxcXFx1QUJFNi1cXFxcdUFCRTdcXFxcdUFCRTktXFxcXHVBQkVBXFxcXHV7MTEwMDB9XFxcXHV7MTEwMDJ9XFxcXHV7MTEwODJ9XFxcXHV7MTEwQjB9LVxcXFx1ezExMEIyfVxcXFx1ezExMEI3fS1cXFxcdXsxMTBCOH1cXFxcdXsxMTEyQ31cXFxcdXsxMTE0NX0tXFxcXHV7MTExNDZ9XFxcXHV7MTExODJ9XFxcXHV7MTExQjN9LVxcXFx1ezExMUI1fVxcXFx1ezExMUJGfVxcXFx1ezExMjJDfS1cXFxcdXsxMTIyRX1cXFxcdXsxMTIzMn0tXFxcXHV7MTEyMzN9XFxcXHV7MTEyRTB9LVxcXFx1ezExMkUyfVxcXFx1ezExMzAyfS1cXFxcdXsxMTMwM31cXFxcdXsxMTMzRX0tXFxcXHV7MTEzM0Z9XFxcXHV7MTEzNDF9LVxcXFx1ezExMzQ0fVxcXFx1ezExMzQ3fS1cXFxcdXsxMTM0OH1cXFxcdXsxMTM0Qn0tXFxcXHV7MTEzNEN9XFxcXHV7MTEzNTd9XFxcXHV7MTEzNjJ9LVxcXFx1ezExMzYzfVxcXFx1ezExNDM1fS1cXFxcdXsxMTQzN31cXFxcdXsxMTQ0MH0tXFxcXHV7MTE0NDF9XFxcXHV7MTE0NDV9XFxcXHV7MTE0QjB9LVxcXFx1ezExNEIyfVxcXFx1ezExNEI5fVxcXFx1ezExNEJCfS1cXFxcdXsxMTRCRX1cXFxcdXsxMTRDMX1cXFxcdXsxMTVBRn0tXFxcXHV7MTE1QjF9XFxcXHV7MTE1Qjh9LVxcXFx1ezExNUJCfVxcXFx1ezExNUJFfVxcXFx1ezExNjMwfS1cXFxcdXsxMTYzMn1cXFxcdXsxMTYzQn0tXFxcXHV7MTE2M0N9XFxcXHV7MTE2M0V9XFxcXHV7MTE2QUN9XFxcXHV7MTE2QUV9LVxcXFx1ezExNkFGfVxcXFx1ezExNzIwfS1cXFxcdXsxMTcyMX1cXFxcdXsxMTcyNn1cXFxcdXsxMTgyQ30tXFxcXHV7MTE4MkV9XFxcXHV7MTE4Mzh9XFxcXHV7MTFBMzl9XFxcXHV7MTFBNTd9LVxcXFx1ezExQTU4fVxcXFx1ezExQTk3fVxcXFx1ezExQzJGfVxcXFx1ezExQzNFfVxcXFx1ezExQ0E5fVxcXFx1ezExQ0IxfVxcXFx1ezExQ0I0fVxcXFx1ezExRDhBfS1cXFxcdXsxMUQ4RX1cXFxcdXsxMUQ5M30tXFxcXHV7MTFEOTR9XFxcXHV7MTFEOTZ9XFxcXHV7MTFFRjV9LVxcXFx1ezExRUY2fVxcXFx1ezE2RjUxfS1cXFxcdXsxNkY3RX1cXFxcdTBGM0UtXFxcXHUwRjNGXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdTFCNDRcXFxcdTFCQUFcXFxcdTFDRTFcXFxcdTFDRjdcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHVBOTUzXFxcXHVBOUMwXFxcXHVBQTdCXFxcXHVBQTdEXFxcXHVBQkVDXFxcXHV7MTExQzB9XFxcXHV7MTEyMzV9XFxcXHV7MTEzNER9XFxcXHV7MTE2QjZ9XFxcXHV7MUQxNkR9LVxcXFx1ezFEMTcyfVxcXFx1MDlCRVxcXFx1MDlEN1xcXFx1MEIzRVxcXFx1MEI1N1xcXFx1MEJCRVxcXFx1MEJEN1xcXFx1MENDMlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEM0VcXFxcdTBENTdcXFxcdTBEQ0ZcXFxcdTBEREZcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHV7MTEzM0V9XFxcXHV7MTEzNTd9XFxcXHV7MTE0QjB9XFxcXHV7MTE0QkR9XFxcXHV7MTE1QUZ9XFxcXHV7MUQxNjV9XFxcXHV7MUQxNkV9LVxcXFx1ezFEMTcyfV1cIixcblwiW1xcXFx1ezFEN0NFfS1cXFxcdXsxRDdGRn1cXFxcdUZGMTAtXFxcXHVGRjE5XVwiLFwiXFxcXHUyMDQwXCIsXCJbXFxcXHUwMEI3XFxcXHUwMzg3XFxcXHUxMzY5LVxcXFx1MTM3MVxcXFx1MTlEQV1cIik7aWYoITE9PT1SZWdFeHAoKS51bmljb2RlKXJldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIsXCJ1XCIpO2E9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiX1wiKTtiPWMoYSxcIlswLTldXCIpO3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIpfSgpOyhmdW5jdGlvbihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXCIqXCJ9KShcIlxcXFxcXFxcXFxcXHI/XFxcXG5bIFxcXFxmXFxcXHRdKlwiKTtiKFwiI1teXFxcXHJcXFxcbl0qXCIpO209YyhcIlswLTldKD86Xz9bMC05XSkqXFxcXC4oPzpbMC05XSg/Ol8/WzAtOV0pKik/XCIsXCJcXFxcLlswLTldKD86Xz9bMC05XSkqXCIpK2IoXCJbZUVdWy0rXT9bMC05XSg/Ol8/WzAtOV0pKlwiKTt2YXIgdT1jKG0sXCJbMC05XSg/Ol8/WzAtOV0pKltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpLEE9YyhcIlswLTldKD86Xz9bMC05XSkqW2pKXVwiLFxudStcIltqSl1cIik7bT1jLmFwcGx5KG51bGwsZigpKTtxPWMobStcIicnJ1wiLG0rJ1wiXCJcIicpO2MobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKidcIixtKydcIlteXFxcXG5cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuXCJcXFxcXFxcXF0qKSpcIicpO3ZhciB0LHYsQjtsKCEwKTtTay50b2tlbi5zZXR1cFRva2Vucz1sO3ZhciBEPWMobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKlwiK2MoXCInXCIsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKicrYygnXCInLFwiXFxcXFxcXFxcXFxccj9cXFxcblwiKSksRT1jKFwiXFxcXFxcXFxcXFxccj9cXFxcbnwkXCIsXCIjW15cXFxcclxcXFxuXSpcIixxKSxGPXt9O209ZigpO2ZvcihsZXQgYSBvZiBtKUZbYStcIidcIl09XCJeW14nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteJ1xcXFxcXFxcXSopKidcIixGW2ErJ1wiJ109J15bXlwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXCJcXFxcXFxcXF0qKSpcIicsRlthK1wiJycnXCJdPVwiXlteJ1xcXFxcXFxcXSooPzooPzpcXFxcXFxcXC58Jyg/IScnKSlbXidcXFxcXFxcXF0qKSonJydcIixcbkZbYSsnXCJcIlwiJ109J15bXlwiXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXFxcXF0qKSpcIlwiXCInO2xldCBNPVtdLFY9W107Zm9yKGxldCBhIG9mIG0pTS5wdXNoKGErJ1wiJyksTS5wdXNoKGErXCInXCIpLFYucHVzaChhKydcIlwiXCInKSxWLnB1c2goYStcIicnJ1wiKTtTay5fdG9rZW5pemU9ZnVuY3Rpb24oYixmLGssbil7dmFyIGw9U2suX19mdXR1cmVfXy5weXRob24zP1wiXCI6XCIoPzpMPylcIjtsPWMoXCIwW3hYXSg/Ol8/WzAtOWEtZkEtRl0pK1wiK2wsXCIwW2JCXSg/Ol8/WzAxXSkrXCIrbCxTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsP1wiMChbb09dPykoPzpfP1swLTddKStcIitsOlwiMChbb09dKSg/Ol8/WzAtN10pK1wiK2wsXCIoPzowKD86Xz8wKSp8WzEtOV0oPzpfP1swLTldKSopXCIrbCk7bD1jKEEsdSxsKTtsPVwiWyBcXFxcZlxcXFx0XSpcIitjKEUsbCxCLEQsXCJcXFxcdytcIik7bD1uZXcgUmVnRXhwKGwpO3ZhciBtPTAsdD0wLHE9MCx2PVwiXCIseT0wLEc9bnVsbCxMPVswXSxILFQ9dm9pZCAwLFxuWD12b2lkIDAsSSxSO3ZvaWQgMCE9PWsmJihcInV0Zi04LXNpZ1wiPT1rJiYoaz1cInV0Zi04XCIpLG4obmV3IGEoaC5UX0VOQ09ESU5HLGssWzAsMF0sWzAsMF0sXCJcIikpKTtmb3IodmFyIEM9az1cIlwiOzspe3RyeXtrPUMsQz1mKCl9Y2F0Y2goTyl7Qz1cIlwifW0rPTE7dmFyIHc9MCxOPUMubGVuZ3RoO2lmKHYpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RyaW5nXCIsYixYWzBdLFhbMV0pO1QubGFzdEluZGV4PTA7dmFyIHI9VC5leGVjKEMpO2lmKHIpdz1JPXJbMF0ubGVuZ3RoLG4obmV3IGEoaC5UX1NUUklORyx2K0Muc3Vic3RyaW5nKDAsSSksWCxbbSxJXSxHK0MpKSx2PVwiXCIseT0wLEc9bnVsbDtlbHNle3kmJlwiXFxcXFxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMikmJlwiXFxcXFxcclxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMyk/KG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sditDLFgsW20sQy5sZW5ndGhdLEcpKSx2PVwiXCIsRz1udWxsKToodis9QyxHKz1DKTtjb250aW51ZX19ZWxzZSBpZigwIT1cbnR8fHEpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RhdGVtZW50XCIsYixtLDApO3E9MH1lbHNle2lmKCFDKWJyZWFrO2ZvcihIPTA7dzxOOyl7aWYoXCIgXCI9PUNbd10pSCs9MTtlbHNlIGlmKFwiXFx0XCI9PUNbd10pSD04Kk1hdGguZmxvb3IoSC84KzEpO2Vsc2UgaWYoXCJcXGZcIj09Q1t3XSlIPTA7ZWxzZSBicmVhazt3Kz0xfWlmKHc9PU4pYnJlYWs7aWYoZShcIiNcXHJcXG5cIixDW3ddKSl7aWYoXCIjXCI9PUNbd10pe0g9Qy5zdWJzdHJpbmcodyk7Zm9yKE49SC5sZW5ndGg7MDxOJiYtMSE9PVwiXFxyXFxuXCIuaW5kZXhPZihILmNoYXJBdChOLTEpKTstLU4pO049SC5zdWJzdHJpbmcoMCxOKTtuKG5ldyBhKGguVF9DT01NRU5ULE4sW20sd10sW20sdytOLmxlbmd0aF0sQykpO3crPU4ubGVuZ3RofW4obmV3IGEoaC5UX05MLEMuc3Vic3RyaW5nKHcpLFttLHddLFttLEMubGVuZ3RoXSxDKSk7Y29udGludWV9SD5MW0wubGVuZ3RoLTFdJiYoTC5wdXNoKEgpLG4obmV3IGEoaC5UX0lOREVOVCxcbkMuc3Vic3RyaW5nKHcpLFttLDBdLFttLHddLEMpKSk7Zm9yKDtIPExbTC5sZW5ndGgtMV07KXtpZighZShMLEgpKXRocm93IG5ldyBnKFwidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsXCIsYixtLHcpO0w9TC5zbGljZSgwLC0xKTtuKG5ldyBhKGguVF9ERURFTlQsXCJcIixbbSx3XSxbbSx3XSxDKSl9fWZvcig7dzxOOyl7Zm9yKEg9Qy5jaGFyQXQodyk7XCIgXCI9PT1IfHxcIlxcZlwiPT09SHx8XCJcXHRcIj09PUg7KXcrPTEsSD1DLmNoYXJBdCh3KTtpZihSPWwuZXhlYyhDLnN1YnN0cmluZyh3KSkpe2lmKEg9dyxJPUgrUlsxXS5sZW5ndGgsUj1bbSxIXSxyPVttLEldLHc9SSxIIT1JKXtJPUMuc3Vic3RyaW5nKEgsSSk7dmFyIHo9Q1tIXTtpZihlKFwiMDEyMzQ1Njc4OVwiLHopfHxcIi5cIj09eiYmXCIuXCIhPUkmJlwiLi4uXCIhPUkpbihuZXcgYShoLlRfTlVNQkVSLEksUixyLEMpKTtlbHNlIGlmKGUoXCJcXHJcXG5cIix6KSkwPHQ/bihuZXcgYShoLlRfTkwsSSxSLHIsQykpOlxubihuZXcgYShoLlRfTkVXTElORSxJLFIscixDKSk7ZWxzZSBpZihcIiNcIj09eiluKG5ldyBhKGguVF9DT01NRU5ULEksUixyLEMpKTtlbHNlIGlmKGUoVixJKSlpZihUPVJlZ0V4cChGW0ldKSxyPVQuZXhlYyhDLnN1YnN0cmluZyh3KSkpdz1yWzBdLmxlbmd0aCt3LEk9Qy5zdWJzdHJpbmcoSCx3KSxuKG5ldyBhKGguVF9TVFJJTkcsSSxSLFttLHddLEMpKTtlbHNle1g9W20sSF07dj1DLnN1YnN0cmluZyhIKTtHPUM7YnJlYWt9ZWxzZSBpZihlKE0seil8fGUoTSxJLnN1YnN0cmluZygwLDIpKXx8ZShNLEkuc3Vic3RyaW5nKDAsMykpKWlmKFwiXFxuXCI9PUlbSS5sZW5ndGgtMV0pe1g9W20sSF07VD1SZWdFeHAoRlt6XXx8RltJWzFdXXx8RltJWzJdXSk7dj1DLnN1YnN0cmluZyhIKTt5PTE7Rz1DO2JyZWFrfWVsc2UgbihuZXcgYShoLlRfU1RSSU5HLEksUixyLEMpKTtlbHNlIEg9ei5ub3JtYWxpemUoXCJORktDXCIpLHAudGVzdChIKT9uKG5ldyBhKGguVF9OQU1FLEksUixyLEMpKTpcIlxcXFxcIj09XG56P3E9MTooZShcIihbe1wiLHopP3QrPTE6ZShcIildfVwiLHopJiYtLXQsbihuZXcgYShoLlRfT1AsSSxSLHIsQykpKX19ZWxzZSBuKG5ldyBhKGguVF9FUlJPUlRPS0VOLENbd10sW20sd10sW20sdysxXSxDKSksdys9MX19ayYmIWUoXCJcXHJcXG5cIixrW2subGVuZ3RoLTFdKSYmbihuZXcgYShoLlRfTkVXTElORSxcIlwiLFttLTEsay5sZW5ndGhdLFttLTEsay5sZW5ndGgrMV0sXCJcIikpO2Zvcih2YXIgWiBpbiBMLnNsaWNlKDEpKW4obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLDBdLFttLDBdLFwiXCIpKTtuKG5ldyBhKGguVF9FTkRNQVJLRVIsXCJcIixbbSwwXSxbbSwwXSxcIlwiKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLl90b2tlbml6ZVwiLFNrLl90b2tlbml6ZSl9LGZ1bmN0aW9uKG0scSl7U2suT3BNYXA9e1wiKFwiOlNrLnRva2VuLnRva2Vucy5UX0xQQVIsXCIpXCI6U2sudG9rZW4udG9rZW5zLlRfUlBBUixcIltcIjpTay50b2tlbi50b2tlbnMuVF9MU1FCLFwiXVwiOlNrLnRva2VuLnRva2Vucy5UX1JTUUIsXCI6XCI6U2sudG9rZW4udG9rZW5zLlRfQ09MT04sXG5cIixcIjpTay50b2tlbi50b2tlbnMuVF9DT01NQSxcIjtcIjpTay50b2tlbi50b2tlbnMuVF9TRU1JLFwiK1wiOlNrLnRva2VuLnRva2Vucy5UX1BMVVMsXCItXCI6U2sudG9rZW4udG9rZW5zLlRfTUlOVVMsXCIqXCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUixcIi9cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSCxcInxcIjpTay50b2tlbi50b2tlbnMuVF9WQkFSLFwiJlwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSLFwiPFwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1MsXCI+XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUixcIj1cIjpTay50b2tlbi50b2tlbnMuVF9FUVVBTCxcIi5cIjpTay50b2tlbi50b2tlbnMuVF9ET1QsXCIlXCI6U2sudG9rZW4udG9rZW5zLlRfUEVSQ0VOVCxcImBcIjpTay50b2tlbi50b2tlbnMuVF9CQUNLUVVPVEUsXCJ7XCI6U2sudG9rZW4udG9rZW5zLlRfTEJSQUNFLFwifVwiOlNrLnRva2VuLnRva2Vucy5UX1JCUkFDRSxcIkBcIjpTay50b2tlbi50b2tlbnMuVF9BVCxcIkA9XCI6U2sudG9rZW4udG9rZW5zLlRfQVRFUVVBTCxcblwiPT1cIjpTay50b2tlbi50b2tlbnMuVF9FUUVRVUFMLFwiIT1cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw+XCI6U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUwsXCI8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1NFUVVBTCxcIj49XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUkVRVUFMLFwiflwiOlNrLnRva2VuLnRva2Vucy5UX1RJTERFLFwiXlwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVgsXCI8PFwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVCxcIj4+XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVCxcIioqXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUixcIis9XCI6U2sudG9rZW4udG9rZW5zLlRfUExVU0VRVUFMLFwiLT1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5FUVVBTCxcIio9XCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUkVRVUFMLFwiLz1cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSEVRVUFMLFwiJT1cIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5URVFVQUwsXCImPVwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSRVFVQUwsXG5cInw9XCI6U2sudG9rZW4udG9rZW5zLlRfVkJBUkVRVUFMLFwiXj1cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYRVFVQUwsXCI8PD1cIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlRFUVVBTCxcIj4+PVwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlRFUVVBTCxcIioqPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVJFUVVBTCxcIi8vXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLT5cIjpTay50b2tlbi50b2tlbnMuVF9SQVJST1csXCIuLi5cIjpTay50b2tlbi50b2tlbnMuVF9FTExJUFNJU307U2suUGFyc2VUYWJsZXM9e3N5bTp7YW5kX2V4cHI6MjU3LGFuZF90ZXN0OjI1OCxhbm5hc3NpZ246MjU5LGFyZ2xpc3Q6MjYwLGFyZ3VtZW50OjI2MSxhcml0aF9leHByOjI2Mixhc3NlcnRfc3RtdDoyNjMsYXN5bmNfZnVuY2RlZjoyNjQsYXN5bmNfc3RtdDoyNjUsYXRvbToyNjYsYXRvbV9leHByOjI2NyxcbmF1Z2Fzc2lnbjoyNjgsYnJlYWtfc3RtdDoyNjksY2xhc3NkZWY6MjcwLGNvbXBfZm9yOjI3MSxjb21wX2lmOjI3Mixjb21wX2l0ZXI6MjczLGNvbXBfb3A6Mjc0LGNvbXBhcmlzb246Mjc1LGNvbXBvdW5kX3N0bXQ6Mjc2LGNvbnRpbnVlX3N0bXQ6Mjc3LGRlYnVnZ2VyX3N0bXQ6Mjc4LGRlY29yYXRlZDoyNzksZGVjb3JhdG9yOjI4MCxkZWNvcmF0b3JzOjI4MSxkZWxfc3RtdDoyODIsZGljdG9yc2V0bWFrZXI6MjgzLGRvdHRlZF9hc19uYW1lOjI4NCxkb3R0ZWRfYXNfbmFtZXM6Mjg1LGRvdHRlZF9uYW1lOjI4NixlbmNvZGluZ19kZWNsOjI4NyxldmFsX2lucHV0OjI4OCxleGNlcHRfY2xhdXNlOjI4OSxleHByOjI5MCxleHByX3N0bXQ6MjkxLGV4cHJsaXN0OjI5MixmYWN0b3I6MjkzLGZpbGVfaW5wdXQ6Mjk0LGZsb3dfc3RtdDoyOTUsZm9yX3N0bXQ6Mjk2LGZ1bmNkZWY6Mjk3LGdsb2JhbF9zdG10OjI5OCxpZl9zdG10OjI5OSxpbXBvcnRfYXNfbmFtZTozMDAsaW1wb3J0X2FzX25hbWVzOjMwMSxcbmltcG9ydF9mcm9tOjMwMixpbXBvcnRfbmFtZTozMDMsaW1wb3J0X3N0bXQ6MzA0LGxhbWJkZWY6MzA1LGxhbWJkZWZfbm9jb25kOjMwNixub25sb2NhbF9zdG10OjMwNyxub3RfdGVzdDozMDgsb3JfdGVzdDozMDkscGFyYW1ldGVyczozMTAscGFzc19zdG10OjMxMSxwb3dlcjozMTIscHJpbnRfc3RtdDozMTMscmFpc2Vfc3RtdDozMTQscmV0dXJuX3N0bXQ6MzE1LHNoaWZ0X2V4cHI6MzE2LHNpbXBsZV9zdG10OjMxNyxzaW5nbGVfaW5wdXQ6MjU2LHNsaWNlb3A6MzE4LHNtYWxsX3N0bXQ6MzE5LHN0YXJfZXhwcjozMjAsc3RtdDozMjEsc3Vic2NyaXB0OjMyMixzdWJzY3JpcHRsaXN0OjMyMyxzdWl0ZTozMjQsdGVybTozMjUsdGVzdDozMjYsdGVzdF9ub2NvbmQ6MzI3LHRlc3RsaXN0OjMyOCx0ZXN0bGlzdF9jb21wOjMyOSx0ZXN0bGlzdF9zdGFyX2V4cHI6MzMwLHRmcGRlZjozMzEsdHJhaWxlcjozMzIsdHJ5X3N0bXQ6MzMzLHR5cGVkYXJnc2xpc3Q6MzM0LHZhcmFyZ3NsaXN0OjMzNSxcbnZmcGRlZjozMzYsd2hpbGVfc3RtdDozMzcsd2l0aF9pdGVtOjMzOCx3aXRoX3N0bXQ6MzM5LHhvcl9leHByOjM0MCx5aWVsZF9hcmc6MzQxLHlpZWxkX2V4cHI6MzQyLHlpZWxkX3N0bXQ6MzQzfSxudW1iZXIyc3ltYm9sOnsyNTY6XCJzaW5nbGVfaW5wdXRcIiwyNTc6XCJhbmRfZXhwclwiLDI1ODpcImFuZF90ZXN0XCIsMjU5OlwiYW5uYXNzaWduXCIsMjYwOlwiYXJnbGlzdFwiLDI2MTpcImFyZ3VtZW50XCIsMjYyOlwiYXJpdGhfZXhwclwiLDI2MzpcImFzc2VydF9zdG10XCIsMjY0OlwiYXN5bmNfZnVuY2RlZlwiLDI2NTpcImFzeW5jX3N0bXRcIiwyNjY6XCJhdG9tXCIsMjY3OlwiYXRvbV9leHByXCIsMjY4OlwiYXVnYXNzaWduXCIsMjY5OlwiYnJlYWtfc3RtdFwiLDI3MDpcImNsYXNzZGVmXCIsMjcxOlwiY29tcF9mb3JcIiwyNzI6XCJjb21wX2lmXCIsMjczOlwiY29tcF9pdGVyXCIsMjc0OlwiY29tcF9vcFwiLDI3NTpcImNvbXBhcmlzb25cIiwyNzY6XCJjb21wb3VuZF9zdG10XCIsMjc3OlwiY29udGludWVfc3RtdFwiLDI3ODpcImRlYnVnZ2VyX3N0bXRcIixcbjI3OTpcImRlY29yYXRlZFwiLDI4MDpcImRlY29yYXRvclwiLDI4MTpcImRlY29yYXRvcnNcIiwyODI6XCJkZWxfc3RtdFwiLDI4MzpcImRpY3RvcnNldG1ha2VyXCIsMjg0OlwiZG90dGVkX2FzX25hbWVcIiwyODU6XCJkb3R0ZWRfYXNfbmFtZXNcIiwyODY6XCJkb3R0ZWRfbmFtZVwiLDI4NzpcImVuY29kaW5nX2RlY2xcIiwyODg6XCJldmFsX2lucHV0XCIsMjg5OlwiZXhjZXB0X2NsYXVzZVwiLDI5MDpcImV4cHJcIiwyOTE6XCJleHByX3N0bXRcIiwyOTI6XCJleHBybGlzdFwiLDI5MzpcImZhY3RvclwiLDI5NDpcImZpbGVfaW5wdXRcIiwyOTU6XCJmbG93X3N0bXRcIiwyOTY6XCJmb3Jfc3RtdFwiLDI5NzpcImZ1bmNkZWZcIiwyOTg6XCJnbG9iYWxfc3RtdFwiLDI5OTpcImlmX3N0bXRcIiwzMDA6XCJpbXBvcnRfYXNfbmFtZVwiLDMwMTpcImltcG9ydF9hc19uYW1lc1wiLDMwMjpcImltcG9ydF9mcm9tXCIsMzAzOlwiaW1wb3J0X25hbWVcIiwzMDQ6XCJpbXBvcnRfc3RtdFwiLDMwNTpcImxhbWJkZWZcIiwzMDY6XCJsYW1iZGVmX25vY29uZFwiLDMwNzpcIm5vbmxvY2FsX3N0bXRcIixcbjMwODpcIm5vdF90ZXN0XCIsMzA5Olwib3JfdGVzdFwiLDMxMDpcInBhcmFtZXRlcnNcIiwzMTE6XCJwYXNzX3N0bXRcIiwzMTI6XCJwb3dlclwiLDMxMzpcInByaW50X3N0bXRcIiwzMTQ6XCJyYWlzZV9zdG10XCIsMzE1OlwicmV0dXJuX3N0bXRcIiwzMTY6XCJzaGlmdF9leHByXCIsMzE3Olwic2ltcGxlX3N0bXRcIiwzMTg6XCJzbGljZW9wXCIsMzE5Olwic21hbGxfc3RtdFwiLDMyMDpcInN0YXJfZXhwclwiLDMyMTpcInN0bXRcIiwzMjI6XCJzdWJzY3JpcHRcIiwzMjM6XCJzdWJzY3JpcHRsaXN0XCIsMzI0Olwic3VpdGVcIiwzMjU6XCJ0ZXJtXCIsMzI2OlwidGVzdFwiLDMyNzpcInRlc3Rfbm9jb25kXCIsMzI4OlwidGVzdGxpc3RcIiwzMjk6XCJ0ZXN0bGlzdF9jb21wXCIsMzMwOlwidGVzdGxpc3Rfc3Rhcl9leHByXCIsMzMxOlwidGZwZGVmXCIsMzMyOlwidHJhaWxlclwiLDMzMzpcInRyeV9zdG10XCIsMzM0OlwidHlwZWRhcmdzbGlzdFwiLDMzNTpcInZhcmFyZ3NsaXN0XCIsMzM2OlwidmZwZGVmXCIsMzM3Olwid2hpbGVfc3RtdFwiLDMzODpcIndpdGhfaXRlbVwiLDMzOTpcIndpdGhfc3RtdFwiLFxuMzQwOlwieG9yX2V4cHJcIiwzNDE6XCJ5aWVsZF9hcmdcIiwzNDI6XCJ5aWVsZF9leHByXCIsMzQzOlwieWllbGRfc3RtdFwifSxkZmFzOnsyNTY6W1tbWzEsMV0sWzIsMV0sWzMsMl1dLFtbMCwxXV0sW1syLDFdXV0sezI6MSw0OjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMjU3OltbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNTg6W1tbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDI1OTpbW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHs0ODoxfV0sMjYwOltbW1s1MSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s1MSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw1MzoxfV0sMjYxOltbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjI6W1tbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNjM6W1tbWzI0LDFdXSxbWzQ5LFxuMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHsyNDoxfV0sMjY0OltbW1sxMCwxXV0sW1s1NiwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjU6W1tbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLHsxMDoxfV0sMjY2OltbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMzM6MSwzNToxLDM4OjF9XSwyNjc6W1tbWzI5LDFdLFs2NSwyXV0sW1s2NSwyXV0sW1s2NiwyXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSwzNToxLDM4OjF9XSwyNjg6W1tbWzY3LDFdLFs2OCwxXSxbNjksMV0sXG5bNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLHs2NzoxLDY4OjEsNjk6MSw3MDoxLDcxOjEsNzI6MSw3MzoxLDc0OjEsNzU6MSw3NjoxLDc3OjEsNzg6MSw3OToxfV0sMjY5OltbW1szOSwxXV0sW1swLDFdXV0sezM5OjF9XSwyNzA6W1tbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLHsxMzoxfV0sMjcxOltbW1sxMCwxXSxbMzQsMl1dLFtbMzQsMl1dLFtbODIsM11dLFtbODMsNF1dLFtbODQsNV1dLFtbODUsNl0sWzAsNV1dLFtbMCw2XV1dLHsxMDoxLDM0OjF9XSwyNzI6W1tbWzM3LDFdXSxbWzg2LDJdXSxbWzg1LDNdLFswLDJdXSxbWzAsM11dXSx7Mzc6MX1dLDI3MzpbW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSx7MTA6MSwzNDoxLDM3OjF9XSwyNzQ6W1tbWzg4LDFdLFs4OSwxXSxcbls4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSx7ODoxLDgzOjEsODg6MSw4OToxLDkwOjEsOTE6MSw5MjoxLDkzOjEsOTQ6MX1dLDI3NTpbW1tbOTUsMV1dLFtbOTYsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjc2OltbW1s5NywxXSxbOTgsMV0sWzU4LDFdLFs5OSwxXSxbNTcsMV0sWzEwMCwxXSxbNTYsMV0sWzEwMSwxXSxbMTAyLDFdXSxbWzAsMV1dXSx7NDoxLDEwOjEsMTM6MSwyMDoxLDIxOjEsMzQ6MSwzNzoxLDQxOjEsNDI6MX1dLDI3NzpbW1tbNDAsMV1dLFtbMCwxXV1dLHs0MDoxfV0sMjc4OltbW1sxNywxXV0sW1swLDFdXV0sezE3OjF9XSwyNzk6W1tbWzEwMywxXV0sW1s1NiwyXSxbMTA0LDJdLFs5OSwyXV0sW1swLDJdXV0sezQxOjF9XSwyODA6W1tbWzQxLDFdXSxcbltbMTA1LDJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSx7NDE6MX1dLDI4MTpbW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLHs0MToxfV0sMjgyOltbW1syNywxXV0sW1s4MiwyXV0sW1swLDJdXV0sezI3OjF9XSwyODM6W1tbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyODQ6W1tbWzEwNSwxXV0sW1sxMDgsXG4yXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwyODU6W1tbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLHsyNToxfV0sMjg2OltbW1syNSwxXV0sW1sxMTAsMF0sWzAsMV1dXSx7MjU6MX1dLDI4NzpbW1tbMjUsMV1dLFtbMCwxXV1dLHsyNToxfV0sMjg4OltbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjg5OltbW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezExMzoxfV0sMjkwOltbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MTpbW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsXG40XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkyOltbW1s5NSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzk1LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTM6W1tbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTQ6W1tbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsXG4xNzoxLDE4OjEsMTk6MSwyMDoxLDIxOjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzQ6MSwzNToxLDM2OjEsMzc6MSwzODoxLDM5OjEsNDA6MSw0MToxLDQyOjEsNDM6MSwxMTI6MX1dLDI5NTpbW1tbMTIyLDFdLFsxMjMsMV0sWzEyNCwxXSxbMTI1LDFdLFsxMjYsMV1dLFtbMCwxXV1dLHs1OjEsMjM6MSwzMToxLDM5OjEsNDA6MX1dLDI5NjpbW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sezM0OjF9XSwyOTc6W1tbWzQsMV1dLFtbMjUsMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLHs0OjF9XSwyOTg6W1tbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sezI2OjF9XSwyOTk6W1tbWzM3LDFdXSxbWzQ5LDJdXSxcbltbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLHszNzoxfV0sMzAwOltbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLHsyNToxfV0sMzAxOltbW1sxMzEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTMxLDFdLFswLDJdXV0sezI1OjF9XSwzMDI6W1tbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sezM2OjF9XSwzMDM6W1tbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sezMyOjF9XSwzMDQ6W1tbWzEzNCwxXSxbMTM1LDFdXSxbWzAsMV1dXSx7MzI6MSwzNjoxfV0sMzA1OltbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzQ5LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNjpbW1tbMTQsMV1dLFxuW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNzpbW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MTg6MX1dLDMwODpbW1tbOCwxXSxbMTM3LDJdXSxbWzQ2LDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMwOTpbW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzEwOltbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSx7MzU6MX1dLDMxMTpbW1tbMjgsMV1dLFtbMCwxXV1dLHsyODoxfV0sMzEyOltbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwyOToxLDMzOjEsXG4zNToxLDM4OjF9XSwzMTM6W1tbWzE2LDFdXSxbWzQ5LDJdLFsxNDIsM10sWzAsMV1dLFtbNTIsNF0sWzAsMl1dLFtbNDksNV1dLFtbNDksMl0sWzAsNF1dLFtbNTIsNl0sWzAsNV1dLFtbNDksN11dLFtbNTIsOF0sWzAsN11dLFtbNDksN10sWzAsOF1dXSx7MTY6MX1dLDMxNDpbW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLHs1OjF9XSwzMTU6W1tbWzIzLDFdXSxbWzExMSwyXSxbMCwxXV0sW1swLDJdXV0sezIzOjF9XSwzMTY6W1tbWzE0MywxXV0sW1sxNDQsMF0sWzE0MiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTc6W1tbWzE0NSwxXV0sW1syLDJdLFsxNDYsM11dLFtbMCwyXV0sW1sxNDUsMV0sWzIsMl1dXSx7NToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSxcbjE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMxODpbW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLHs0ODoxfV0sMzE5OltbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyMDpbW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLHsxNToxfV0sMzIxOltbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSx7NDoxLDU6MSw2OjEsNzoxLFxuODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMzIyOltbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyMzpbW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyNDpbW1tbMSwxXSxbMiwyXV0sXG5bWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLHsyOjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsMzk6MSw0MDoxLDQzOjF9XSwzMjU6W1tbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsMF0sWzQxLDBdLFsxNjMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI2OltbW1s4NCwxXSxbMTY0LDJdXSxbWzM3LDNdLFswLDFdXSxbWzAsMl1dLFtbODQsNF1dLFtbMTI3LDVdXSxbWzQ5LDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyNzpbW1tbMTY1LFxuMV0sWzg0LDFdXSxbWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI4OltbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjk6W1tbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMDpbW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsXG4yMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMzE6W1tbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7MjU6MX1dLDMzMjpbW1tbMzUsMV0sWzExMCwyXSxbMzgsM11dLFtbNjEsNF0sWzgxLDVdXSxbWzI1LDRdXSxbWzE2Niw2XV0sW1swLDRdXSxbWzYxLDRdXSxbWzY0LDRdXV0sezM1OjEsMzg6MSwxMTA6MX1dLDMzMzpbW1tbMjAsMV1dLFtbNDgsMl1dLFtbODAsM11dLFtbMTY3LDRdLFsxNjgsNV1dLFtbNDgsNl1dLFtbNDgsN11dLFtbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSx7MjA6MX1dLDMzNDpbW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsXG41XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzU6W1tbWzE1LDFdLFs1MywyXSxbMTcwLDNdXSxbWzE3MCw1XSxbNTIsNF0sWzAsMV1dLFtbMTcwLDZdXSxbWzUwLDddLFs1Miw4XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFxuW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM2OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwzMzc6W1tbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezIxOjF9XSwzMzg6W1tbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzOTpbW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sezQyOjF9XSwzNDA6W1tbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLFxuMzU6MSwzODoxLDQzOjF9XSwzNDE6W1tbWzExMSwyXSxbMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsNDM6MX1dLDM0MjpbW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSx7MzE6MX1dLDM0MzpbW1tbNjIsMV1dLFtbMCwxXV1dLHszMToxfV19LHN0YXRlczpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSxbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLFtbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sW1tbNDksMV0sWzE1LDJdLFs1MywyXV0sW1s1MCwyXSxbNTQsM10sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxcblswLDFdXV0sW1tbMjQsMV1dLFtbNDksMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSxbW1sxMCwxXV0sW1s1NywyXSxbNTYsMl0sWzU4LDJdXSxbWzAsMl1dXSxbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxbNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLFtbWzM5LDFdXSxbWzAsMV1dXSxbW1sxMywxXV0sW1syNSwyXV0sW1s0OCwzXSxbMzUsNF1dLFxuW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLFtbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLFtbWzg3LDFdLFs1NCwxXV0sW1swLDFdXV0sW1tbODgsMV0sWzg5LDFdLFs4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSxbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLFtbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLFtbWzQwLDFdXSxbWzAsMV1dXSxbW1sxNywxXV0sW1swLDFdXV0sW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSxbW1s0MSwxXV0sW1sxMDUsXG4yXV0sW1syLDRdLFszNSwzXV0sW1s2MSw1XSxbODEsNl1dLFtbMCw0XV0sW1syLDRdXSxbWzYxLDVdXV0sW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLFtbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSxbW1s0OSwxXSxbMTA3LDJdLFs1MywzXV0sW1s0OCw0XSxbNTQsNV0sWzUyLDZdLFswLDFdXSxbWzU0LDVdLFs1Miw2XSxbMCwyXV0sW1s5NSw3XV0sW1s0OSw3XV0sW1swLDVdXSxbWzQ5LDhdLFsxMDcsOF0sWzAsNl1dLFtbNTQsNV0sWzUyLDldLFswLDddXSxbWzUyLDZdLFswLDhdXSxbWzQ5LDEwXSxbNTMsMTFdLFswLDldXSxbWzQ4LDEyXV0sW1s5NSwxM11dLFtbNDksMTNdXSxbWzUyLDldLFswLDEzXV1dLFtbWzEwNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSxcbltbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSxbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsNF0sWzYyLDRdXSxbWzExNiw1XSxbNjIsNV1dLFtbMCw0XV0sW1s1MCwzXSxbMCw1XV1dLFtbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLFtbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLFtbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSxbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sW1tbNCwxXV0sW1syNSxcbjJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSxbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzM3LDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMTMwLDFdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSxbW1szNiwxXV0sW1sxMDUsMl0sWzE5LDNdLFsxMTAsM11dLFtbMzIsNF1dLFtbMTA1LDJdLFsxOSwzXSxbMzIsNF0sWzExMCwzXV0sW1sxMzIsNV0sWzE1LDVdLFszNSw2XV0sW1swLDVdXSxbWzEzMiw3XV0sW1s2MSw1XV1dLFtbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLFtbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsXG4yXV0sW1swLDRdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s4Niw0XV0sW1s0OCwyXV0sW1swLDRdXV0sW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSxbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLFtbWzEzOCwxXV0sW1sxMzksMF0sWzAsMV1dXSxbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSxbW1syOCwxXV0sW1swLDFdXV0sW1tbMTQxLDFdXSxbWzUzLDJdLFswLDFdXSxbWzEyMCwzXV0sW1swLDNdXV0sW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLFtbWzUsMV1dLFtbNDksMl0sWzAsMV1dLFtbMzYsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzUyLDVdLFswLDRdXSxbWzQ5LDZdXSxbWzAsNl1dXSxbW1syMywxXV0sW1sxMTEsXG4yXSxbMCwxXV0sW1swLDJdXV0sW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLFtbWzQ4LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLFtbWzE1LDFdXSxbWzk1LDJdXSxbWzAsMl1dXSxbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSxbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLFtbWzE1OCwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxNTgsMV0sWzAsMl1dXSxbW1sxLDFdLFsyLDJdXSxbWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLFtbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsXG4wXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLFtbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSxbW1sxNjUsMV0sWzg0LDFdXSxbWzAsMV1dXSxbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNDksMV0sWzEwNywxXSxbMCwyXV1dLFtbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSxbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSxbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sXG5bWzgwLDhdXSxbWzgwLDldXSxbWzE2Nyw0XSxbMTI3LDEwXSxbMTY4LDVdLFswLDhdXSxbWzAsOV1dLFtbNDgsMTFdXSxbWzgwLDEyXV0sW1sxNjgsNV0sWzAsMTJdXV0sW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsNV1dLFtbNDksMTBdXSxbWzE1LDExXSxbMTY5LDJdLFs1MywzXSxbMCw3XV0sW1s1MiwxMl0sWzAsOF1dLFtbNTAsMTNdLFs1Miw1XSxbMCw5XV0sW1s1Miw3XSxbMCwxMF1dLFtbMTY5LDE0XSxbNTIsMTVdLFswLDExXV0sW1swLDEyXV0sW1s0OSw0XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzE2OSwxNl0sWzUzLDNdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLFxuOF0sWzAsM11dLFtbNTMsMl0sWzE3MCw5XSxbMCw0XV0sW1s1Miw0XSxbMCw1XV0sW1s1MiwxMF0sWzAsNl1dLFtbNDksMTFdXSxbWzE1LDEyXSxbNTMsMl0sWzE3MCwzXSxbMCw4XV0sW1s1MCwxM10sWzUyLDRdLFswLDldXSxbWzAsMTBdXSxbWzUyLDhdLFswLDExXV0sW1s1MiwxNV0sWzE3MCwxNF0sWzAsMTJdXSxbWzQ5LDVdXSxbWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1syNSwxXV0sW1swLDFdXV0sW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1s0OSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbOTUsM11dLFtbMCwzXV1dLFtbWzQyLDFdXSxbWzE3MSwyXV0sW1s0OCwzXSxbNTIsMV1dLFtbODAsNF1dLFtbMCw0XV1dLFtbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSxbW1sxMTEsMl0sXG5bMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLFtbWzMxLDFdXSxbWzE3NCwyXSxbMCwxXV0sW1swLDJdXV0sW1tbNjIsMV1dLFtbMCwxXV1dXSxsYWJlbHM6W1swLFwiRU1QVFlcIl0sWzMxNyxudWxsXSxbNCxudWxsXSxbMjc2LG51bGxdLFsxLFwiZGVmXCJdLFsxLFwicmFpc2VcIl0sWzEsXCJUcnVlXCJdLFszLG51bGxdLFsxLFwibm90XCJdLFsxLFwibnVsbFwiXSxbNTUsbnVsbF0sWzIsbnVsbF0sWzI1LG51bGxdLFsxLFwiY2xhc3NcIl0sWzEsXCJsYW1iZGFcIl0sWzE2LG51bGxdLFsxLFwicHJpbnRcIl0sWzEsXCJkZWJ1Z2dlclwiXSxbMSxcIm5vbmxvY2FsXCJdLFs1MixudWxsXSxbMSxcInRyeVwiXSxbMSxcIndoaWxlXCJdLFszMSxudWxsXSxbMSxcInJldHVyblwiXSxbMSxcImFzc2VydFwiXSxbMSxudWxsXSxbMSxcImdsb2JhbFwiXSxbMSxcImRlbFwiXSxbMSxcInBhc3NcIl0sWzU0LG51bGxdLFsxNSxudWxsXSxbMSxcInlpZWxkXCJdLFsxLFwiaW1wb3J0XCJdLFsxLFwiRmFsc2VcIl0sWzEsXCJmb3JcIl0sWzcsbnVsbF0sWzEsXCJmcm9tXCJdLFsxLFxuXCJpZlwiXSxbOSxudWxsXSxbMSxcImJyZWFrXCJdLFsxLFwiY29udGludWVcIl0sWzQ5LG51bGxdLFsxLFwid2l0aFwiXSxbMTQsbnVsbF0sWzMxNixudWxsXSxbMTksbnVsbF0sWzMwOCxudWxsXSxbMSxcImFuZFwiXSxbMTEsbnVsbF0sWzMyNixudWxsXSxbMjIsbnVsbF0sWzI2MSxudWxsXSxbMTIsbnVsbF0sWzM1LG51bGxdLFsyNzEsbnVsbF0sWzMyNSxudWxsXSxbMjk3LG51bGxdLFszMzksbnVsbF0sWzI5NixudWxsXSxbMjYsbnVsbF0sWzI4MyxudWxsXSxbOCxudWxsXSxbMzQyLG51bGxdLFszMjksbnVsbF0sWzEwLG51bGxdLFsyNjYsbnVsbF0sWzMzMixudWxsXSxbNDUsbnVsbF0sWzM4LG51bGxdLFs0MCxudWxsXSxbNTAsbnVsbF0sWzQ2LG51bGxdLFs0MSxudWxsXSxbNDIsbnVsbF0sWzM2LG51bGxdLFs0MyxudWxsXSxbNDgsbnVsbF0sWzQ0LG51bGxdLFszNyxudWxsXSxbMzksbnVsbF0sWzMyNCxudWxsXSxbMjYwLG51bGxdLFsyOTIsbnVsbF0sWzEsXCJpblwiXSxbMzA5LG51bGxdLFsyNzMsXG5udWxsXSxbMzI3LG51bGxdLFsyNzIsbnVsbF0sWzI4LG51bGxdLFsyMSxudWxsXSxbMjcsbnVsbF0sWzI5LG51bGxdLFsxLFwiaXNcIl0sWzMwLG51bGxdLFsyMCxudWxsXSxbMjkwLG51bGxdLFsyNzQsbnVsbF0sWzMzMyxudWxsXSxbMjk5LG51bGxdLFsyNzAsbnVsbF0sWzMzNyxudWxsXSxbMjc5LG51bGxdLFsyNjUsbnVsbF0sWzI4MSxudWxsXSxbMjY0LG51bGxdLFsyODYsbnVsbF0sWzI4MCxudWxsXSxbMzIwLG51bGxdLFsxLFwiYXNcIl0sWzI4NCxudWxsXSxbMjMsbnVsbF0sWzMyOCxudWxsXSxbMCxudWxsXSxbMSxcImV4Y2VwdFwiXSxbMzQwLG51bGxdLFsxOCxudWxsXSxbMzMwLG51bGxdLFsyNjgsbnVsbF0sWzI1OSxudWxsXSxbMzEyLG51bGxdLFsyOTMsbnVsbF0sWzMyMSxudWxsXSxbMjY5LG51bGxdLFsyNzcsbnVsbF0sWzMxNCxudWxsXSxbMzE1LG51bGxdLFszNDMsbnVsbF0sWzEsXCJlbHNlXCJdLFszMTAsbnVsbF0sWzUxLG51bGxdLFsxLFwiZWxpZlwiXSxbMzAwLG51bGxdLFszMDEsXG5udWxsXSxbMjg1LG51bGxdLFszMDMsbnVsbF0sWzMwMixudWxsXSxbMzM1LG51bGxdLFsyNzUsbnVsbF0sWzI1OCxudWxsXSxbMSxcIm9yXCJdLFszMzQsbnVsbF0sWzI2NyxudWxsXSxbMzQsbnVsbF0sWzI2MixudWxsXSxbMzMsbnVsbF0sWzMxOSxudWxsXSxbMTMsbnVsbF0sWzI5NSxudWxsXSxbMjYzLG51bGxdLFsyOTEsbnVsbF0sWzMxMSxudWxsXSxbMzA3LG51bGxdLFszMTMsbnVsbF0sWzI4MixudWxsXSxbMjk4LG51bGxdLFszMDQsbnVsbF0sWzI3OCxudWxsXSxbMzE4LG51bGxdLFszMjIsbnVsbF0sWzUsbnVsbF0sWzYsbnVsbF0sWzQ3LG51bGxdLFsxNyxudWxsXSxbMjQsbnVsbF0sWzMwNSxudWxsXSxbMzA2LG51bGxdLFszMjMsbnVsbF0sWzI4OSxudWxsXSxbMSxcImZpbmFsbHlcIl0sWzMzMSxudWxsXSxbMzM2LG51bGxdLFszMzgsbnVsbF0sWzI1NyxudWxsXSxbMzIsbnVsbF0sWzM0MSxudWxsXV0sa2V5d29yZHM6e0ZhbHNlOjMzLFwibnVsbFwiOjksVHJ1ZTo2LGFuZDo0NyxcbmFzOjEwOCxhc3NlcnQ6MjQsXCJicmVha1wiOjM5LFwiY2xhc3NcIjoxMyxcImNvbnRpbnVlXCI6NDAsXCJkZWJ1Z2dlclwiOjE3LGRlZjo0LGRlbDoyNyxlbGlmOjEzMCxcImVsc2VcIjoxMjcsZXhjZXB0OjExMyxcImZpbmFsbHlcIjoxNjgsXCJmb3JcIjozNCxmcm9tOjM2LGdsb2JhbDoyNixcImlmXCI6MzcsXCJpbXBvcnRcIjozMixcImluXCI6ODMsaXM6OTIsbGFtYmRhOjE0LG5vbmxvY2FsOjE4LG5vdDo4LG9yOjEzOSxwYXNzOjI4LHByaW50OjE2LHJhaXNlOjUsXCJyZXR1cm5cIjoyMyxcInRyeVwiOjIwLFwid2hpbGVcIjoyMSxcIndpdGhcIjo0Mix5aWVsZDozMX0sdG9rZW5zOnswOjExMiwxOjI1LDI6MTEsMzo3LDQ6Miw1OjE1OSw2OjE2MCw3OjM1LDg6NjEsOTozOCwxMDo2NCwxMTo0OCwxMjo1MiwxMzoxNDYsMTQ6NDMsMTU6MzAsMTY6MTUsMTc6MTYyLDE4OjExNSwxOTo0NSwyMDo5NCwyMTo4OSwyMjo1MCwyMzoxMTAsMjQ6MTYzLDI1OjEyLDI2OjU5LDI3OjkwLDI4Ojg4LDI5OjkxLDMwOjkzLDMxOjIyLDMyOjE3MyxcbjMzOjE0NCwzNDoxNDIsMzU6NTMsMzY6NzQsMzc6NzgsMzg6NjgsMzk6NzksNDA6NjksNDE6NzIsNDI6NzMsNDM6NzUsNDQ6NzcsNDU6NjcsNDY6NzEsNDc6MTYxLDQ4Ojc2LDQ5OjQxLDUwOjcwLDUxOjEyOSw1MjoxOSw1NDoyOSw1NToxMH0sc3RhcnQ6MjU2fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5maWxlbmFtZT1hO3RoaXMuZ3JhbW1hcj1jO3RoaXMucF9mbGFncz0wO3JldHVybiB0aGlzfWZ1bmN0aW9uIGMoYixjKXt2b2lkIDA9PT1jJiYoYz1cImZpbGVfaW5wdXRcIik7Yj1uZXcgYShiLFNrLlBhcnNlVGFibGVzKTtcImZpbGVfaW5wdXRcIj09PWM/Yi5zZXR1cChTay5QYXJzZVRhYmxlcy5zeW0uZmlsZV9pbnB1dCk6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7cmV0dXJuIGJ9YS5GVVRVUkVfUFJJTlRfRlVOQ1RJT049XCJwcmludF9mdW5jdGlvblwiO2EuRlVUVVJFX1VOSUNPREVfTElURVJBTFM9XCJ1bmljb2RlX2xpdGVyYWxzXCI7YS5GVVRVUkVfRElWSVNJT049XG5cImRpdmlzaW9uXCI7YS5GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPVwiYWJzb2x1dGVfaW1wb3J0XCI7YS5GVVRVUkVfV0lUSF9TVEFURU1FTlQ9XCJ3aXRoX3N0YXRlbWVudFwiO2EuRlVUVVJFX05FU1RFRF9TQ09QRVM9XCJuZXN0ZWRfc2NvcGVzXCI7YS5GVVRVUkVfR0VORVJBVE9SUz1cImdlbmVyYXRvcnNcIjthLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTj02NTUzNjthLkNPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPTEzMTA3MjthLkNPX0ZVVFVSRV9ESVZJU09OPTgxOTI7YS5DT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPTE2Mzg0O2EuQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UPTMyNzY4O2EucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKGEpe2E9YXx8dGhpcy5ncmFtbWFyLnN0YXJ0O3RoaXMuc3RhY2s9W3tkZmE6dGhpcy5ncmFtbWFyLmRmYXNbYV0sc3RhdGU6MCxub2RlOnt0eXBlOmEsdmFsdWU6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRyZW46W119fV07dGhpcy51c2VkX25hbWVzPXt9fTthLnByb3RvdHlwZS5hZGR0b2tlbj1cbmZ1bmN0aW9uKGEsYyxmKXt2YXIgYixlPXRoaXMuY2xhc3NpZnkoYSxjLGYpO2E6Zm9yKDs7KXt2YXIgZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3ZhciBnPWQuZGZhWzBdO3ZhciBuPWdbZC5zdGF0ZV07Zm9yKGI9MDtiPG4ubGVuZ3RoOysrYil7dmFyIGs9bltiXVswXTt2YXIgcD1uW2JdWzFdO3ZhciBtPXRoaXMuZ3JhbW1hci5sYWJlbHNba11bMF07aWYoZT09PWspe1NrLmFzc2VydHMuYXNzZXJ0KDI1Nj5tKTt0aGlzLnNoaWZ0KGEsYyxwLGYpO2ZvcihmPXA7MT09PWdbZl0ubGVuZ3RoJiYwPT09Z1tmXVswXVswXSYmZ1tmXVswXVsxXT09PWY7KXt0aGlzLnBvcCgpO2lmKDA9PT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm4hMDtkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07Zj1kLnN0YXRlO2c9ZC5kZmFbMF19cmV0dXJuITF9aWYoMjU2PD1tJiYoaz10aGlzLmdyYW1tYXIuZGZhc1ttXSxrPWtbMV0say5oYXNPd25Qcm9wZXJ0eShlKSkpe3RoaXMucHVzaChtLFxudGhpcy5ncmFtbWFyLmRmYXNbbV0scCxmKTtjb250aW51ZSBhfX1iOntnPVswLGQuc3RhdGVdO2ZvcihkPW4ubGVuZ3RoO2QtLTspaWYobltkXVswXT09PWdbMF0mJm5bZF1bMV09PT1nWzFdKXtuPSEwO2JyZWFrIGJ9bj0hMX1pZihuKXtpZih0aGlzLnBvcCgpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRvbyBtdWNoIGlucHV0XCIsdGhpcy5maWxlbmFtZSk7fWVsc2UgdGhyb3cgYT1mWzBdWzBdLG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIGlucHV0XCIsdGhpcy5maWxlbmFtZSxhLGYpO319O2EucHJvdG90eXBlLmNsYXNzaWZ5PWZ1bmN0aW9uKGIsYyxmKXtpZihiPT09U2sudG9rZW4udG9rZW5zLlRfTkFNRSl7dGhpcy51c2VkX25hbWVzW2NdPSEwO3ZhciBlPXRoaXMuZ3JhbW1hci5rZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShjKSYmdGhpcy5ncmFtbWFyLmtleXdvcmRzW2NdO1wicHJpbnRcIj09PWMmJih0aGlzLnBfZmxhZ3MmXG5hLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTnx8ITA9PT1Tay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uKSYmKGU9ITEpO2lmKGUpcmV0dXJuIGV9ZT10aGlzLmdyYW1tYXIudG9rZW5zLmhhc093blByb3BlcnR5KGIpJiZ0aGlzLmdyYW1tYXIudG9rZW5zW2JdO2lmKCFlKXtjPVwiI1wiK2I7Zm9yKGxldCBhIGluIFNrLnRva2VuLnRva2VucylpZihTay50b2tlbi50b2tlbnNbYV09PWIpe2M9YTticmVha310aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCB0b2tlbiBcIitjLHRoaXMuZmlsZW5hbWUsZlswXVswXSxmKTt9cmV0dXJuIGV9O2EucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKGEsYyxmLGwpe3ZhciBiPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLGQ9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2QuY2hpbGRyZW4ucHVzaCh7dHlwZTphLHZhbHVlOmMsbGluZW5vOmxbMF1bMF0sY29sX29mZnNldDpsWzBdWzFdLGNoaWxkcmVuOm51bGx9KTtcbnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTpiLHN0YXRlOmYsbm9kZTpkfX07YS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGMsZixsKXthPXt0eXBlOmEsdmFsdWU6bnVsbCxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46W119O3RoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLmRmYSxzdGF0ZTpmLG5vZGU6dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlfTt0aGlzLnN0YWNrLnB1c2goe2RmYTpjLHN0YXRlOjAsbm9kZTphfSl9O2EucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc3RhY2sucG9wKCkubm9kZTtpZihhKWlmKDAhPT10aGlzLnN0YWNrLmxlbmd0aCl7dmFyIGM9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2MuY2hpbGRyZW4ucHVzaChhKX1lbHNlIHRoaXMucm9vdG5vZGU9YSx0aGlzLnJvb3Rub2RlLnVzZWRfbmFtZXM9XG50aGlzLnVzZWRfbmFtZXN9O1NrLnBhcnNlPWZ1bmN0aW9uKGEsZSl7dmFyIGI9U2sudG9rZW4udG9rZW5zLlRfQ09NTUVOVCxsPVNrLnRva2VuLnRva2Vucy5UX05MLGg9U2sudG9rZW4udG9rZW5zLlRfT1AsZD1Tay50b2tlbi50b2tlbnMuVF9FTkRNQVJLRVIsZz1Tay50b2tlbi50b2tlbnMuVF9FTkNPRElORyxuPSExLGs9YyhhKTtTay5fdG9rZW5pemUoYSxmdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KFwiXFxuXCIpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGErXCJcXG5cIn0pO3JldHVybiBmdW5jdGlvbigpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXCJFT0ZcIik7cmV0dXJuIGIucG9wKCl9fShlKSxcInV0Zi04XCIsZnVuY3Rpb24oYSl7dmFyIGM9bnVsbDthLnR5cGUhPT1iJiZhLnR5cGUhPT1sJiZhLnR5cGUhPT1nJiYoYS50eXBlPT09aCYmKGM9U2suT3BNYXBbYS5zdHJpbmddKSxrLmFkZHRva2VuKGN8fGEudHlwZSxhLnN0cmluZyxcblthLnN0YXJ0LGEuZW5kLGEubGluZV0pLGEudHlwZT09PWQmJihuPSEwKSl9KTtpZighbil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImluY29tcGxldGUgaW5wdXRcIix0aGlzLmZpbGVuYW1lKTtyZXR1cm57Y3N0Omsucm9vdG5vZGUsZmxhZ3M6ay5wX2ZsYWdzfX07U2sucGFyc2VUcmVlRHVtcD1mdW5jdGlvbihhLGMpe3ZhciBiO2M9Y3x8XCJcIjt2YXIgZT1cIlwiK2M7aWYoMjU2PD1hLnR5cGUpZm9yKGUrPVNrLlBhcnNlVGFibGVzLm51bWJlcjJzeW1ib2xbYS50eXBlXStcIlxcblwiLGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoOysrYillKz1Tay5wYXJzZVRyZWVEdW1wKGEuY2hpbGRyZW5bYl0sYytcIiAgXCIpO2Vsc2UgZSs9U2sudG9rZW4udG9rX25hbWVbYS50eXBlXStcIjogXCIrKG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkuJHIoKS52K1wiXFxuXCI7cmV0dXJuIGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLlBhcnNlclwiLGEpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnBhcnNlXCIsU2sucGFyc2UpO1xuU2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VUcmVlRHVtcFwiLFNrLnBhcnNlVHJlZUR1bXApfSxmdW5jdGlvbihtLHEpe1NrLmFzdG5vZGVzPXt9O1NrLmFzdG5vZGVzLkxvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5EZWw9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z0xvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z1N0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5QYXJhbT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Pcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5TdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1hdE11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kPWZ1bmN0aW9uKCl7fTtcblNrLmFzdG5vZGVzLlBvdz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTFNoaWZ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5SU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdE9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRYb3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdEFuZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRmxvb3JEaXY9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkludmVydD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VU3ViPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5FcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90RXE9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MdEU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5HdEU9XG5mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXM9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLklzTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90SW49ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1vZHVsZT1mdW5jdGlvbihhLGMpe3RoaXMuYm9keT1hO3RoaXMuZG9jc3RyaW5nPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkludGVyYWN0aXZlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWl0ZT1mdW5jdGlvbihhKXt0aGlzLmJvZHk9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRnVuY3Rpb25EZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWQmJnZvaWQgMCE9PVxuZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2xhc3NEZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5iYXNlcz1jO3RoaXMua2V5d29yZHM9Yjt0aGlzLmJvZHk9ZTt0aGlzLmRlY29yYXRvcl9saXN0PWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SZXR1cm49ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlbGV0ZT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnRhcmdldHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NpZ249XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGFyZ2V0cz1hO3RoaXMudmFsdWU9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdWdBc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGFyZ2V0PWE7dGhpcy5vcD1jO3RoaXMudmFsdWU9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9XG5hO3RoaXMuYW5ub3RhdGlvbj1jO3RoaXMudmFsdWU9Yjt0aGlzLnNpbXBsZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkZvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGb3I9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmJvZHk9Yjt0aGlzLm9yZWxzZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PVxubDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2hpbGU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSWY9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzeW5jV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaXRlbXM9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SYWlzZT1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmV4Yz1hO3RoaXMuY2F1c2U9Yzt0aGlzLmluc3Q9Yjt0aGlzLnRiYWNrPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHJ5PVxuZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy5ib2R5PWE7dGhpcy5oYW5kbGVycz1jO3RoaXMub3JlbHNlPWI7dGhpcy5maW5hbGJvZHk9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NlcnQ9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLnRlc3Q9YTt0aGlzLm1zZz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLm1vZHVsZT1hO3RoaXMubmFtZXM9Yzt0aGlzLmxldmVsPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2xvYmFsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ob25sb2NhbD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QYXNzPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CcmVhaz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1cbmEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Db250aW51ZT1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuUHJpbnQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMuZGVzdD1hO3RoaXMudmFsdWVzPWM7dGhpcy5ubD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlYnVnZ2VyPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJvb2xPcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJpbk9wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmxlZnQ9YTt0aGlzLm9wPWM7dGhpcy5yaWdodD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlVuYXJ5T3A9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLm9wZXJhbmQ9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MYW1iZGE9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmFyZ3M9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZkV4cD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9XG5iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmtleXM9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLmVsdHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MaXN0Q29tcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TZXRDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5EaWN0Q29tcD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5rZXk9YTt0aGlzLnZhbHVlPWM7dGhpcy5nZW5lcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwPVxuZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF3YWl0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9XG5iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZEZyb209ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbXBhcmU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3BzPWM7dGhpcy5jb21wYXJhdG9ycz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNhbGw9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJlxudm9pZCAwIT09Zik7dGhpcy5mdW5jPWE7dGhpcy5hcmdzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk51bT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLm49YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5zPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuY29udmVyc2lvbj1jO3RoaXMuZm9ybWF0X3NwZWM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Kb2luZWRTdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CeXRlcz1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ9XG5mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRWxsaXBzaXM9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnN0YW50PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGU9XG5mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuYXR0cj1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3Vic2NyaXB0PWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5zbGljZT1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3RhcnJlZD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1xudGhpcy52YWx1ZT1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTmFtZT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaWQ9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlR1cGxlPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNsaWNlPWZ1bmN0aW9uKGEsYyxiKXt0aGlzLmxvd2VyPWE7dGhpcy51cHBlcj1jO3RoaXMuc3RlcD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHRTbGljZT1mdW5jdGlvbihhKXt0aGlzLmRpbXM9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW5kZXg9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5pZnM9Yjt0aGlzLmlzX2FzeW5jPWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXI9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09XG5lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50eXBlPWE7dGhpcy5uYW1lPWM7dGhpcy5ib2R5PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJndW1lbnRzXz1mdW5jdGlvbihhLGMsYixlLGYsbCl7dGhpcy5hcmdzPWE7dGhpcy52YXJhcmc9Yzt0aGlzLmt3b25seWFyZ3M9Yjt0aGlzLmt3X2RlZmF1bHRzPWU7dGhpcy5rd2FyZz1mO3RoaXMuZGVmYXVsdHM9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJnPWZ1bmN0aW9uIGEoYSxjKXt0aGlzLmFyZz1hO3RoaXMuYW5ub3RhdGlvbj1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5rZXl3b3JkPWZ1bmN0aW9uKGEsYyl7dGhpcy5hcmc9YTt0aGlzLnZhbHVlPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFsaWFzPWZ1bmN0aW9uKGEsYyl7dGhpcy5uYW1lPWE7dGhpcy5hc25hbWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMud2l0aGl0ZW09XG5mdW5jdGlvbihhLGMpe3RoaXMuY29udGV4dF9leHByPWE7dGhpcy5vcHRpb25hbF92YXJzPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2R1bGVcIjtTay5hc3Rub2Rlcy5Nb2R1bGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuSW50ZXJhY3RpdmUucHJvdG90eXBlLl9hc3RuYW1lPVwiSW50ZXJhY3RpdmVcIjtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhwcmVzc2lvblwiO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlN1aXRlXCI7U2suYXN0bm9kZXMuU3VpdGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGdW5jdGlvbkRlZlwiO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0Z1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQ2xhc3NEZWYucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2xhc3NEZWZcIjtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJiYXNlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJhc2VzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXG5cImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2FzdG5hbWU9XCJSZXR1cm5cIjtTay5hc3Rub2Rlcy5SZXR1cm4ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWxldGVcIjtTay5hc3Rub2Rlcy5EZWxldGUucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9XTtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzaWduXCI7U2suYXN0bm9kZXMuQXNzaWduLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXRzfSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnQXNzaWduXCI7XG5Tay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBbm5Bc3NpZ25cIjtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2ltcGxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2ltcGxlfV07U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZvclwiO1NrLmFzdG5vZGVzLkZvci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFxuXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5Bc3luY0Zvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0ZvclwiO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaGlsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJXaGlsZVwiO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuSWYucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZcIjtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fYXN0bmFtZT1cIldpdGhcIjtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNXaXRoXCI7U2suYXN0bm9kZXMuQXN5bmNXaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtcblNrLmFzdG5vZGVzLlJhaXNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJhaXNlXCI7U2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9maWVsZHM9W1wiZXhjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhjfSxcImNhdXNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2F1c2V9LFwiaW5zdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3R9LFwidGJhY2tcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YmFja31dO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUcnlcIjtTay5hc3Rub2Rlcy5UcnkucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiaGFuZGxlcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5oYW5kbGVyc30sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9LFwiZmluYWxib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmluYWxib2R5fV07U2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzc2VydFwiO1xuU2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcIm1zZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1zZ31dO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRcIjtTay5hc3Rub2Rlcy5JbXBvcnQucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc31dO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiSW1wb3J0RnJvbVwiO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1wibW9kdWxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubW9kdWxlfSxcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9LFwibGV2ZWxcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZXZlbH1dO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHbG9iYWxcIjtTay5hc3Rub2Rlcy5HbG9iYWwucHJvdG90eXBlLl9maWVsZHM9XG5bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuTm9ubG9jYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiTm9ubG9jYWxcIjtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByXCI7U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXNzXCI7U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5CcmVhay5wcm90b3R5cGUuX2FzdG5hbWU9XCJCcmVha1wiO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnRpbnVlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnRpbnVlXCI7U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9maWVsZHM9XG5bXTtTay5hc3Rub2Rlcy5QcmludC5wcm90b3R5cGUuX2FzdG5hbWU9XCJQcmludFwiO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fZmllbGRzPVtcImRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZXN0fSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc30sXCJubFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5sfV07U2suYXN0bm9kZXMuRGVidWdnZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVidWdnZXJcIjtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQm9vbE9wXCI7U2suYXN0bm9kZXMuQm9vbE9wLnByb3RvdHlwZS5fZmllbGRzPVtcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQmluT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQmluT3BcIjtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImxlZnRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZWZ0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwicmlnaHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5yaWdodH1dO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9hc3RuYW1lPVwiVW5hcnlPcFwiO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJvcGVyYW5kXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BlcmFuZH1dO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMYW1iZGFcIjtTay5hc3Rub2Rlcy5MYW1iZGEucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5JZkV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZkV4cFwiO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0XCI7U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5c30sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0XCI7U2suYXN0bm9kZXMuU2V0LnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfV07U2suYXN0bm9kZXMuTGlzdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiTGlzdENvbXBcIjtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtcblNrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0Q29tcFwiO1NrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuRGljdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiRGljdENvbXBcIjtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHZW5lcmF0b3JFeHBcIjtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcblwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5Bd2FpdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBd2FpdFwiO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZFwiO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiWWllbGRGcm9tXCI7U2suYXN0bm9kZXMuWWllbGRGcm9tLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbXBhcmVcIjtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BzfSxcImNvbXBhcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGFyYXRvcnN9XTtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNhbGxcIjtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fZmllbGRzPVtcImZ1bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mdW5jfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9XTtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiTnVtXCI7U2suYXN0bm9kZXMuTnVtLnByb3RvdHlwZS5fZmllbGRzPVtcIm5cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ufV07U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0clwiO1NrLmFzdG5vZGVzLlN0ci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1xuU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9ybWF0dGVkVmFsdWVcIjtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImNvbnZlcnNpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb252ZXJzaW9ufSxcImZvcm1hdF9zcGVjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZm9ybWF0X3NwZWN9XTtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiSm9pbmVkU3RyXCI7U2suYXN0bm9kZXMuSm9pbmVkU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLkJ5dGVzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJ5dGVzXCI7U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9maWVsZHM9W1wic1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN9XTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOYW1lQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkVsbGlwc2lzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVsbGlwc2lzXCI7U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF0dHJpYnV0ZVwiO1NrLmFzdG5vZGVzLkF0dHJpYnV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImF0dHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hdHRyfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1xuU2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YnNjcmlwdFwiO1NrLmFzdG5vZGVzLlN1YnNjcmlwdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcInNsaWNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2V9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTdGFycmVkXCI7U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9hc3RuYW1lPVwiTmFtZVwiO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9maWVsZHM9W1wiaWRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5MaXN0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTGlzdFwiO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuVHVwbGUucHJvdG90eXBlLl9hc3RuYW1lPVwiVHVwbGVcIjtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxvYWRcIjtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlN0b3JlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0b3JlXCI7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbFwiO1NrLmFzdG5vZGVzLkRlbC5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnTG9hZFwiO1NrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQXVnU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnU3RvcmVcIjtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5QYXJhbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXJhbVwiO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlNsaWNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlNsaWNlXCI7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wibG93ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sb3dlcn0sXCJ1cHBlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnVwcGVyfSxcInN0ZXBcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGVwfV07U2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiRXh0U2xpY2VcIjtcblNrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImRpbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kaW1zfV07U2suYXN0bm9kZXMuSW5kZXgucHJvdG90eXBlLl9hc3RuYW1lPVwiSW5kZXhcIjtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFuZFwiO1NrLmFzdG5vZGVzLkFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Pci5wcm90b3R5cGUuX2FzdG5hbWU9XCJPclwiO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBZGRcIjtTay5hc3Rub2Rlcy5BZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YlwiO1NrLmFzdG5vZGVzLlN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTXVsdFwiO1NrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNYXRNdWx0XCI7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9hc3RuYW1lPVwiRGl2XCI7U2suYXN0bm9kZXMuRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2RcIjtTay5hc3Rub2Rlcy5Nb2QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5fYXN0bmFtZT1cIlBvd1wiO1NrLmFzdG5vZGVzLlBvdy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9hc3RuYW1lPVwiTFNoaWZ0XCI7U2suYXN0bm9kZXMuTFNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlJTaGlmdFwiO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRPci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRPclwiO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRYb3JcIjtTay5hc3Rub2Rlcy5CaXRYb3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdEFuZFwiO1NrLmFzdG5vZGVzLkJpdEFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5GbG9vckRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGbG9vckRpdlwiO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnZlcnRcIjtTay5hc3Rub2Rlcy5JbnZlcnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTm90XCI7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9hc3RuYW1lPVwiVUFkZFwiO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2FzdG5hbWU9XCJVU3ViXCI7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5FcS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFcVwiO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEVxXCI7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRcIjtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRFXCI7U2suYXN0bm9kZXMuTHRFLnByb3RvdHlwZS5faXNlbnVtPVxuITA7U2suYXN0bm9kZXMuR3QucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RcIjtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RFXCI7U2suYXN0bm9kZXMuR3RFLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLklzLnByb3RvdHlwZS5fYXN0bmFtZT1cIklzXCI7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXNOb3QucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNOb3RcIjtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJblwiO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEluLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEluXCI7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XG5cImNvbXByZWhlbnNpb25cIjtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJpZnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZnN9LFwiaXNfYXN5bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pc19hc3luY31dO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhjZXB0SGFuZGxlclwiO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9maWVsZHM9W1widHlwZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGV9LFwibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfLnByb3RvdHlwZS5fYXN0bmFtZT1cImFyZ3VtZW50c1wiO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9maWVsZHM9XG5bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJ2YXJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YXJhcmd9LFwia3dvbmx5YXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3b25seWFyZ3N9LFwia3dfZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rd19kZWZhdWx0c30sXCJrd2FyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3YXJnfSxcImRlZmF1bHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdHN9XTtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJnXCI7U2suYXN0bm9kZXMuYXJnLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ30sXCJhbm5vdGF0aW9uXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYW5ub3RhdGlvbn1dO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9hc3RuYW1lPVwia2V5d29yZFwiO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcblwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLmFsaWFzLnByb3RvdHlwZS5fYXN0bmFtZT1cImFsaWFzXCI7U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXNuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXNuYW1lfV07U2suYXN0bm9kZXMud2l0aGl0ZW0ucHJvdG90eXBlLl9hc3RuYW1lPVwid2l0aGl0ZW1cIjtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJjb250ZXh0X2V4cHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZXh0X2V4cHJ9LFwib3B0aW9uYWxfdmFyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wdGlvbmFsX3ZhcnN9XTtTay5leHBvcnRTeW1ib2woXCJTay5hc3Rub2Rlc1wiLFNrLmFzdG5vZGVzKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLmNfZW5jb2Rpbmc9YTt0aGlzLmNfZmlsZW5hbWU9Yjt0aGlzLmNfZmxhZ3M9XG5jfHwwfWZ1bmN0aW9uIGMoYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcIm5vZGUgbXVzdCBiZSBkZWZpbmVkXCIpO3JldHVybiBudWxsPT09YS5jaGlsZHJlbj8wOmEuY2hpbGRyZW4ubGVuZ3RofWZ1bmN0aW9uIGIoYSxiKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YixcImluZGV4IG9mIGNoaWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO3JldHVybiBhLmNoaWxkcmVuW2JdfWZ1bmN0aW9uIGUoYSxiKXtTay5hc3NlcnRzLmFzc2VydChhLnR5cGU9PT1iLFwibm9kZSB3YXNuJ3QgZXhwZWN0ZWQgdHlwZVwiKX1mdW5jdGlvbiBmKGEsYixjKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLGEuY19maWxlbmFtZSxiLmxpbmVubyk7fWZ1bmN0aW9uIGwoYSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBhLFwiZXhwZWN0aW5nIHN0cmluZywgZ290IFwiK3R5cGVvZiBhKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9ZnVuY3Rpb24gaChhKXt2YXIgZCxlO3N3aXRjaChhLnR5cGUpe2Nhc2Ugci5zaW5nbGVfaW5wdXQ6aWYoYihhLDApLnR5cGU9PT16LlRfTkVXTElORSlicmVhaztlbHNlIHJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGQ9ZT0wO2Q8YyhhKTsrK2Qpe3ZhciBmPWIoYSxkKTtmLnR5cGU9PT1yLnN0bXQmJihlKz1oKGYpKX1yZXR1cm4gZTtjYXNlIHIuc3RtdDpyZXR1cm4gaChiKGEsMCkpO2Nhc2Ugci5jb21wb3VuZF9zdG10OnJldHVybiAxO2Nhc2Ugci5zaW1wbGVfc3RtdDpyZXR1cm4gTWF0aC5mbG9vcihjKGEpLzIpO2Nhc2Ugci5zdWl0ZTppZigxPT09YyhhKSlyZXR1cm4gaChiKGEsMCkpO2U9MDtmb3IoZD0yO2Q8YyhhKS0xOysrZCllKz1oKGIoYSxkKSk7cmV0dXJuIGU7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJOb24tc3RhdGVtZW50IGZvdW5kXCIpfXJldHVybiAwfWZ1bmN0aW9uIGQoYSxiLGMsZCl7YyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0ciYmKGM9Yy52KTtpZihcIk5vbmVcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIE5vbmVcIixhLmNfZmlsZW5hbWUsZCk7aWYoXCJUcnVlXCI9PT1jfHxcIkZhbHNlXCI9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlblwiLGEuY19maWxlbmFtZSxkKTt9ZnVuY3Rpb24gZyhhLGIsYyxlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydChjIT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJmMhPT1Tay5hc3Rub2Rlcy5BdWdMb2FkLFwiY29udGV4dCBub3QgQXVnU3RvcmUgb3IgQXVnTG9hZFwiKTt2YXIgaD1mPW51bGw7c3dpdGNoKGIuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuTmFtZTpjPT09U2suYXN0bm9kZXMuU3RvcmUmJmQoYSxlLGIuYXR0cixlLmxpbmVubyk7Yi5jdHg9YzticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpiLmN0eD1jO2coYSxiLnZhbHVlLGMsZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yi5jdHg9YzticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Yi5jdHg9YztmPWIuZWx0czticmVhaztjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOmlmKDA9PT1iLmVsdHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgYXNzaWduIHRvICgpXCIsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOmg9XCJsYW1iZGFcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6aD1cImZ1bmN0aW9uIGNhbGxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOmNhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpoPVwib3BlcmF0b3JcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpoPVwiZ2VuZXJhdG9yIGV4cHJlc3Npb25cIjtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6aD1cInlpZWxkIGV4cHJlc3Npb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOmg9XCJsaXN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6aD1cInNldCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpoPVwiZGljdCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OmNhc2UgU2suYXN0bm9kZXMuU2V0OmNhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmg9XCJsaXRlcmFsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aD1cIlRydWUsIEZhbHNlIG9yIE5vbmVcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6aD1cImNvbXBhcmlzb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJlcHI6aD1cInJlcHJcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOmg9XCJjb25kaXRpb25hbCBleHByZXNzaW9uXCI7XG5icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnRcIil9aWYoaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbid0IFwiKyhjPT09U2suYXN0bm9kZXMuU3RvcmU/XCJhc3NpZ24gdG9cIjpcImRlbGV0ZVwiKStcIiBcIitoLGEuY19maWxlbmFtZSxlLmxpbmVubyk7aWYoZilmb3IoYj0wO2I8Zi5sZW5ndGg7KytiKWcoYSxmW2JdLGMsZSl9ZnVuY3Rpb24gbihhKXtpZih2b2lkIDA9PT1PW2EudHlwZV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEudHlwZSxhLmxpbmVubyk7cmV0dXJuIE9bYS50eXBlXX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIGEudmFsdWU/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpOm5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBwKGEsZCl7ZShkLHIuY29tcF9vcCk7aWYoMT09PWMoZCkpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSB6LlRfTEVTUzpyZXR1cm4gU2suYXN0bm9kZXMuTHQ7XG5jYXNlIHouVF9HUkVBVEVSOnJldHVybiBTay5hc3Rub2Rlcy5HdDtjYXNlIHouVF9FUUVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5FcTtjYXNlIHouVF9MRVNTRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkx0RTtjYXNlIHouVF9HUkVBVEVSRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkd0RTtjYXNlIHouVF9OT1RFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTm90RXE7Y2FzZSB6LlRfTkFNRTppZihcImluXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5JbjtpZihcImlzXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc31lbHNlIGlmKDI9PT1jKGQpJiZiKGQsMCkudHlwZT09PXouVF9OQU1FKXtpZihcImluXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLk5vdEluO2lmKFwiaXNcIj09PWIoZCwwKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSXNOb3R9U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBjb21wX29wXCIpfWZ1bmN0aW9uIHUoYSxiKXthJiYoYS5saW5lbm89XG5iLmxpbmVubyxhLmNvbF9vZmZzZXQ9Yi5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubz1iLmVuZF9saW5lbm8sYS5lbmRfY29sX29mZnNldD1iLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gYX1mdW5jdGlvbiBBKGEsZCl7dmFyIGUsZj1bXTtTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcnx8ZC50eXBlPT09ci5saXN0bWFrZXJ8fGQudHlwZT09PXIudGVzdGxpc3RfY29tcHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zYWZlfHxkLnR5cGU9PT1yLnRlc3RsaXN0MSxcIm5vZGUgdHlwZSBtdXN0IGJlIGxpc3RsaWtlXCIpO2ZvcihlPTA7ZTxjKGQpO2UrPTIpU2suYXNzZXJ0cy5hc3NlcnQoYihkLGUpLnR5cGU9PT1yLnRlc3R8fGIoZCxlKS50eXBlPT09ci5vbGRfdGVzdHx8YihkLGUpLnR5cGU9PT1yLnN0YXJfZXhwciksZltlLzJdPXcoYSxiKGQsZSkpO3JldHVybiBmfWZ1bmN0aW9uIHQoYSxkKXt2YXIgZjtlKGQsci5zdWl0ZSk7XG52YXIgZz1bXTt2YXIgaz0wO2lmKGIoZCwwKS50eXBlPT09ci5zaW1wbGVfc3RtdCl7ZD1iKGQsMCk7dmFyIHg9YyhkKS0xO2IoZCx4LTEpLnR5cGU9PT16LlRfU0VNSSYmLS14O2ZvcihmPTA7Zjx4O2YrPTIpZ1trKytdPU4oYSxiKGQsZikpfWVsc2UgZm9yKGY9MjtmPGMoZCktMTsrK2Ype3g9YihkLGYpO2UoeCxyLnN0bXQpO3ZhciBuPWgoeCk7aWYoMT09PW4pZ1trKytdPU4oYSx4KTtlbHNlIGZvcih4PWIoeCwwKSxlKHgsci5zaW1wbGVfc3RtdCksbj0wO248Yyh4KTtuKz0yKXtpZigwPT09YyhiKHgsbikpKXtTay5hc3NlcnRzLmFzc2VydChuKzE9PT1jKHgpKTticmVha31nW2srK109TihhLGIoeCxuKSl9fVNrLmFzc2VydHMuYXNzZXJ0KGs9PT1oKGQpKTtyZXR1cm4gZ31mdW5jdGlvbiB2KGEsZCxmKXt2YXIgaDtlKGQsci5leHBybGlzdCk7dmFyIGs9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7dmFyIHg9dyhhLGIoZCxoKSk7a1toLzJdPXg7ZiYmZyhhLHgsZixiKGQsaCkpfXJldHVybiBrfVxuZnVuY3Rpb24gQihhLGQpe2E6Zm9yKDs7KXN3aXRjaChkLnR5cGUpe2Nhc2Ugci5pbXBvcnRfYXNfbmFtZTphPW51bGw7dmFyIGU9bChiKGQsMCkudmFsdWUpOzM9PT1jKGQpJiYoYT1iKGQsMikudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMoZSxudWxsPT1hP251bGw6bChhKSk7Y2FzZSByLmRvdHRlZF9hc19uYW1lOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2UgcmV0dXJuIGE9QihhLGIoZCwwKSksU2suYXNzZXJ0cy5hc3NlcnQoIWEuYXNuYW1lKSxhLmFzbmFtZT1sKGIoZCwyKS52YWx1ZSksYTtjYXNlIHIuZG90dGVkX25hbWU6aWYoMT09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGIoZCwwKS52YWx1ZSksbnVsbCk7YT1cIlwiO2ZvcihlPTA7ZTxjKGQpO2UrPTIpYSs9YihkLGUpLnZhbHVlK1wiLlwiO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChhLnN1YnN0cigwLGEubGVuZ3RoLTEpKSxudWxsKTtjYXNlIHouVF9TVEFSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChcIipcIiksXG5udWxsKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidW5leHBlY3RlZCBpbXBvcnQgbmFtZVwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7fX1mdW5jdGlvbiBEKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYi50eXBlPT1yLnRlc3RsaXN0X2NvbXB8fGIudHlwZT09ci5hcmd1bWVudCk7cmV0dXJuIGFhKGEsYiwwKX1mdW5jdGlvbiBFKGEsZCl7aWYoYihkLDApLnR5cGU9PT16LlRfTUlOVVMmJjI9PT1jKGQpKXt2YXIgZT1iKGQsMSk7aWYoZS50eXBlPT09ci5mYWN0b3ImJjE9PT1jKGUpJiYoZT1iKGUsMCksZS50eXBlPT09ci5wb3dlciYmMT09PWMoZSkpKXt2YXIgZj1iKGUsMCk7aWYoZi50eXBlPT09ci5hdG9tJiYoZT1iKGYsMCksZS50eXBlPT09ei5UX05VTUJFUikpcmV0dXJuIGUudmFsdWU9XCItXCIrZS52YWx1ZSxSKGEsZil9fWE9dyhhLGIoZCwxKSk7c3dpdGNoKGIoZCwwKS50eXBlKXtjYXNlIHouVF9QTFVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VQWRkLFxuYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX01JTlVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VU3ViLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHouVF9USUxERTpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuSW52ZXJ0LGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1Tay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZmFjdG9yXCIpfWZ1bmN0aW9uIEYoYSxnLGgsayl7dmFyIHgsbixsO2UoZyxyLmFyZ2xpc3QpO2Zvcih4PWw9bj0wO3g8YyhnKTt4Kyspe3ZhciBwPWIoZyx4KTtwLnR5cGU9PXIuYXJndW1lbnQmJigxPT1jKHApP24rKzpiKHAsMSkudHlwZT09ci5jb21wX2Zvcj8obisrLGt8fGYoYSxwLFwiaW52YWxpZCBzeW50YXhcIiksMTxjKGcpJiZmKGEscCxcIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZFwiKSk6YihwLDApLnR5cGU9PXouVF9TVEFSP24rKzpsKyspfXZhciBTPVxuW107dmFyIG09W107Zm9yKHg9az1sPW49MDt4PGMoZyk7eCsrKWlmKHA9YihnLHgpLHAudHlwZT09ci5hcmd1bWVudCl7dmFyIEo9YihwLDApO2lmKDE9PWMocCkpe2wmJihrP2YoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nXCIpOmYoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnRcIikpO3ZhciBLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNlIGlmKEoudHlwZT09ei5UX1NUQVIpe2lmKGspcmV0dXJuIGYoYSxKLFwiaXRlcmFibGUgYXJndW1lbnQgdW5wYWNraW5nIGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIiksbnVsbDtLPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLlN0YXJyZWQoSyxTay5hc3Rub2Rlcy5Mb2FkLEoubGluZW5vLEouY29sX29mZnNldCk7U1tuKytdPXB9ZWxzZSBpZihKLnR5cGU9PXouVF9ET1VCTEVTVEFSKXt4Kys7XG5LPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLmtleXdvcmQobnVsbCxLKTttW2wrK109cDtrKyt9ZWxzZSBpZihiKHAsMSkudHlwZT09ci5jb21wX2Zvcil7Sz1EKGEscCk7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZXt2YXIgdTtLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtpZihLLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuTGFtYmRhKXJldHVybiBmKGEsSixcImxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50XCIpLG51bGw7aWYoSy5jb25zdHJ1Y3RvciE9PVNrLmFzdG5vZGVzLk5hbWUpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uXCIpLG51bGw7aWYoZChhLEsuaWQscCwxKSlyZXR1cm4gbnVsbDt2YXIgQT1LLmlkO2Zvcih1PTA7dTxsO3UrKylpZigoSz1tW3VdLmFyZykmJks9PT1BKXJldHVybiBmKGEsSixcImtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWRcIiksbnVsbDtLPXcoYSxiKHAsXG4yKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChBLEspO21bbCsrXT1wfX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNhbGwoaCxTLG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBNKGEsZCxmKXtlKGQsci50cmFpbGVyKTtpZihiKGQsMCkudHlwZT09ei5UX0xQQVIpcmV0dXJuIDI9PWMoZCk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoZixudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpGKGEsYihkLDEpLGYsITApO2lmKGIoZCwwKS50eXBlPT16LlRfRE9UKXt2YXIgZz1rKGIoZCwxKSk7cmV0dXJuIGc/bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShmLGcsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGx9ZShiKGQsMCksei5UX0xTUUIpO2UoYihkLDIpLHouVF9SU1FCKTtkPWIoZCwxKTtpZigxPT1jKGQpKXJldHVybihnPUkoYSxiKGQsMCkpKT9uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsZyxcblNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpudWxsO3ZhciBoLG49MSx4PVtdO2ZvcihoPTA7aDxjKGQpO2grPTIpe2c9SShhLGIoZCxoKSk7aWYoIWcpcmV0dXJuIG51bGw7Zy5raW5kIT1aLkluZGV4X2tpbmQmJihuPTApO3hbaC8yXT1nfWlmKCFuKXJldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkV4dFNsaWNlKHgpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTthPVtdO2ZvcihoPTA7aDx4Lmxlbmd0aDsrK2gpZz14W2hdLFNrLmFzc2VydHMuYXNzZXJ0KGcua2luZD09Wi5JbmRleF9raW5kJiZnLnYuSW5kZXgudmFsdWUpLGFbaF09Zy52LkluZGV4LnZhbHVlO2c9bmV3IFNrLmFzdG5vZGVzLlR1cGxlKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkluZGV4KGcpLFNrLmFzdG5vZGVzLkxvYWQsXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFYoYSxkKXtlKGQsci5mbG93X3N0bXQpO3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHIuYnJlYWtfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJyZWFrKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLmNvbnRpbnVlX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Db250aW51ZShkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugci55aWVsZF9zdG10OnJldHVybihhPXcoYSxiKGcsMCkpKT9uZXcgU2suYXN0bm9kZXMuRXhwcihhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtjYXNlIHIucmV0dXJuX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJldHVybihudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sXG5kLmVuZF9jb2xfb2Zmc2V0KTt2YXIgaD1XKGEsYihnLDEpKTtyZXR1cm4gaD9uZXcgU2suYXN0bm9kZXMuUmV0dXJuKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yYWlzZV9zdG10OmlmKDE9PWMoZykpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShudWxsLG51bGwsbnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7aWYoMjw9YyhnKSl7dmFyIGs9bnVsbDtoPXcoYSxiKGcsMSkpO3ZhciBuPW51bGwseD1udWxsOzQ9PWMoZykmJlwiZnJvbVwiPT1iKGcsMikudmFsdWU/KFNrLl9fZnV0dXJlX18ucHl0aG9uM3x8ZihhLGIoZywyKSxcInJhaXNlIC4uLiBmcm9tIC4uLiBpcyBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAyXCIpLGs9dyhhLGIoZywzKSkpOjQ8PWMoZykmJlwiLFwiPT1iKGcsMikudmFsdWUmJihTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmYoYSxcbmQsXCJPbGQgcmFpc2Ugc3ludGF4IGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDNcIiksbj13KGEsYihnLDMpKSw2PT1jKGcpJiYoeD13KGEsYihnLDUpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUmFpc2UoaCxrLG4seCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpfWRlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgZmxvd19zdG10OiBcIixnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIHkoYSxlKXt2YXIgZj1udWxsO1NrLmFzc2VydHMuYXNzZXJ0KGUudHlwZT09PXIudGZwZGVmfHxlLnR5cGU9PT1yLnZmcGRlZik7dmFyIGc9YihlLDApO2QoYSxnLGcudmFsdWUsZy5saW5lbm8pO2c9bChnLnZhbHVlKTszPT1jKGUpJiZiKGUsMSkudHlwZT09PXouVF9DT0xPTiYmKGY9dyhhLGIoZSwyKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYXJnKGcsZixlLmxpbmVubyxlLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIEcoYSxcbmUsZyxoLGspe3ZhciBuPWcseD0wO2h8fGYoYSxiKGUsZyksXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChrKTtuPGMoZSk7KXt2YXIgcD1iKGUsbik7c3dpdGNoKHAudHlwZSl7Y2FzZSByLnZmcGRlZjpjYXNlIHIudGZwZGVmOm4rMTxjKGUpJiZiKGUsbisxKS50eXBlPT16LlRfRVFVQUw/KGtbeF09dyhhLGIoZSxuKzIpKSxuKz0yKTprW3hdPW51bGw7dmFyIG09Mz09YyhwKT93KGEsYihwLDIpKTpudWxsO3A9YihwLDApO2QoYSxwLHAudmFsdWUscC5saW5lbm8pO2c9bChwLnZhbHVlKTtoW3grK109bmV3IFNrLmFzdG5vZGVzLmFyZyhnLG0scC5saW5lbm8scC5jb2xfb2Zmc2V0KTtuKz0yO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6cmV0dXJuIG47ZGVmYXVsdDpmKGEscCxcInVuZXhwZWN0ZWQgbm9kZVwiKX19cmV0dXJuIG59ZnVuY3Rpb24gTChhLGQpe3ZhciBlLGYsZyxoPVtdLGs9W10sbj1bXSx4PVtdLGw9bnVsbCxcbnA9bnVsbDtpZihkLnR5cGU9PT1yLnBhcmFtZXRlcnMpe2lmKDI9PT1jKGQpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLFtdLFtdLG51bGwsW10pO2Q9YihkLDEpfVNrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudmFyYXJnc2xpc3R8fGQudHlwZT09PXIudHlwZWRhcmdzbGlzdCk7Zm9yKGU9Zj1nPTA7ZzxjKGQpOyl7dmFyIG09YihkLGcpO3N3aXRjaChtLnR5cGUpe2Nhc2Ugci50ZnBkZWY6Y2FzZSByLnZmcGRlZjppZihnKzE8YyhkKSYmYihkLGcrMSkudHlwZT09ei5UX0VRVUFMKXtrW2YrK109dyhhLGIoZCxnKzIpKTtnKz0yO3ZhciBKPTF9ZWxzZSBpZihKKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50XCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTtoW2UrK109eShhLG0pO2crPTI7YnJlYWs7Y2FzZSB6LlRfU1RBUjppZihnKzE+PWMoZCl8fGcrMj09XG5jKGQpJiZiKGQsZysxKS50eXBlPT16LlRfQ09NTUEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTttPWIoZCxnKzEpO20udHlwZT09ei5UX0NPTU1BPyhnKz0yLGc9RyhhLGQsZyxuLHgpKToobD15KGEsbSksZys9MyxnPGMoZCkmJihiKGQsZykudHlwZT09ci50ZnBkZWZ8fGIoZCxnKS50eXBlPT1yLnZmcGRlZikmJihnPUcoYSxkLGcsbix4KSkpO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6bT1iKGQsZysxKTtTay5hc3NlcnRzLmFzc2VydChtLnR5cGU9PXIudGZwZGVmfHxtLnR5cGU9PXIudmZwZGVmKTtwPXkoYSxtKTtnKz0zO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBub2RlIGluIHZhcmFyZ3NsaXN0XCIpO3JldHVybn19cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKGgsbCxuLHgscCxrKX1mdW5jdGlvbiBUKGEsXG5nLGgsbil7dmFyIHg9bj9iKGcsMSk6ZyxsPW51bGwscD0xLG09bnVsbDtpZihuJiY1PmEuY19mZWF0dXJlX3ZlcnNpb24pcmV0dXJuIGYoYSx4LFwiQXN5bmMgZnVuY3Rpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBQeXRob24gMy41IGFuZCBncmVhdGVyXCIpLG51bGw7ZSh4LHIuZnVuY2RlZik7dmFyIFM9ayhiKHgscCkpO2lmKGQoYSxTLGIoeCxwKSwwKSlyZXR1cm4gbnVsbDt2YXIgSj1MKGEsYih4LHArMSkpO2lmKCFKKXJldHVybiBudWxsO2lmKGIoeCxwKzIpLnR5cGU9PXouVF9SQVJST1cpe2w9dyhhLGIoeCxwKzMpKTtpZighbClyZXR1cm4gbnVsbDtwKz0yfWlmKGIoeCxwKzMpLnR5cGU9PXouVF9UWVBFX0NPTU1FTlQpe209ei5UX05FV19UWVBFX0NPTU1FTlQoYih4LHArMykpO2lmKCFtKXJldHVybiBudWxsO3ArPTF9dmFyIEs9dChhLGIoeCxwKzMpKTtpZighSylyZXR1cm4gbnVsbDtpZigxPGMoYih4LHArMykpJiYocD1iKGIoeCxwKzMpLDEpLHAudHlwZT09ei5UX1RZUEVfQ09NTUVOVCkpe2lmKG51bGwhPVxubSlyZXR1cm4gZihhLHgsXCJDYW5ub3QgaGF2ZSB0d28gdHlwZSBjb21tZW50cyBvbiBkZWZcIiksbnVsbDttPXouVF9ORVdfVFlQRV9DT01NRU5UKHApO2lmKCFtKXJldHVybiBudWxsfXJldHVybiBuP25ldyBTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmKFMsSixLLGgsbCxtLGcubGluZW5vLGcuY29sX29mZnNldCx2b2lkIDAsdm9pZCAwKTpuZXcgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0seC5saW5lbm8seC5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApfWZ1bmN0aW9uIFAoYSxmLGcpe2UoZixyLmNsYXNzZGVmKTtpZig0PT1jKGYpKXt2YXIgaD10KGEsYihmLDMpKTt2YXIgbj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwzKSxuLGYubGluZW5vKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1pZihiKGYsMykudHlwZT09PXouVF9SUEFSKXJldHVybiBoPXQoYSxiKGYsNSkpLG49XG5rKGIoZiwxKS52YWx1ZSksZChhLGIoZiwzKSxuLGIoZiwzKS5saW5lbm8pLG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLFtdLFtdLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCk7bj1rKGIoZiwxKSk7bj1uZXcgU2suYXN0bm9kZXMuTmFtZShuLFNrLmFzdG5vZGVzLkxvYWQsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTt2YXIgbD1GKGEsYihmLDMpLG4sITEpO2g9dChhLGIoZiw2KSk7bj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwxKSxuLGIoZiwxKS5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixsLmFyZ3MsbC5rZXl3b3JkcyxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFEoYSxkKXtmdW5jdGlvbiBmKGEsZCl7Zm9yKGE9MDs7KXtlKGQsci5jb21wX2l0ZXIpO2lmKGIoZCwwKS50eXBlPT09ci5jb21wX2ZvcilyZXR1cm4gYTtkPWIoZCwwKTtlKGQsci5jb21wX2lmKTthKys7aWYoMj09PWMoZCkpcmV0dXJuIGE7ZD1cbmIoZCwyKX19dmFyIGc7dmFyIGg9ZnVuY3Rpb24oYSxkKXthPTA7YTpmb3IoOzspe2ErKztlKGQsci5jb21wX2Zvcik7aWYoNT09PWMoZCkpZD1iKGQsNCk7ZWxzZSByZXR1cm4gYTtiOmZvcig7Oyl7ZShkLHIuY29tcF9pdGVyKTtkPWIoZCwwKTtpZihkLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGE7ZWxzZSBpZihkLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZCkpe2Q9YihkLDIpO2NvbnRpbnVlIGJ9ZWxzZSByZXR1cm4gYTticmVha31icmVha31Tay5hc3NlcnRzLmZhaWwoXCJsb2dpYyBlcnJvciBpbiBjb3VudENvbXBGb3JzXCIpfShhLGQpO3ZhciBrPVtdO2ZvcihnPTA7ZzxoOysrZyl7ZShkLHIuY29tcF9mb3IpO3ZhciBuPWIoZCwxKTt2YXIgbD12KGEsbixTay5hc3Rub2Rlcy5TdG9yZSk7dmFyIHA9dyhhLGIoZCwzKSk7dmFyIHg9MT09PWMobik/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obFswXSxwLFtdKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUobCxcblNrLmFzdG5vZGVzLlN0b3JlLGQubGluZW5vLGQuY29sX29mZnNldCkscCxbXSk7aWYoNT09PWMoZCkpe2Q9YihkLDQpO3ZhciBtPWYoYSxkKTtuPVtdO2ZvcihsPTA7bDxtOysrbCllKGQsci5jb21wX2l0ZXIpLGQ9YihkLDApLGUoZCxyLmNvbXBfaWYpLHA9dyhhLGIoZCwxKSksbltsXT1wLDM9PT1jKGQpJiYoZD1iKGQsMikpO2QudHlwZT09PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3guaWZzPW59a1tnXT14fXJldHVybiBrfWZ1bmN0aW9uIFUoYSxkKXt2YXIgZj1bXTthOnt2YXIgZz1kO3ZhciBoPTA7Yjpmb3IoOzspe3ZhciBrPTA7aCsrO2UoZyxyLmNvbXBfZm9yKTtiKGcsMCkudHlwZT09ei5UX0FTWU5DJiYoaz0xKTtpZihjKGcpPT01K2spZz1iKGcsNCtrKTtlbHNlIGJyZWFrIGE7Yzpmb3IoOzspe2UoZyxyLmNvbXBfaXRlcik7Zz1iKGcsMCk7aWYoZy50eXBlPT09ci5jb21wX2Zvciljb250aW51ZSBiO2Vsc2UgaWYoZy50eXBlPT09ci5jb21wX2lmKWlmKDM9PT1jKGcpKXtnPVxuYihnLDIpO2NvbnRpbnVlIGN9ZWxzZSBicmVhayBhO2JyZWFrfWJyZWFrfWg9dm9pZCAwfWZvcihnPTA7ZzxoO2crKyl7dmFyIG49MDtiKGQsMCkudHlwZT09ei5UX0FTWU5DJiYobj0xKTt2YXIgbD1iKGQsMStuKTt2YXIgcD12KGEsbCxTay5hc3Rub2Rlcy5TdG9yZSk7aWYoIXApcmV0dXJuIG51bGw7az13KGEsYihkLDMrbikpO2lmKCFrKXJldHVybiBudWxsO3ZhciB4PXBbMF07cD0xPT1jKGwpP25ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKHgsayxudWxsLG4pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShwLFNrLmFzdG5vZGVzLlN0b3JlLHgubGluZW5vLHguY29sX29mZnNldCxsLmVuZF9saW5lbm8sbC5lbmRfY29sX29mZnNldCksayxudWxsLG4pO2lmKGMoZCk9PTUrbil7eD1bXTtkPWIoZCw0K24pO2E6Zm9yKGs9ZCxuPTA7Oyl7ZShrLHIuY29tcF9pdGVyKTtpZihiKGssMCkudHlwZT09ci5jb21wX2Zvcil7bD1uO2JyZWFrIGF9az1cbmIoaywwKTtlKGssci5jb21wX2lmKTtuKys7aWYoMj09YyhrKSl7bD1uO2JyZWFrIGF9az1iKGssMil9aWYoLTE9PWwpcmV0dXJuIG51bGw7Zm9yKG49MDtuPGw7bisrKXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2s9dyhhLGIoZCwxKSk7aWYoIWspcmV0dXJuIG51bGw7eFtuXT1rOzM9PWMoZCkmJihkPWIoZCwyKSl9ZC50eXBlPT1yLmNvbXBfaXRlciYmKGQ9YihkLDApKTtwLmlmcz14fWZbZ109cH1yZXR1cm4gZn1mdW5jdGlvbiBhYShhLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoMTxjKGQpKTt2YXIgZz1iKGQsMCk7dmFyIGg9dyhhLGcpO2lmKGguY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXJldHVybiBmKGEsZyxcIml0ZXJhYmxlIHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBjb21wcmVoZW5zaW9uXCIpLG51bGw7YT1VKGEsYihkLDEpKTtyZXR1cm4gMD09ZT9uZXcgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwKGgsYSxkLmxpbmVubyxcbmQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6MT09ZT9uZXcgU2suYXN0bm9kZXMuTGlzdENvbXAoaCxhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Mj09ZT9uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsfWZ1bmN0aW9uIGNhKGEsYyl7ZShjLHIuYXVnYXNzaWduKTtjPWIoYywwKTtzd2l0Y2goYy52YWx1ZS5jaGFyQXQoMCkpe2Nhc2UgXCIrXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkFkZDtjYXNlIFwiLVwiOnJldHVybiBTay5hc3Rub2Rlcy5TdWI7Y2FzZSBcIi9cIjpyZXR1cm5cIi9cIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLkZsb29yRGl2OlNrLmFzdG5vZGVzLkRpdjtjYXNlIFwiJVwiOnJldHVybiBTay5hc3Rub2Rlcy5Nb2Q7Y2FzZSBcIjxcIjpyZXR1cm4gU2suYXN0bm9kZXMuTFNoaWZ0O2Nhc2UgXCI+XCI6cmV0dXJuIFNrLmFzdG5vZGVzLlJTaGlmdDtcbmNhc2UgXCImXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdEFuZDtjYXNlIFwiXlwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRYb3I7Y2FzZSBcInxcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0T3I7Y2FzZSBcIipcIjpyZXR1cm5cIipcIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLlBvdzpTay5hc3Rub2Rlcy5NdWx0O2Nhc2UgXCJAXCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBTay5hc3Rub2Rlcy5NYXRNdWx0O2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBhdWdhc3NpZ25cIil9fWZ1bmN0aW9uIFcoYSxkKXtTay5hc3NlcnRzLmFzc2VydCgwPGMoZCkpO2QudHlwZT09PXIudGVzdGxpc3RfY29tcD8xPGMoZCkmJlNrLmFzc2VydHMuYXNzZXJ0KGIoZCwxKS50eXBlIT09ci5jb21wX2Zvcik6U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci50ZXN0bGlzdHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zdGFyX2V4cHIpO3JldHVybiAxPT09YyhkKT93KGEsYihkLDApKTpuZXcgU2suYXN0bm9kZXMuVHVwbGUoQShhLFxuZCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGRhKGEsZil7ZShmLHIuZXhwcl9zdG10KTtpZigxPT09YyhmKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkV4cHIoVyhhLGIoZiwwKSksZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtpZihiKGYsMSkudHlwZT09PXIuYXVnYXNzaWduKXt2YXIgaD1iKGYsMCk7dmFyIGs9VyhhLGgpO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dmFyIG49ay5pZDtkKGEsaCxuLGYubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxcbmYubGluZW5vKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50XCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTt9aD1iKGYsMik7bj1oLnR5cGU9PT1yLnRlc3RsaXN0P1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5BdWdBc3NpZ24oayxjYShhLGIoZiwxKSksbixmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwxKS50eXBlPT09ci5hbm5hc3NpZ24pe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJBbm5vdGF0ZWQgYXNzaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG5hLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9YihmLDApO3ZhciBsPWIoZiwxKTt2YXIgcD0xO2ZvcihrPWg7MT09YyhrKTspaz1iKGssMCk7MDxjKGspJiZiKGssMCkudHlwZT09ei5UX0xQQVImJihwPTApO2s9VyhhLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6bj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOm49ay5hdHRyO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmcoYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IGxpc3QpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO1xuY2FzZSBTay5hc3Rub2Rlcy5UdXBsZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IHR1cGxlKSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaWxsZWdhbCB0YXJnZXQgZm9yIGFubm90YXRpb25cIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31rLmNvbnN0cnVjdG9yIT1Tay5hc3Rub2Rlcy5OYW1lJiYocD0wKTtoPWIobCwxKTtuPXcoYSxoKTtpZigyPT1jKGwpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixudWxsLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtoPWIobCwzKTthPXcoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkFubkFzc2lnbihrLG4sYSxwLGYubGluZW5vLGYuY29sX29mZnNldCl9ZShiKGYsMSksei5UX0VRVUFMKTtwPVtdO2ZvcihrPTA7azxjKGYpLTI7ays9Mil7aD1iKGYsayk7aWYoaC50eXBlPT09XG5yLnlpZWxkX2V4cHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtoPVcoYSxoKTtnKGEsaCxTay5hc3Rub2Rlcy5TdG9yZSxiKGYsaykpO3Bbay8yXT1ofWg9YihmLGMoZiktMSk7YT1oLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcj9XKGEsaCk6dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQXNzaWduKHAsYSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGVhKGEsYixjLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoYz49Yik7U2suYXNzZXJ0cy5hc3NlcnQoXCJ7XCI9PWEuY2hhckF0KGItMSkpO1NrLmFzc2VydHMuYXNzZXJ0KFwifVwiPT1hLmNoYXJBdChjKXx8XCIhXCI9PWEuY2hhckF0KGMpfHxcIjpcIj09YS5jaGFyQXQoYykpO2E9YS5zdWJzdHJpbmcoYixjKTsvXlxccyokLy50ZXN0KGEpJiZmKGQsZSxcImYtc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkXCIpO1xudHJ5e2xldCBiPVNrLnBhcnNlKFwiPGZzdHJpbmc+XCIsXCIoXCIrYStcIilcIik7dmFyIGc9U2suYXN0RnJvbVBhcnNlKGIuY3N0LFwiPGZzdHJpbmc+XCIsYi5mbGFncyl9Y2F0Y2goWSl7dGhyb3cgWS50cmFjZWJhY2smJlkudHJhY2ViYWNrWzBdJiYoZz1ZLnRyYWNlYmFja1swXSxnLmxpbmVubz0oZy5saW5lbm98fDEpLTErZS5saW5lbm8sZy5maWxlbmFtZT1kLmNfZmlsZW5hbWUpLFk7fVNrLmFzc2VydHMuYXNzZXJ0KDE9PWcuYm9keS5sZW5ndGgmJmcuYm9keVswXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLkV4cHIpO3JldHVybiBnLmJvZHlbMF0udmFsdWV9ZnVuY3Rpb24gSChhLGIsYyxkLGUsZyxoKXtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYikpO2IrKzt2YXIgaz1iO2xldCBuPW51bGwsbD0wLHA9MCxtLHgsUz0oKT0+ZihnLGgsXCJmLXN0cmluZzogZXhwZWN0aW5nICd9J1wiKTtmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYjw9Yyk7YjxjO2IrKyl7bGV0IGQ9YS5jaGFyQXQoYik7XG5cIlxcXFxcIj09ZCYmZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgYSBiYWNrc2xhc2hcIik7aWYobilkPT1uJiYoMz09bD9iKzI8YyYmYS5jaGFyQXQoYisxKT09ZCYmYS5jaGFyQXQoYisyKT09ZCYmKGIrPTIsbj1sPTApOmw9bj0wKTtlbHNlIGlmKFwiJ1wiPT1kfHwnXCInPT1kKWIrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kPyhsPTMsYis9Mik6bD0xLG49ZDtlbHNlIGlmKFwiW1wiPT1kfHxcIntcIj09ZHx8XCIoXCI9PWQpcCsrO2Vsc2UgaWYoMCE9cCYmKFwiXVwiPT1kfHxcIn1cIj09ZHx8XCIpXCI9PWQpKXAtLTtlbHNlIGlmKFwiI1wiPT1kKWYoZyxoLFwiZi1zdHJpbmcgZXhwcmVzc2lvbiBwYXJ0IGNhbm5vdCBpbmNsdWRlICcjJ1wiKTtlbHNlIGlmKCEoMCE9cHx8XCIhXCIhPWQmJlwiOlwiIT1kJiZcIn1cIiE9ZHx8XCIhXCI9PWQmJmIrMTxjJiZcIj1cIj09YS5jaGFyQXQoYisxKSkpYnJlYWt9biYmZihnLGgsXCJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbnAmJmYoZyxoLFwiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJ1wiKTtrPWVhKGEsayxiLGcsaCk7XCIhXCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSx4PWEuY2hhckF0KGIpLGIrKyxcInNcIiE9eCYmXCJyXCIhPXgmJlwiYVwiIT14JiZmKGcsaCxcImYtc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyOiBleHBlY3RlZCAncycsICdyJywgb3IgJ2EnXCIpKTtiPj1jJiZTKCk7XCI6XCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSxbbSxiXT1iYShhLGIsYyxkLGUrMSxnLGgpKTsoYj49Y3x8XCJ9XCIhPWEuY2hhckF0KGIpKSYmUygpO2IrKztyZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlKGsseCxtLGgubGluZW5vLGguY29sX29mZnNldCksYl19ZnVuY3Rpb24gYmEoYSxiLGMsZCxlLGYsZyl7bGV0IGg9W10saz1hPT57aWYoLTEhPT1hLmluZGV4T2YoXCJ9XCIpKXtpZigvKF58W159XSl9KH19KSooJHxbXn1dKS8udGVzdChhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZFwiLFxuZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTthPWEucmVwbGFjZSgvfX0vZyxcIn1cIil9aC5wdXNoKG5ldyBTay5hc3Rub2Rlcy5TdHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGcubGluZW5vLGcuY29sX29mZnNldCxmLmVuZF9saW5lbm8sZy5lbmRfY29sX29mZnNldCkpfTtmb3IoO2I8Yzspe2xldCBuPWEuaW5kZXhPZihcIntcIixiKTtpZigwIT09ZSl7bGV0IGQ9YS5pbmRleE9mKFwifVwiLGIpOy0xIT09ZCYmKC0xPT09bj9jPWQ6bj5kJiYobj0tMSxjPWQpKX1pZigtMT09PW4pe2soYS5zdWJzdHJpbmcoYixjKSk7Yj1jO2JyZWFrfWVsc2UgaWYobisxPGMmJlwie1wiPT09YS5jaGFyQXQobisxKSlrKGEuc3Vic3RyaW5nKGIsbisxKSksYj1uKzI7ZWxzZXtrKGEuc3Vic3RyaW5nKGIsbikpO2I9bjtsZXQgW2wscF09SChhLG4sYyxkLGUsZixnKTtoLnB1c2gobCk7Yj1wfX1yZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihoLGcubGluZW5vLGcuY29sX29mZnNldCksYl19ZnVuY3Rpb24gWChhLFxuYixjKXt2YXIgZD1iLmNoYXJBdChiLmxlbmd0aC0xKTtpZigtMSE9PWIuaW5kZXhPZihcIl9cIikpe2lmKGZhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEuY19maWxlbmFtZSxjKTtpZihoYS50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBkZWNpbWFsIGxpdGVyYWxcIixhLmNfZmlsZW5hbWUsYyk7Yj1iLnJlcGxhY2UoaWEsXCJcIil9aWYoXCJqXCI9PT1kfHxcIkpcIj09PWQpcmV0dXJuIFNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoYik7aWYoXCJsXCI9PT1kfHxcIkxcIj09PWQpcmV0dXJuIFNrLmxvbmdGcm9tU3RyKGIuc3Vic3RyKDAsYi5sZW5ndGgtMSksMCk7aWYoLTEhPT1iLmluZGV4T2YoXCIuXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7Yz1iO2E9ITE7XCItXCI9PT1iLmNoYXJBdCgwKSYmKGM9Yi5zdWJzdHIoMSksYT1cbiEwKTtpZihcIjBcIiE9PWMuY2hhckF0KDApfHxcInhcIiE9PWMuY2hhckF0KDEpJiZcIlhcIiE9PWMuY2hhckF0KDEpKXtpZigtMSE9PWIuaW5kZXhPZihcImVcIil8fC0xIT09Yi5pbmRleE9mKFwiRVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHBhcnNlRmxvYXQoYikpO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwiYlwiIT09Yy5jaGFyQXQoMSkmJlwiQlwiIT09Yy5jaGFyQXQoMSkpaWYoXCIwXCI9PT1jLmNoYXJBdCgwKSlpZihcIjBcIj09PWMpYz0wO2Vsc2V7Yz1jLnN1YnN0cmluZygxKTtpZihcIm9cIj09PWMuY2hhckF0KDApfHxcIk9cIj09PWMuY2hhckF0KDApKWM9Yy5zdWJzdHJpbmcoMSk7Yz1wYXJzZUludChjLDgpfWVsc2UgYz1wYXJzZUludChjLDEwKTtlbHNlIGM9Yy5zdWJzdHJpbmcoMiksYz1wYXJzZUludChjLDIpfWVsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMTYpO3JldHVybiBjPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZNYXRoLmZsb29yKGMpPT09YyYmLTE9PT1iLmluZGV4T2YoXCJlXCIpJiZcbi0xPT09Yi5pbmRleE9mKFwiRVwiKT9Tay5sb25nRnJvbVN0cihiLDApOmE/bmV3IFNrLmJ1aWx0aW4uaW50XygtYyk6bmV3IFNrLmJ1aWx0aW4uaW50XyhjKX1mdW5jdGlvbiBJKGEsZCl7dmFyIGYsZztlKGQsci5zdWJzY3JpcHQpO3ZhciBoPWIoZCwwKTt2YXIgaz1mPWc9bnVsbDtpZihoLnR5cGU9PT16LlRfRE9UKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXM7aWYoMT09PWMoZCkmJmgudHlwZT09PXIudGVzdClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkluZGV4KHcoYSxoKSk7aC50eXBlPT09ci50ZXN0JiYoZz13KGEsaCkpO2gudHlwZT09PXouVF9DT0xPTj8xPGMoZCkmJihoPWIoZCwxKSxoLnR5cGU9PT1yLnRlc3QmJihmPXcoYSxoKSkpOjI8YyhkKSYmKGg9YihkLDIpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk7aD1iKGQsYyhkKS0xKTtoLnR5cGU9PT1yLnNsaWNlb3AmJigxPT09YyhoKT8oaD1iKGgsMCksaz1uZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxcblNrLmFzdG5vZGVzLkxvYWQsaC5saW5lbm8saC5jb2xfb2Zmc2V0KSk6KGg9YihoLDEpLGgudHlwZT09PXIudGVzdCYmKGs9dyhhLGgpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU2xpY2UoZyxmLGspfWZ1bmN0aW9uIFIoYSxkKXt2YXIgZz1iKGQsMCk7c3dpdGNoKGcudHlwZSl7Y2FzZSB6LlRfTkFNRTp2YXIgaD1nLnZhbHVlO2lmKDQ8PWgubGVuZ3RoJiY1Pj1oLmxlbmd0aCl7aWYoXCJOb25lXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiVHJ1ZVwiPT09aClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLmJvb2wudHJ1ZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtpZihcIkZhbHNlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1hPVxuayhoLGEpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZShhLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9TVFJJTkc6Zz1bXTtmb3IodmFyIG49MDtuPGMoZCk7KytuKXt2YXIgcD1iKGQsbikudmFsdWU7dmFyIG09YTt2YXIgeD1iKGQsbik7dmFyIHQ9cDt2YXIgcT10LmNoYXJBdCgwKTtmb3IodmFyIEo9ITEsdj1wPSExOzspe2lmKFwidVwiIT09cSYmXCJVXCIhPT1xKWlmKFwiclwiPT09cXx8XCJSXCI9PT1xKUo9ITA7ZWxzZSBpZihcImJcIj09PXF8fFwiQlwiPT09cSl2PSEwO2Vsc2UgaWYoXCJmXCI9PT1xfHxcIkZcIj09PXEpcD0hMDtlbHNlIGJyZWFrO3Q9dC5zdWJzdHIoMSk7cT10LmNoYXJBdCgwKX1Tay5hc3NlcnRzLmFzc2VydChcIidcIj09PXF8fCdcIic9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0xKT09PXEpO3Q9dC5zdWJzdHIoMSx0Lmxlbmd0aC0yKTs0PD10Lmxlbmd0aCYmdC5jaGFyQXQoMCk9PT1xJiZcbnQuY2hhckF0KDEpPT09cSYmKFNrLmFzc2VydHMuYXNzZXJ0KHQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSYmdC5jaGFyQXQodC5sZW5ndGgtMik9PT1xKSx0PXQuc3Vic3RyKDIsdC5sZW5ndGgtNCkpO2lmKEp8fC0xPT09dC5pbmRleE9mKFwiXFxcXFwiKSl7aWYodilmb3IocT0wO3E8dC5sZW5ndGg7cSsrKTEyNzx0LmNoYXJDb2RlQXQocSkmJmYobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik7bT1bbCh0KSxwLHZdfWVsc2V7Sj10O3ZhciBCPUoubGVuZ3RoLHk9XCJcIjtmb3IodD0wO3Q8QjsrK3QpcT1KLmNoYXJBdCh0KSxcIlxcXFxcIj09PXE/KCsrdCxxPUouY2hhckF0KHQpLFwiblwiPT09cT95Kz1cIlxcblwiOlwiXFxcXFwiPT09cT95Kz1cIlxcXFxcIjpcInRcIj09PXE/eSs9XCJcXHRcIjpcInJcIj09PXE/eSs9XCJcXHJcIjpcImJcIj09PXE/eSs9XCJcXGJcIjpcImZcIj09PXE/eSs9XCJcXGZcIjpcInZcIj09PXE/eSs9XCJcXHZcIjpcIjBcIj09PXE/eSs9XCJcXHgwMFwiOidcIic9PT1xP3krPSdcIic6XCInXCI9PT1xP1xueSs9XCInXCI6XCJcXG5cIiE9PXEmJihcInhcIj09PXE/KHQrMj49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHhOTiBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChKLnN1YnN0cih0KzEsMiksMTYpKSx0Kz0yKTp2fHxcInVcIiE9PXE/dnx8XCJVXCIhPT1xP3krPVwiXFxcXFwiK3E6KHQrOD49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXFVYWFhYWFhYWCBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoSi5zdWJzdHIodCsxLDgpLDE2KSksdCs9OCk6KHQrND49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHVYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSw0KSwxNikpLHQrPTQpKSk6diYmMTI3PHEuY2hhckNvZGVBdCgwKT9mKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpOnkrPXE7bT15O209W2wobSkscCx2XX1wPW07bT1wWzBdO3g9cFsxXTtwPXBbMl07MCE9biYmXG5oIT09cCYmZihhLGQsXCJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFsc1wiKTtoPXA7aWYoeCl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3RyaW5nIChmLXN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIpXCIsYS5jX2ZpbGVuYW1lLGIoZCxuKS5saW5lbm8pO3ZhciBGPW0uJGpzc3RyKCk7W0ZdPWJhKEYsMCxGLmxlbmd0aCwhMSwwLGEsYihkLG4pKTtnLnB1c2guYXBwbHkoZyxGLnZhbHVlcyk7Rj1udWxsfWVsc2UgRj9GLnM9Ri5zLnNxJGNvbmNhdChtKTooRj1uZXcgKGg/U2suYXN0bm9kZXMuQnl0ZXM6U2suYXN0bm9kZXMuU3RyKShtLGQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCksZy5wdXNoKEYpKX1kPTE9PT1nLmxlbmd0aCYmZ1swXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0cj9nWzBdOm5ldyBTay5hc3Rub2Rlcy5Kb2luZWRTdHIoZyxcbmQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7cmV0dXJuIGQ7Y2FzZSB6LlRfTlVNQkVSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuTnVtKFgoYSxnLnZhbHVlLGQubGluZW5vKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX0VMTElQU0lTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXMoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9MUEFSOnJldHVybiBnPWIoZCwxKSxnLnR5cGU9PXouVF9SUEFSP25ldyBTay5hc3Rub2Rlcy5UdXBsZShbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Zy50eXBlPT1yLnlpZWxkX2V4cHI/dyhhLGcpOjE9PWMoZyk/VyhhLGcpOmIoZywxKS50eXBlPT1yLmNvbXBfZm9yP3UoRChhLGcpLGQpOnUoVyhhLGcpLGQpO2Nhc2Ugei5UX0xTUUI6Zz1cbmIoZCwxKTtpZihnLnR5cGU9PXouVF9SU1FCKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTGlzdChbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7ZShnLHIudGVzdGxpc3RfY29tcCk7aWYoMT09YyhnKXx8YihnLDEpLnR5cGU9PXouVF9DT01NQSlyZXR1cm4oYT1BKGEsZykpP25ldyBTay5hc3Rub2Rlcy5MaXN0KGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09ci50ZXN0bGlzdF9jb21wKTthPWFhKGEsaCwxKTtyZXR1cm4gdShhLGQpO2Nhc2Ugei5UX0xCUkFDRTpnPWIoZCwxKTtpZihnLnR5cGU9PXouVF9SQlJBQ0UpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EaWN0KG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO1xuaD1iKGcsMCkudHlwZT09ei5UX0RPVUJMRVNUQVI7aWYoMT09YyhnKXx8MTxjKGcpJiZiKGcsMSkudHlwZT09ei5UX0NPTU1BKXtoPWc7bj1bXTtTay5hc3NlcnRzLmFzc2VydChoLnR5cGU9PT1yLmRpY3RvcnNldG1ha2VyKTtmb3IoZz0wO2c8YyhoKTtnKz0yKUY9dyhhLGIoaCxnKSksbltnLzJdPUY7YT1uZXcgU2suYXN0bm9kZXMuU2V0KG4saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNlIGlmKDE8YyhnKSYmYihnLDEpLnR5cGU9PXIuY29tcF9mb3IpaD1nLFNrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpLFNrLmFzc2VydHMuYXNzZXJ0KDE8YyhoKSksZz13KGEsYihoLDApKSxhPVEoYSxiKGgsMSkpLGE9bmV3IFNrLmFzdG5vZGVzLlNldENvbXAoZyxhLGgubGluZW5vLGguY29sX29mZnNldCk7ZWxzZSBpZihjKGcpPjMtaCYmYihnLDMtaCkudHlwZT09ci5jb21wX2Zvcil7aWYoaClyZXR1cm4gZihhLGQsXCJkaWN0IHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBkaWN0IGNvbXByZWhlbnNpb25cIiksXG5udWxsO2g9ZztTay5hc3NlcnRzLmFzc2VydCgzPGMoaCkpO2UoYihoLDEpLHouVF9DT0xPTik7Zz13KGEsYihoLDApKTtuPXcoYSxiKGgsMikpO2E9UShhLGIoaCwzKSk7YT1uZXcgU2suYXN0bm9kZXMuRGljdENvbXAoZyxuLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNle2g9ZztuPVtdO0Y9W107Zm9yKHA9Zz0wO3A8YyhoKTtwKyspbT1hLHg9aCx2PXAsYih4LHYpLnR5cGU9PXouVF9ET1VCTEVTVEFSPyhTay5hc3NlcnRzLmFzc2VydCgyPD1jKHgpLXYpLHA9dyhtLGIoeCx2KzEpKSxtPXtrZXk6bnVsbCx2YWx1ZTpwLGk6disyfSk6KFNrLmFzc2VydHMuYXNzZXJ0KDM8PWMoeCktdiksKHA9dyhtLGIoeCx2KSkpPyh0PXAsZShiKHgsdisxKSx6LlRfQ09MT04pLG09KHA9dyhtLGIoeCx2KzIpKSk/e2tleTp0LHZhbHVlOnAsaTp2KzN9OiExKTptPTApLHA9bS5pLG5bZ109bS5rZXksRltnXT1tLnZhbHVlLGcrKzthPW5ldyBTay5hc3Rub2Rlcy5EaWN0KG4sRixoLmxpbmVubyxcbmguY29sX29mZnNldCxoLmVuZF9saW5lbm8saC5lbmRfY29sX29mZnNldCl9cmV0dXJuIHUoYSxkKTtkZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgYXRvbSBcIitnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIEMoYSxkKXt2YXIgZyxmPTA7ZShkLHIuYXRvbV9leHByKTt2YXIgaD1jKGQpO2IoZCwwKS50eXBlPT09ei5UX0FXQUlUJiYoZj0xLFNrLmFzc2VydHMuYXNzZXJ0KDE8aCkpO3ZhciBrPVIoYSxiKGQsZikpO2lmKCFrKXJldHVybiBudWxsO2lmKDE9PT1oKXJldHVybiBrO2lmKGYmJjI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQXdhaXQoayxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2ZvcihnPWYrMTtnPGg7ZysrKXt2YXIgbj1iKGQsZyk7aWYobi50eXBlIT09ci50cmFpbGVyKWJyZWFrO249TShhLG4sayk7aWYoIW4pcmV0dXJuIG51bGw7bi5saW5lbm89ay5saW5lbm87bi5jb2xfb2Zmc2V0PWsuY29sX29mZnNldDtrPW59cmV0dXJuIGY/bmV3IFNrLmFzdG5vZGVzLkF3YWl0KGssXG5kLmxpbmUsZC5jb2xfb2Zmc2V0KTprfWZ1bmN0aW9uIHcoYSxkKXthOmZvcig7Oyl7c3dpdGNoKGQudHlwZSl7Y2FzZSByLnRlc3Q6Y2FzZSByLnRlc3Rfbm9jb25kOmlmKGIoZCwwKS50eXBlPT09ci5sYW1iZGVmfHxiKGQsMCkudHlwZT09PXIubGFtYmRlZl9ub2NvbmQpe3ZhciBnPWIoZCwwKTszPT09YyhnKT8oZD1uZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLG51bGwsW10pLGE9dyhhLGIoZywyKSkpOihkPUwoYSxiKGcsMSkpLGE9dyhhLGIoZywzKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTGFtYmRhKGQsYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpfWlmKDE8YyhkKSlyZXR1cm4gU2suYXNzZXJ0cy5hc3NlcnQoNT09PWMoZCkpLG5ldyBTay5hc3Rub2Rlcy5JZkV4cCh3KGEsYihkLDIpKSx3KGEsYihkLDApKSx3KGEsYihkLDQpKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5vcl90ZXN0OmNhc2Ugci5hbmRfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsXG4wKTtjb250aW51ZSBhfXZhciBmPVtdO2ZvcihnPTA7ZzxjKGQpO2crPTIpZltnLzJdPXcoYSxiKGQsZykpO2lmKFwiYW5kXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuQW5kLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtTay5hc3NlcnRzLmFzc2VydChcIm9yXCI9PT1iKGQsMSkudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQm9vbE9wKFNrLmFzdG5vZGVzLk9yLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIubm90X3Rlc3Q6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuTm90LHcoYSxiKGQsMSkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmNvbXBhcmlzb246aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZXt2YXIgaD1bXTtmPVtdO2ZvcihnPTE7ZzxjKGQpO2crPTIpaFsoZy0xKS8yXT1cbnAoYSxiKGQsZykpLGZbKGctMSkvMl09dyhhLGIoZCxnKzEpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbXBhcmUodyhhLGIoZCwwKSksaCxmLGQubGluZW5vLGQuY29sX29mZnNldCl9Y2FzZSByLnN0YXJfZXhwcjpyZXR1cm4gZShkLHIuc3Rhcl9leHByKSxuZXcgU2suYXN0bm9kZXMuU3RhcnJlZCh3KGEsYihkLDEpKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmV4cHI6Y2FzZSByLnhvcl9leHByOmNhc2Ugci5hbmRfZXhwcjpjYXNlIHIuc2hpZnRfZXhwcjpjYXNlIHIuYXJpdGhfZXhwcjpjYXNlIHIudGVybTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX12YXIgaz1kLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKHcoYSxiKGssMCkpLG4oYihrLDEpKSx3KGEsYihrLDIpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG09KGMoayktMSkvMjtmb3IoZD0xO2Q8bTsrK2QpZz1iKGssMipkKzEpLGY9bihnKSxoPXcoYSxiKGssMipkK1xuMikpLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGwsZixoLGcubGluZW5vLGcuY29sX29mZnNldCk7cmV0dXJuIGw7Y2FzZSByLnlpZWxkX2V4cHI6cmV0dXJuIGY9ITEsaD1udWxsLDE8YyhkKSYmKGc9YihkLDEpKSxnJiYoaD1iKGcsYyhnKS0xKSwyPT1jKGcpPyhmPSEwLGg9dyhhLGgpKTpoPVcoYSxoKSksZj9uZXcgU2suYXN0bm9kZXMuWWllbGRGcm9tKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpuZXcgU2suYXN0bm9kZXMuWWllbGQoaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mYWN0b3I6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9cmV0dXJuIEUoYSxkKTtjYXNlIHIucG93ZXI6cmV0dXJuIGc9ZCxlKGcsci5wb3dlciksZD1DKGEsYihnLDApKSwxIT09YyhnKSYmYihnLGMoZyktMSkudHlwZT09PXIuZmFjdG9yJiYoYT13KGEsYihnLGMoZyktMSkpLGQ9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGQsU2suYXN0bm9kZXMuUG93LGEsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSksXG5kO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJcIixcIm4udHlwZTogJWRcIixkLnR5cGUpfWJyZWFrfX1mdW5jdGlvbiBOKGEsZCl7ZC50eXBlPT09ci5zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWMoZCkpLGQ9YihkLDApKTtkLnR5cGU9PT1yLnNpbXBsZV9zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWgoZCkpLGQ9YihkLDApKTtpZihkLnR5cGU9PT1yLnNtYWxsX3N0bXQpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSByLmV4cHJfc3RtdDpyZXR1cm4gZGEoYSxkKTtjYXNlIHIuZGVsX3N0bXQ6dmFyIGs9ZDtlKGssci5kZWxfc3RtdCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EZWxldGUodihhLGIoaywxKSxTay5hc3Rub2Rlcy5EZWwpLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnBhc3Nfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlBhc3MoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZmxvd19zdG10OnJldHVybiBWKGEsXG5kKTtjYXNlIHIuaW1wb3J0X3N0bXQ6dmFyIG49ZCxwO2UobixyLmltcG9ydF9zdG10KTt2YXIgbT1uLmxpbmVubztkPW4uY29sX29mZnNldDtuPWIobiwwKTtpZihuLnR5cGU9PT1yLmltcG9ydF9uYW1lKXtuPWIobiwxKTtlKG4sci5kb3R0ZWRfYXNfbmFtZXMpO3ZhciBxPVtdO2ZvcihwPTA7cDxjKG4pO3ArPTIpcVtwLzJdPUIoYSxiKG4scCkpO2E9bmV3IFNrLmFzdG5vZGVzLkltcG9ydChxLG0sZCl9ZWxzZSBpZihuLnR5cGU9PT1yLmltcG9ydF9mcm9tKXt2YXIgdT1udWxsO2s9MDtmb3IocT0xO3E8YyhuKTsrK3EpaWYoYihuLHEpLnR5cGU9PT1yLmRvdHRlZF9uYW1lKXt1PUIoYSxiKG4scSkpO3ErKzticmVha31lbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0RPVClrKys7ZWxzZSBpZihiKG4scSkudHlwZT09PXouVF9FTExJUFNJUylrKz0zO2Vsc2UgYnJlYWs7KytxO3N3aXRjaChiKG4scSkudHlwZSl7Y2FzZSB6LlRfU1RBUjpuPWIobixxKTticmVhaztjYXNlIHouVF9MUEFSOm49XG5iKG4scSsxKTtjKG4pO2JyZWFrO2Nhc2Ugci5pbXBvcnRfYXNfbmFtZXM6bj1iKG4scSk7cT1jKG4pO2lmKDA9PT1xJTIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ0cmFpbGluZyBjb21tYSBub3QgYWxsb3dlZCB3aXRob3V0IHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzXCIsYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBub2RlLXR5cGUgaW4gZnJvbS1pbXBvcnRcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO31xPVtdO2lmKG4udHlwZT09PXouVF9TVEFSKXFbMF09QihhLG4pO2Vsc2UgZm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT11P3UubmFtZS52OlwiXCI7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0RnJvbShsKGEpLHEsayxtLGQpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmtub3duIGltcG9ydCBzdGF0ZW1lbnRcIixcbmEuY19maWxlbmFtZSxuLmxpbmVubyk7cmV0dXJuIGE7Y2FzZSByLmdsb2JhbF9zdG10OmE9ZDtkPVtdO2UoYSxyLmdsb2JhbF9zdG10KTtmb3Ioaz0xO2s8YyhhKTtrKz0yKWRbKGstMSkvMl09bChiKGEsaykudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuR2xvYmFsKGQsYS5saW5lbm8sYS5jb2xfb2Zmc2V0KTtjYXNlIHIubm9ubG9jYWxfc3RtdDpmKGEsZCxcIk5vdCBpbXBsZW1lbnRlZDogbm9ubG9jYWxcIik7YnJlYWs7Y2FzZSByLmFzc2VydF9zdG10OnJldHVybiBrPWQsZShrLHIuYXNzZXJ0X3N0bXQpLDI9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLkFzc2VydCh3KGEsYihrLDEpKSxudWxsLGsubGluZW5vLGsuY29sX29mZnNldCk6ND09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLHcoYSxiKGssMykpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcImltcHJvcGVyIG51bWJlciBvZiBwYXJ0cyB0byBhc3NlcnQgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5wcmludF9zdG10Oms9ZDtTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uJiZmKGEsayxcIk1pc3NpbmcgcGFyZW50aGVzZXMgaW4gY2FsbCB0byAncHJpbnQnXCIpO249MTttPW51bGw7ZShrLHIucHJpbnRfc3RtdCk7Mjw9YyhrKSYmYihrLDEpLnR5cGU9PT16LlRfUklHSFRTSElGVCYmKG09dyhhLGIoaywyKSksbj00KTtkPVtdO2Zvcih1PTA7bjxjKGspO24rPTIsKyt1KWRbdV09dyhhLGIoayxuKSk7YT1iKGssYyhrKS0xKS50eXBlPT09ei5UX0NPTU1BPyExOiEwO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUHJpbnQobSxkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIuZGVidWdnZXJfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlYnVnZ2VyKGQubGluZW5vLGQuY29sX29mZnNldCk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgc21hbGxfc3RtdFwiKX1lbHNlIHN3aXRjaChrPWIoZCwwKSxlKGQsci5jb21wb3VuZF9zdG10KSxcbmsudHlwZSl7Y2FzZSByLmlmX3N0bXQ6ZShrLHIuaWZfc3RtdCk7aWYoND09PWMoaykpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksW10say5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKGQ9YihrLDQpLnZhbHVlLmNoYXJBdCgyKSxcInNcIj09PWQpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKFwiaVwiPT09ZCl7bT1jKGspLTQ7bj0hMTtkPVtdO2IoayxtKzEpLnR5cGU9PT16LlRfTkFNRSYmXCJzXCI9PT1iKGssbSsxKS52YWx1ZS5jaGFyQXQoMikmJihuPSEwLG0tPTMpO20vPTQ7biYmKGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLGMoayktNikpLHQoYSxiKGssYyhrKS00KSksdChhLGIoayxjKGspLTEpKSxiKGssYyhrKS02KS5saW5lbm8sYihrLGMoayktNikuY29sX29mZnNldCldLG0tLSk7Zm9yKHU9MDt1PG07Kyt1KW49NSs0KlxuKG0tdS0xKSxkPVtuZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoayxuKSksdChhLGIoayxuKzIpKSxkLGIoayxuKS5saW5lbm8sYihrLG4pLmNvbF9vZmZzZXQpXTthPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCl9ZWxzZSBTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHRva2VuIGluICdpZicgc3RhdGVtZW50XCIpLGE9dm9pZCAwO3JldHVybiBhO2Nhc2Ugci53aGlsZV9zdG10OnJldHVybiBlKGssci53aGlsZV9zdG10KSw0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5XaGlsZSh3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOjc9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLHQoYSxiKGssNikpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiB0b2tlbnMgZm9yICd3aGlsZScgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5mb3Jfc3RtdDpyZXR1cm4gZD1bXSxlKGssci5mb3Jfc3RtdCksOT09PWMoaykmJihkPXQoYSxiKGssOCkpKSxuPWIoaywxKSxtPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKSxtPTE9PT1jKG4pP21bMF06bmV3IFNrLmFzdG5vZGVzLlR1cGxlKG0sU2suYXN0bm9kZXMuU3RvcmUsay5saW5lbm8say5jb2xfb2Zmc2V0KSxuZXcgU2suYXN0bm9kZXMuRm9yKG0sVyhhLGIoaywzKSksdChhLGIoayw1KSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci50cnlfc3RtdDpkPVtdO3A9YyhrKTttPShwLTMpLzM7dT1bXTtxPW51bGw7ZShrLHIudHJ5X3N0bXQpO249dChhLGIoaywyKSk7aWYoYihrLHAtMykudHlwZT09PXouVF9OQU1FKVwiZmluYWxseVwiPT09YihrLHAtMykudmFsdWU/KDk8PXAmJmIoayxwLTYpLnR5cGU9PT16LlRfTkFNRSYmKHU9dChhLGIoayxwLTQpKSxtLS0pLHE9dChhLGIoayxwLTEpKSk6dT10KGEsYihrLHAtMSkpLG0tLTtlbHNlIGlmKGIoayxcbnAtMykudHlwZSE9PXIuZXhjZXB0X2NsYXVzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm1hbGZvcm1lZCAndHJ5JyBzdGF0ZW1lbnRcIixhLmNfZmlsZW5hbWUsay5saW5lbm8pO2lmKDA8bSlmb3IocD0wO3A8bTtwKyspe3ZhciBBPXA7dmFyIHg9YSx5PWIoaywzKzMqcCksRD1iKGssNSszKnApO2UoeSxyLmV4Y2VwdF9jbGF1c2UpO2UoRCxyLnN1aXRlKTtpZigxPT09Yyh5KSl2YXIgRT1uZXcgU2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcihudWxsLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk7ZWxzZSAyPT09Yyh5KT9FPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk6ND09PWMoeSk/KFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXCIsXCI9PWIoeSwyKS52YWx1ZSYmZih4LHksXCJPbGQtc3R5bGUgJ2V4Y2VwdCcgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gM1wiKSxcbncoeCxiKHksMSkpLEU9dyh4LGIoeSwzKSksZyh4LEUsU2suYXN0bm9kZXMuU3RvcmUsYih5LDMpKSxFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLEUsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCkpOihTay5hc3NlcnRzLmZhaWwoXCJ3cm9uZyBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGV4Y2VwdCBjbGF1c2VcIiksRT12b2lkIDApO2RbQV09RX1Tay5hc3NlcnRzLmFzc2VydCghIXF8fDAhPWQubGVuZ3RoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlRyeShuLGQsdSxxLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLndpdGhfc3RtdDpkPVtdO2UoayxyLndpdGhfc3RtdCk7Zm9yKG09MTttPGMoayktMjttKz0yKW49dm9pZCAwLHE9YSxwPWIoayxtKSxlKHAsci53aXRoX2l0ZW0pLHU9dyhxLGIocCwwKSksMz09YyhwKSYmKG49dyhxLGIocCwyKSksZyhxLG4sU2suYXN0bm9kZXMuU3RvcmUscCkpLG49bmV3IFNrLmFzdG5vZGVzLndpdGhpdGVtKHUsXG5uKSxkWyhtLTEpLzJdPW47YT10KGEsYihrLGMoayktMSkpO2E9bmV3IFNrLmFzdG5vZGVzLldpdGgoZCxhLGsubGluZW5vLGsuY29sX29mZnNldCk7cmV0dXJuIGE7Y2FzZSByLmZ1bmNkZWY6cmV0dXJuIFQoYSxrLFtdLCExKTtjYXNlIHIuY2xhc3NkZWY6cmV0dXJuIFAoYSxrLFtdKTtjYXNlIHIuZGVjb3JhdGVkOm09bnVsbDtlKGssci5kZWNvcmF0ZWQpO249YihrLDApO2UobixyLmRlY29yYXRvcnMpO2Q9W107Zm9yKHU9MDt1PGMobik7Kyt1KXtxPWQ7cD11O0E9YTtFPWIobix1KTtlKEUsci5kZWNvcmF0b3IpO2UoYihFLDApLHouVF9BVCk7ZShiKEUsYyhFKS0xKSx6LlRfTkVXTElORSk7dmFyIEMsRz1iKEUsMSk7ZShHLHIuZG90dGVkX25hbWUpO3g9Ry5saW5lbm87eT1HLmNvbF9vZmZzZXQ7RD1sKGIoRywwKS52YWx1ZSk7dmFyIE09bmV3IFNrLmFzdG5vZGVzLk5hbWUoRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7Zm9yKEM9MjtDPGMoRyk7Qys9MilEPWwoYihHLEMpLnZhbHVlKSxcbk09bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShNLEQsU2suYXN0bm9kZXMuTG9hZCx4LHkpO3g9TTtBPTM9PT1jKEUpP3g6NT09PWMoRSk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoeCxbXSxbXSxudWxsLG51bGwsRS5saW5lbm8sRS5jb2xfb2Zmc2V0KTpGKEEsYihFLDMpLHgpO3FbcF09QX1Tay5hc3NlcnRzLmFzc2VydChiKGssMSkudHlwZT09ci5mdW5jZGVmfHxiKGssMSkudHlwZT09ci5hc3luY19mdW5jZGVmfHxiKGssMSkudHlwZT09ci5jbGFzc2RlZik7YihrLDEpLnR5cGU9PXIuZnVuY2RlZj8obT1iKGssMSksbT1UKGEsbSxkLCExKSk6YihrLDEpLnR5cGU9PXIuY2xhc3NkZWY/bT1QKGEsYihrLDEpLGQpOmIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWYmJihtPWIoaywxKSxlKG0sci5hc3luY19mdW5jZGVmKSxlKGIobSwwKSx6LlRfTkFNRSksU2suYXNzZXJ0cy5hc3NlcnQoKFwiYXN5bmNcIj09PWIobSwwKSkudmFsdWUpLGUoYihtLDEpLHIuZnVuY2RlZiksbT1UKGEsbSxkLFxuITApKTttJiYobS5saW5lbm89ay5saW5lbm8sbS5jb2xfb2Zmc2V0PWsuY29sX29mZnNldCk7cmV0dXJuIG07Y2FzZSByLmFzeW5jX3N0bXQ6ZihhLGssXCJOb3QgaW1wbGVtZW50ZWQ6IGFzeW5jXCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5hc3NlcnQoXCJ1bmhhbmRsZWQgY29tcG91bmRfc3RtdFwiKX19dmFyIHI9U2suUGFyc2VUYWJsZXMuc3ltLHo9U2sudG9rZW4udG9rZW5zLFo9e1NsaWNlX2tpbmQ6MSxFeHRTbGljZV9raW5kOjIsSW5kZXhfa2luZDozfSxPPXt9O09bei5UX1ZCQVJdPVNrLmFzdG5vZGVzLkJpdE9yO09bei5UX0NJUkNVTUZMRVhdPVNrLmFzdG5vZGVzLkJpdFhvcjtPW3ouVF9BTVBFUl09U2suYXN0bm9kZXMuQml0QW5kO09bei5UX0xFRlRTSElGVF09U2suYXN0bm9kZXMuTFNoaWZ0O09bei5UX1JJR0hUU0hJRlRdPVNrLmFzdG5vZGVzLlJTaGlmdDtPW3ouVF9QTFVTXT1Tay5hc3Rub2Rlcy5BZGQ7T1t6LlRfTUlOVVNdPVNrLmFzdG5vZGVzLlN1YjtPW3ouVF9TVEFSXT1cblNrLmFzdG5vZGVzLk11bHQ7T1t6LlRfU0xBU0hdPVNrLmFzdG5vZGVzLkRpdjtPW3ouVF9ET1VCTEVTTEFTSF09U2suYXN0bm9kZXMuRmxvb3JEaXY7T1t6LlRfUEVSQ0VOVF09U2suYXN0bm9kZXMuTW9kO1NrLnNldHVwT3BlcmF0b3JzPWZ1bmN0aW9uKGEpe2E/T1t6LlRfQVRdPVNrLmFzdG5vZGVzLk1hdE11bHQ6T1t6LlRfQVRdJiZkZWxldGUgT1t6LlRfQVRdfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9wZXJhdG9yc1wiLFNrLnNldHVwT3BlcmF0b3JzKTtjb25zdCBmYT0vX1tlRV18W2VFXV98XFwuX3xqXy8saGE9L19cXC58WystXV98XjBfXFxEfF9qLyxpYT0vXyg/PVteX10pL2c7U2suYXN0RnJvbVBhcnNlPWZ1bmN0aW9uKGQsZyxmKXt2YXIgayxuPW5ldyBhKFwidXRmLThcIixnLGYpLHA9W10sbD0wO3N3aXRjaChkLnR5cGUpe2Nhc2Ugci5maWxlX2lucHV0OmZvcihrPTA7azxjKGQpLTE7KytrKXt2YXIgbT1iKGQsayk7aWYoZC50eXBlIT09ei5UX05FV0xJTkUpaWYoZShtLHIuc3RtdCksXG5mPWgobSksMT09PWYpcFtsKytdPU4obixtKTtlbHNlIGZvcihtPWIobSwwKSxlKG0sci5zaW1wbGVfc3RtdCksZz0wO2c8ZjsrK2cpcFtsKytdPU4obixiKG0sMipnKSl9cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Nb2R1bGUocCk7Y2FzZSByLmV2YWxfaW5wdXQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7Y2FzZSByLnNpbmdsZV9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpfX07U2suYXN0RHVtcD1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGE7KytiKWMrPVwiIFwiO3JldHVybiBjfSxjPWZ1bmN0aW9uKGEsZCl7dmFyIGU7aWYobnVsbD09PWEpcmV0dXJuIGQrXCJOb25lXCI7aWYoYS5wcm90b3R5cGUmJnZvaWQgMCE9PWEucHJvdG90eXBlLl9hc3RuYW1lJiZhLnByb3RvdHlwZS5faXNlbnVtKXJldHVybiBkK2EucHJvdG90eXBlLl9hc3RuYW1lK1wiKClcIjtpZih2b2lkIDAhPT1cbmEuX2FzdG5hbWUpe3ZhciBnPWIoYS5fYXN0bmFtZS5sZW5ndGgrMSk7dmFyIGY9W107Zm9yKGU9MDtlPGEuX2ZpZWxkcy5sZW5ndGg7ZSs9Mil7dmFyIGg9YS5fZmllbGRzW2VdO3ZhciBrPWEuX2ZpZWxkc1tlKzFdKGEpO3ZhciBuPWIoaC5sZW5ndGgrMSk7Zi5wdXNoKFtoLGMoayxkK2crbildKX1rPVtdO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upbj1mW2VdLGsucHVzaChuWzBdK1wiPVwiK25bMV0ucmVwbGFjZSgvXlxccysvLFwiXCIpKTtlPWsuam9pbihcIixcXG5cIitkK2cpO3JldHVybiBkK2EuX2FzdG5hbWUrXCIoXCIrZStcIilcIn1pZihTay5pc0FycmF5TGlrZShhKSl7Zz1bXTtmb3IoZT0wO2U8YS5sZW5ndGg7KytlKWY9YVtlXSxnLnB1c2goYyhmLGQrXCIgXCIpKTthPWcuam9pbihcIixcXG5cIik7cmV0dXJuIGQrXCJbXCIrYS5yZXBsYWNlKC9eXFxzKy8sXCJcIikrXCJdXCJ9YT0hMD09PWE/XCJUcnVlXCI6ITE9PT1hP1wiRmFsc2VcIjphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmc/YS50cCRzdHIoKS52OmEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHI/YS4kcigpLnY6XCJcIithO3JldHVybiBkK2F9O3JldHVybiBjKGEsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdEZyb21QYXJzZVwiLFNrLmFzdEZyb21QYXJzZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RHVtcFwiLFNrLmFzdER1bXApfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuX19uYW1lPWE7dGhpcy5fX2ZsYWdzPWI7dGhpcy5fX3Njb3BlPWI+PjExJjc7dGhpcy5fX25hbWVzcGFjZXM9Y3x8W119ZnVuY3Rpb24gYyhhLGIsYyxlLGYpe3RoaXMuc3ltRmxhZ3M9e307dGhpcy5uYW1lPWI7dGhpcy52YXJuYW1lcz1bXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuYmxvY2tUeXBlPWM7dGhpcy5yZXR1cm5zVmFsdWU9dGhpcy52YXJrZXl3b3Jkcz10aGlzLnZhcmFyZ3M9dGhpcy5nZW5lcmF0b3I9dGhpcy5jaGlsZEhhc0ZyZWU9dGhpcy5oYXNGcmVlPXRoaXMuaXNOZXN0ZWQ9ITE7dGhpcy5saW5lbm89Zjt0aGlzLnRhYmxlPWE7YS5jdXImJlxuKGEuY3VyLm5lc3RlZHx8XCJmdW5jdGlvblwiPT09YS5jdXIuYmxvY2tUeXBlKSYmKHRoaXMuaXNOZXN0ZWQ9ITApO2Uuc2NvcGVJZD1sKys7YS5zdHNzW2Uuc2NvcGVJZF09dGhpczt0aGlzLnN5bWJvbHM9e319ZnVuY3Rpb24gYihhKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy50b3A9dGhpcy5jdXI9bnVsbDt0aGlzLnN0YWNrPVtdO3RoaXMuY3VyQ2xhc3M9dGhpcy5nbG9iYWw9bnVsbDt0aGlzLnRtcG5hbWU9MDt0aGlzLnN0c3M9e319ZnVuY3Rpb24gZShhLGIpe3ZhciBjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYShiW2NdKX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfVNrLmV4cG9ydFN5bWJvbChcIlNrLlNZTVRBQl9DT05TVFNcIix7REVGX0dMT0JBTDoxLERFRl9MT0NBTDoyLERFRl9QQVJBTTo0LFVTRTo4LERFRl9TVEFSOjE2LERFRl9ET1VCTEVTVEFSOjMyLERFRl9JTlRVUExFOjY0LERFRl9GUkVFOjEyOCxERUZfRlJFRV9HTE9CQUw6MjU2LERFRl9GUkVFX0NMQVNTOjUxMixcbkRFRl9JTVBPUlQ6MTAyNCxERUZfQk9VTkQ6MTAzMCxTQ09QRV9PRkY6MTEsU0NPUEVfTUFTSzo3LExPQ0FMOjEsR0xPQkFMX0VYUExJQ0lUOjIsR0xPQkFMX0lNUExJQ0lUOjMsRlJFRTo0LENFTEw6NSxPUFRfSU1QT1JUX1NUQVI6MSxPUFRfRVhFQzoyLE9QVF9CQVJFX0VYRUM6NCxPUFRfVE9QTEVWRUw6OCxHRU5FUkFUT1I6MixHRU5FUkFUT1JfRVhQUkVTU0lPTjoyLE1vZHVsZUJsb2NrOlwibW9kdWxlXCIsRnVuY3Rpb25CbG9jazpcImZ1bmN0aW9uXCIsQ2xhc3NCbG9jazpcImNsYXNzXCJ9KTthLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZX07YS5wcm90b3R5cGUuaXNfcmVmZXJlbmNlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyY4KX07YS5wcm90b3R5cGUuaXNfcGFyYW1ldGVyPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjQpfTthLnByb3RvdHlwZS5pc19nbG9iYWw9ZnVuY3Rpb24oKXtyZXR1cm4gMz09PXRoaXMuX19zY29wZXx8XG4yPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2RlY2xhcmVkX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAyPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjEwMzApfTthLnByb3RvdHlwZS5pc19mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfaW1wb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAyNCl9O2EucHJvdG90eXBlLmlzX2Fzc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjIpfTthLnByb3RvdHlwZS5pc19uYW1lc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVzcGFjZXMmJjA8dGhpcy5fX25hbWVzcGFjZXMubGVuZ3RofTthLnByb3RvdHlwZS5nZXRfbmFtZXNwYWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlc307dmFyIGw9MDtjLnByb3RvdHlwZS5nZXRfdHlwZT1cbmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmxvY2tUeXBlfTtjLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9O2MucHJvdG90eXBlLmdldF9saW5lbm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lbm99O2MucHJvdG90eXBlLmlzX25lc3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmVzdGVkfTtjLnByb3RvdHlwZS5oYXNfY2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmNoaWxkcmVuLmxlbmd0aH07Yy5wcm90b3R5cGUuZ2V0X2lkZW50aWZpZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKCl7cmV0dXJuITB9KX07Yy5wcm90b3R5cGUubG9va3VwPWZ1bmN0aW9uKGIpe2lmKHRoaXMuc3ltYm9scy5oYXNPd25Qcm9wZXJ0eShiKSliPXRoaXMuc3ltYm9sc1tiXTtlbHNle3ZhciBjPXRoaXMuc3ltRmxhZ3NbYl07dmFyIGU9dGhpcy5fX2NoZWNrX2NoaWxkcmVuKGIpO2I9dGhpcy5zeW1ib2xzW2JdPVxubmV3IGEoYixjLGUpfXJldHVybiBifTtjLnByb3RvdHlwZS5fX2NoZWNrX2NoaWxkcmVuPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGI9MDtiPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5jaGlsZHJlbltiXTtlLm5hbWU9PT1hJiZjLnB1c2goZSl9cmV0dXJuIGN9O2MucHJvdG90eXBlLl9pZGVudHNNYXRjaGluZz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiIGluIHRoaXMuc3ltRmxhZ3MpdGhpcy5zeW1GbGFncy5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLnN5bUZsYWdzW2JdKSYmYy5wdXNoKGIpO2Muc29ydCgpO3JldHVybiBjfTtjLnByb3RvdHlwZS5nZXRfcGFyYW1ldGVycz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X3BhcmFtZXRlcnMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNQYXJhbXN8fCh0aGlzLl9mdW5jUGFyYW1zPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiBhJlxuNH0pKTtyZXR1cm4gdGhpcy5fZnVuY1BhcmFtc307Yy5wcm90b3R5cGUuZ2V0X2xvY2Fscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2xvY2FscyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0xvY2Fsc3x8KHRoaXMuX2Z1bmNMb2NhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmMTAzMH0pKTtyZXR1cm4gdGhpcy5fZnVuY0xvY2Fsc307Yy5wcm90b3R5cGUuZ2V0X2dsb2JhbHM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9nbG9iYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jR2xvYmFsc3x8KHRoaXMuX2Z1bmNHbG9iYWxzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe2E9YT4+MTEmNztyZXR1cm4gMz09YXx8Mj09YX0pKTtyZXR1cm4gdGhpcy5fZnVuY0dsb2JhbHN9O1xuYy5wcm90b3R5cGUuZ2V0X2ZyZWVzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfZnJlZXMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNGcmVlc3x8KHRoaXMuX2Z1bmNGcmVlcz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gND09KGE+PjExJjcpfSkpO3JldHVybiB0aGlzLl9mdW5jRnJlZXN9O2MucHJvdG90eXBlLmdldF9tZXRob2RzPWZ1bmN0aW9uKCl7dmFyIGE7U2suYXNzZXJ0cy5hc3NlcnQoXCJjbGFzc1wiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbWV0aG9kcyBvbmx5IHZhbGlkIGZvciBjbGFzcyBzY29wZXNcIik7aWYoIXRoaXMuX2NsYXNzTWV0aG9kcyl7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYSliLnB1c2godGhpcy5jaGlsZHJlblthXS5uYW1lKTtiLnNvcnQoKTt0aGlzLl9jbGFzc01ldGhvZHM9Yn1yZXR1cm4gdGhpcy5fY2xhc3NNZXRob2RzfTtcbmMucHJvdG90eXBlLmdldFNjb3BlPWZ1bmN0aW9uKGEpe2E9dGhpcy5zeW1GbGFnc1thXTtyZXR1cm4gdm9pZCAwPT09YT8wOmE+PjExJjd9O2IucHJvdG90eXBlLmdldFN0c0ZvckFzdD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLnNjb3BlSWQsXCJhc3Qgd2Fzbid0IGFkZGVkIHRvIHN0P1wiKTthPXRoaXMuc3Rzc1thLnNjb3BlSWRdO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ1bmtub3duIHN5bSB0YWIgZW50cnlcIik7cmV0dXJuIGF9O2IucHJvdG90eXBlLlNFUVN0bXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRTdG10KGIpfX07Yi5wcm90b3R5cGUuU0VRRXhwcj1mdW5jdGlvbihhKXt2YXIgYixcbmM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0RXhwcihiKX19O2IucHJvdG90eXBlLmVudGVyQmxvY2s9ZnVuY3Rpb24oYSxiLGUsZil7YT1Tay5maXhSZXNlcnZlZChhKTt2YXIgZD1udWxsO3RoaXMuY3VyJiYoZD10aGlzLmN1cix0aGlzLnN0YWNrLnB1c2godGhpcy5jdXIpKTt0aGlzLmN1cj1uZXcgYyh0aGlzLGEsYixlLGYpO1widG9wXCI9PT1hJiYodGhpcy5nbG9iYWw9dGhpcy5jdXIuc3ltRmxhZ3MpO2QmJmQuY2hpbGRyZW4ucHVzaCh0aGlzLmN1cil9O2IucHJvdG90eXBlLmV4aXRCbG9jaz1mdW5jdGlvbigpe3RoaXMuY3VyPW51bGw7MDx0aGlzLnN0YWNrLmxlbmd0aCYmKHRoaXMuY3VyPXRoaXMuc3RhY2sucG9wKCkpfTtiLnByb3RvdHlwZS52aXNpdFBhcmFtcz1cbmZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylpZihiPWFbY10sYi5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLmFyZyl0aGlzLmFkZERlZihiLmFyZyw0LGIubGluZW5vKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0XCIsdGhpcy5maWxlbmFtZSk7fTtiLnByb3RvdHlwZS52aXNpdEFyZ3VtZW50cz1mdW5jdGlvbihhLGIpe2EuYXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmFyZ3MsITApO2Eua3dvbmx5YXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmt3b25seWFyZ3MsITApO2EudmFyYXJnJiYodGhpcy5hZGREZWYoYS52YXJhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFyYXJncz0hMCk7YS5rd2FyZyYmKHRoaXMuYWRkRGVmKGEua3dhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFya2V5d29yZHM9ITApfTtiLnByb3RvdHlwZS5uZXdUbXBuYW1lPWZ1bmN0aW9uKGEpe3RoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcIl9bXCIrXG4rK3RoaXMudG1wbmFtZStcIl1cIiksMixhKX07Yi5wcm90b3R5cGUuYWRkRGVmPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYSkudjtkPVNrLmZpeFJlc2VydmVkKGQpO3ZhciBlPXRoaXMuY3VyLnN5bUZsYWdzW2RdO2lmKHZvaWQgMCE9PWUpe2lmKGImNCYmZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZHVwbGljYXRlIGFyZ3VtZW50ICdcIithLnYrXCInIGluIGZ1bmN0aW9uIGRlZmluaXRpb25cIix0aGlzLmZpbGVuYW1lLGMpO2V8PWJ9ZWxzZSBlPWI7dGhpcy5jdXIuc3ltRmxhZ3NbZF09ZTtiJjQ/dGhpcy5jdXIudmFybmFtZXMucHVzaChkKTpiJjEmJihlPWIsYT10aGlzLmdsb2JhbFtkXSx2b2lkIDAhPT1hJiYoZXw9YSksdGhpcy5nbG9iYWxbZF09ZSl9O2IucHJvdG90eXBlLnZpc2l0U2xpY2U9ZnVuY3Rpb24oYSl7dmFyIGI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6YS5sb3dlciYmXG50aGlzLnZpc2l0RXhwcihhLmxvd2VyKTthLnVwcGVyJiZ0aGlzLnZpc2l0RXhwcihhLnVwcGVyKTthLnN0ZXAmJnRoaXMudmlzaXRFeHByKGEuc3RlcCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHRTbGljZTpmb3IoYj0wO2I8YS5kaW1zLmxlbmd0aDsrK2IpdGhpcy52aXNpdFNsaWNlKGEuZGltc1tiXSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKX19O2IucHJvdG90eXBlLnZpc2l0U3RtdD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidmlzaXRTdG10IGNhbGxlZCB3aXRoIHVuZGVmaW5lZFwiKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7XG50aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMudmlzaXRBcmd1bWVudHMoYS5hcmdzLGEubGluZW5vKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2xhc3NEZWY6dGhpcy5hZGREZWYoYS5uYW1lLDIsYS5saW5lbm8pO3RoaXMuU0VRRXhwcihhLmJhc2VzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7dGhpcy5lbnRlckJsb2NrKGEubmFtZS52LFwiY2xhc3NcIixhLGEubGluZW5vKTt0aGlzLmN1ckNsYXNzPWEubmFtZTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKGEudmFsdWUmJih0aGlzLnZpc2l0RXhwcihhLnZhbHVlKSx0aGlzLmN1ci5yZXR1cm5zVmFsdWU9ITAsdGhpcy5jdXIuZ2VuZXJhdG9yKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246aWYoYS50YXJnZXQuY29uc3RydWN0b3I9PVNrLmFzdG5vZGVzLk5hbWUpe3ZhciBjPWEudGFyZ2V0O3ZhciBmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxjLmlkKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjIwNDkmJnRoaXMuZ2xvYmFsIT10aGlzLmN1ci5zeW1GbGFncyYmYS5zaW1wbGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhbm5vdGF0ZWQgbmFtZSAnXCIrZitcIicgY2FuJ3QgYmUgZ2xvYmFsXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YS5zaW1wbGU/dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuNDA5OCxhLmxpbmVubyk6YS52YWx1ZSYmdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDIsYS5saW5lbm8pfWVsc2UgdGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuYW5ub3RhdGlvbik7YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdWdBc3NpZ246dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6YS5kZXN0JiZ0aGlzLnZpc2l0RXhwcihhLmRlc3QpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuaXRlcik7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5XaGlsZTp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO1xudGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JZjp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO3RoaXMuU0VRU3RtdChhLmJvZHkpO2Eub3JlbHNlJiZ0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6YS5leGMmJih0aGlzLnZpc2l0RXhwcihhLmV4YyksYS5pbnN0JiYodGhpcy52aXNpdEV4cHIoYS5pbnN0KSxhLnRiYWNrJiZ0aGlzLnZpc2l0RXhwcihhLnRiYWNrKSksYS5jYXVzZSYmdGhpcy52aXNpdEV4cHIoYS5jYXVzZSkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzZXJ0OnRoaXMudmlzaXRFeHByKGEudGVzdCk7YS5tc2cmJnRoaXMudmlzaXRFeHByKGEubXNnKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpjYXNlIFNrLmFzdG5vZGVzLkltcG9ydEZyb206dGhpcy52aXNpdEFsaWFzKGEubmFtZXMsYS5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOnZhciBrPVxuYS5uYW1lcy5sZW5ndGg7Zm9yKGI9MDtiPGs7KytiKXtmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhLm5hbWVzW2JdKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjEwKXtpZihjJjIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyB1c2VkIHByaW9yIHRvIGdsb2JhbCBkZWNsYXJhdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO310aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMSxhLmxpbmVubyl9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHByOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOmNhc2UgU2suYXN0bm9kZXMuQ29udGludWU6Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpicmVhaztcbmNhc2UgU2suYXN0bm9kZXMuV2l0aDplKHRoaXMudmlzaXRfd2l0aGl0ZW0uYmluZCh0aGlzKSxhLml0ZW1zKTtlKHRoaXMudmlzaXRTdG10LmJpbmQodGhpcyksYS5ib2R5KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlRyeTp0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLnZpc2l0RXhjZXB0aGFuZGxlcnMoYS5oYW5kbGVycyk7dGhpcy5TRVFTdG10KGEub3JlbHNlKTt0aGlzLlNFUVN0bXQoYS5maW5hbGJvZHkpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1wiIGluIHZpc2l0U3RtdFwiKX19O2IucHJvdG90eXBlLnZpc2l0X3dpdGhpdGVtPWZ1bmN0aW9uKGEpe3RoaXMudmlzaXRFeHByKGEuY29udGV4dF9leHByKTthLm9wdGlvbmFsX3ZhcnMmJnRoaXMudmlzaXRFeHByKGEub3B0aW9uYWxfdmFycyl9O2IucHJvdG90eXBlLnZpc2l0RXhwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1cbmEsXCJ2aXNpdEV4cHIgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDp0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6dGhpcy52aXNpdEV4cHIoYS5sZWZ0KTt0aGlzLnZpc2l0RXhwcihhLnJpZ2h0KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6dGhpcy52aXNpdEV4cHIoYS5vcGVyYW5kKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTp0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCJsYW1iZGFcIiksMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTt0aGlzLmVudGVyQmxvY2soXCJsYW1iZGFcIixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy5leGl0QmxvY2soKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLnZpc2l0RXhwcihhLmJvZHkpO3RoaXMudmlzaXRFeHByKGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6dGhpcy5TRVFFeHByKGEua2V5cyk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmNhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDp0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0Q29tcDp0aGlzLm5ld1RtcG5hbWUoYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6dGhpcy52aXNpdEdlbmV4cChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLllpZWxkOmEudmFsdWUmJnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDtpZih0aGlzLmN1ci5yZXR1cm5zVmFsdWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCIncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3JcIixcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMuU0VRRXhwcihhLmNvbXBhcmF0b3JzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6dGhpcy52aXNpdEV4cHIoYS5mdW5jKTtpZihhLmFyZ3MpZm9yKGxldCBiIG9mIGEuYXJncyliLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZD90aGlzLnZpc2l0RXhwcihiLnZhbHVlKTp0aGlzLnZpc2l0RXhwcihiKTtpZihhLmtleXdvcmRzKWZvcihsZXQgYiBvZiBhLmtleXdvcmRzKXRoaXMudmlzaXRFeHByKGIudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmNhc2UgU2suYXN0bm9kZXMuQnl0ZXM6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6Zm9yKGxldCBiIG9mIGEudmFsdWVzKXRoaXMudmlzaXRFeHByKGIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7XG5hLmZvcm1hdF9zcGVjJiZ0aGlzLnZpc2l0RXhwcihhLmZvcm1hdF9zcGVjKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTt0aGlzLnZpc2l0U2xpY2UoYS5zbGljZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnRoaXMuYWRkRGVmKGEuaWQsYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkPzg6MixhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OmNhc2UgU2suYXN0bm9kZXMuVHVwbGU6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6dGhpcy5TRVFFeHByKGEuZWx0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1xuXCIgaW4gdmlzaXRFeHByXCIpfX07Yi5wcm90b3R5cGUudmlzaXRDb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmxlbmd0aDtmb3IoYz1iO2M8ZDsrK2MpYj1hW2NdLHRoaXMudmlzaXRFeHByKGIudGFyZ2V0KSx0aGlzLnZpc2l0RXhwcihiLml0ZXIpLHRoaXMuU0VRRXhwcihiLmlmcyl9O2IucHJvdG90eXBlLnZpc2l0QWxpYXM9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2ZvcihkPTA7ZDxhLmxlbmd0aDsrK2Qpe3ZhciBlPWFbZF07dmFyIGY9Yz1udWxsPT09ZS5hc25hbWU/ZS5uYW1lLnY6ZS5hc25hbWUudjtlPWMuaW5kZXhPZihcIi5cIik7LTEhPT1lJiYoZj1jLnN1YnN0cigwLGUpKTtpZihcIipcIiE9PWMpdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDEwMjQsYik7ZWxzZSBpZihcIm1vZHVsZVwiIT09dGhpcy5jdXIuYmxvY2tUeXBlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW1wb3J0ICogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbFwiLFxudGhpcy5maWxlbmFtZSk7fX07Yi5wcm90b3R5cGUudmlzaXRHZW5leHA9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZW5lcmF0b3JzWzBdO3RoaXMudmlzaXRFeHByKGIuaXRlcik7dGhpcy5lbnRlckJsb2NrKFwiZ2VuZXhwclwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiLjBcIiksNCxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYi50YXJnZXQpO3RoaXMuU0VRRXhwcihiLmlmcyk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDEpO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLmV4aXRCbG9jaygpfTtiLnByb3RvdHlwZS52aXNpdEV4Y2VwdGhhbmRsZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtjPWFbYl07KytiKWMudHlwZSYmdGhpcy52aXNpdEV4cHIoYy50eXBlKSxjLm5hbWUmJnRoaXMudmlzaXRFeHByKGMubmFtZSksdGhpcy5TRVFTdG10KGMuYm9keSl9O2IucHJvdG90eXBlLmFuYWx5emVCbG9jaz1cbmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXt9O3ZhciBnPXt9LGg9e30sbj17fSxsPXt9O1wiY2xhc3NcIj09YS5ibG9ja1R5cGUmJihmKGgsZSksYiYmZihuLGIpKTtmb3IocSBpbiBhLnN5bUZsYWdzKXt2YXIgbT1hLnN5bUZsYWdzW3FdO3RoaXMuYW5hbHl6ZU5hbWUoYSxnLHEsbSxiLGQsYyxlKX1cImNsYXNzXCIhPT1hLmJsb2NrVHlwZSYmKFwiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZmKG4sZCksYiYmZihuLGIpLGYoaCxlKSk7ZD17fTt2YXIgcT1hLmNoaWxkcmVuLmxlbmd0aDtmb3IobT0wO208cTsrK20paWYoZT1hLmNoaWxkcmVuW21dLHRoaXMuYW5hbHl6ZUNoaWxkQmxvY2soZSxuLGwsaCxkKSxlLmhhc0ZyZWV8fGUuY2hpbGRIYXNGcmVlKWEuY2hpbGRIYXNGcmVlPSEwO2YobCxkKTtcImZ1bmN0aW9uXCI9PT1hLmJsb2NrVHlwZSYmdGhpcy5hbmFseXplQ2VsbHMoZyxsKTtiPXRoaXMudXBkYXRlU3ltYm9scyhhLnN5bUZsYWdzLGcsYixsLFwiY2xhc3NcIj09PWEuYmxvY2tUeXBlKTtcbmEuaGFzRnJlZT1hLmhhc0ZyZWV8fGI7ZihjLGwpfTtiLnByb3RvdHlwZS5hbmFseXplQ2hpbGRCbG9jaz1mdW5jdGlvbihhLGIsYyxlLGspe3ZhciBkPXt9O2YoZCxiKTtiPXt9O2YoYixjKTtjPXt9O2YoYyxlKTt0aGlzLmFuYWx5emVCbG9jayhhLGQsYixjKTtmKGssYil9O2IucHJvdG90eXBlLmFuYWx5emVDZWxscz1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjIGluIGEpe3ZhciBkPWFbY107MT09PWQmJnZvaWQgMCE9PWJbY10mJihhW2NdPTUsZGVsZXRlIGJbY10pfX07Yi5wcm90b3R5cGUudXBkYXRlU3ltYm9scz1mdW5jdGlvbihhLGIsYyxlLGYpe3ZhciBkLGc9ITE7Zm9yKGQgaW4gYSl7dmFyIGs9YVtkXTt2YXIgaD1iW2RdO2t8PWg8PDExO2FbZF09a31mb3IoZCBpbiBlKWI9YVtkXSx2b2lkIDAhPT1iP2YmJmImMTAzMSYmKGJ8PTUxMixhW2RdPWIpOnZvaWQgMCE9PWNbZF0mJihhW2RdPTgxOTIsZz0hMCk7cmV0dXJuIGd9O2IucHJvdG90eXBlLmFuYWx5emVOYW1lPWZ1bmN0aW9uKGEsXG5iLGMsZSxmLHAsbCxtKXtpZihlJjEpe2lmKGUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2MrXCInIGlzIGxvY2FsIGFuZCBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtiW2NdPTI7bVtjXT1udWxsO2YmJnZvaWQgMCE9PWZbY10mJmRlbGV0ZSBmW2NdfWVsc2UgZSYxMDMwPyhiW2NdPTEscFtjXT1udWxsLGRlbGV0ZSBtW2NdKTpmJiZ2b2lkIDAhPT1mW2NdPyhiW2NdPTQsYS5oYXNGcmVlPSEwLGxbY109bnVsbCk6KG0mJnZvaWQgMCE9PW1bY118fCFhLmlzTmVzdGVkfHwoYS5oYXNGcmVlPSEwKSxiW2NdPTMpfTtiLnByb3RvdHlwZS5hbmFseXplPWZ1bmN0aW9uKCl7dGhpcy5hbmFseXplQmxvY2sodGhpcy50b3AsbnVsbCx7fSx7fSl9O1NrLnN5bWJvbHRhYmxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IGIoYyk7ZC5lbnRlckJsb2NrKFwidG9wXCIsXCJtb2R1bGVcIixhLDApO2QudG9wPWQuY3VyO2ZvcihjPTA7YzxhLmJvZHkubGVuZ3RoOysrYylkLnZpc2l0U3RtdChhLmJvZHlbY10pO1xuZC5leGl0QmxvY2soKTtkLmFuYWx5emUoKTtyZXR1cm4gZH07U2suZHVtcFN5bXRhYj1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm4gYT9cIlRydWVcIjpcIkZhbHNlXCJ9LGM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWMucHVzaCgobmV3IFNrLmJ1aWx0aW4uc3RyKGFbYl0pKS4kcigpLnYpO3JldHVyblwiW1wiK2Muam9pbihcIiwgXCIpK1wiXVwifSxlPWZ1bmN0aW9uKGEsZCl7dmFyIGYsZzt2b2lkIDA9PT1kJiYoZD1cIlwiKTt2YXIgaz1kK1wiU3ltX3R5cGU6IFwiK2EuZ2V0X3R5cGUoKStcIlxcblwiO2srPWQrXCJTeW1fbmFtZTogXCIrYS5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9saW5lbm86IFwiK2EuZ2V0X2xpbmVubygpK1wiXFxuXCI7ays9ZCtcIlN5bV9uZXN0ZWQ6IFwiK2IoYS5pc19uZXN0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiU3ltX2hhc2NoaWxkcmVuOiBcIitiKGEuaGFzX2NoaWxkcmVuKCkpK1wiXFxuXCI7XCJjbGFzc1wiPT09YS5nZXRfdHlwZSgpP2srPWQrXG5cIkNsYXNzX21ldGhvZHM6IFwiK2MoYS5nZXRfbWV0aG9kcygpKStcIlxcblwiOlwiZnVuY3Rpb25cIj09PWEuZ2V0X3R5cGUoKSYmKGsrPWQrXCJGdW5jX3BhcmFtczogXCIrYyhhLmdldF9wYXJhbWV0ZXJzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfbG9jYWxzOiBcIitjKGEuZ2V0X2xvY2FscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2dsb2JhbHM6IFwiK2MoYS5nZXRfZ2xvYmFscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2ZyZWVzOiBcIitjKGEuZ2V0X2ZyZWVzKCkpK1wiXFxuXCIpO2srPWQrXCItLSBJZGVudGlmaWVycyAtLVxcblwiO3ZhciBoPWEuZ2V0X2lkZW50aWZpZXJzKCk7dmFyIG49aC5sZW5ndGg7Zm9yKGc9MDtnPG47KytnKXt2YXIgbD1hLmxvb2t1cChoW2ddKTtrKz1kK1wibmFtZTogXCIrbC5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcmVmZXJlbmNlZDogXCIrYihsLmlzX3JlZmVyZW5jZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19pbXBvcnRlZDogXCIrYihsLmlzX2ltcG9ydGVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcGFyYW1ldGVyOiBcIitcbmIobC5pc19wYXJhbWV0ZXIoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19nbG9iYWw6IFwiK2IobC5pc19nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19kZWNsYXJlZF9nbG9iYWw6IFwiK2IobC5pc19kZWNsYXJlZF9nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19sb2NhbDogXCIrYihsLmlzX2xvY2FsKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfZnJlZTogXCIrYihsLmlzX2ZyZWUoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19hc3NpZ25lZDogXCIrYihsLmlzX2Fzc2lnbmVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfbmFtZXNwYWNlOiBcIitiKGwuaXNfbmFtZXNwYWNlKCkpK1wiXFxuXCI7dmFyIG09bC5nZXRfbmFtZXNwYWNlcygpO3ZhciBwPW0ubGVuZ3RoO2srPWQrXCIgIG5hbWVzcGFjZXM6IFtcXG5cIjt2YXIgcT1bXTtmb3IoZj0wO2Y8cDsrK2YpbD1tW2ZdLHEucHVzaChlKGwsZCtcIiAgICBcIikpO2srPXEuam9pbihcIlxcblwiKTtrKz1kK1wiICBdXFxuXCJ9cmV0dXJuIGt9O3JldHVybiBlKGEudG9wLFwiXCIpfTtTay5leHBvcnRTeW1ib2woXCJTay5zeW1ib2x0YWJsZVwiLFxuU2suc3ltYm9sdGFibGUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmR1bXBTeW10YWJcIixTay5kdW1wU3ltdGFiKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGUsZil7dGhpcy5maWxlbmFtZT1hO3RoaXMuc3Q9Yjt0aGlzLmZsYWdzPWM7dGhpcy5jYW5TdXNwZW5kPWU7dGhpcy5pbnRlcmFjdGl2ZT0hMTt0aGlzLm5lc3RsZXZlbD0wO3RoaXMudT1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5yZXN1bHQ9W107dGhpcy5hbGxVbml0cz1bXTt0aGlzLnNvdXJjZT1mP2Yuc3BsaXQoXCJcXG5cIik6ITF9ZnVuY3Rpb24gYygpe3RoaXMubmFtZT10aGlzLnN0ZT1udWxsO3RoaXMuZG9lc1N1c3BlbmQ9dGhpcy5jYW5TdXNwZW5kPSExO3RoaXMucHJpdmF0ZV89bnVsbDt0aGlzLmxpbmVubz10aGlzLmZpcnN0bGluZW5vPTA7dGhpcy5saW5lbm9TZXQ9ITE7dGhpcy5sb2NhbG5hbWVzPVtdO3RoaXMubG9jYWx0ZW1wcz1bXTt0aGlzLnRlbXBzVG9TYXZlPVtdO3RoaXMuYmxvY2tudW09MDt0aGlzLmJsb2Nrcz1cbltdO3RoaXMuY3VyYmxvY2s9MDt0aGlzLmNvbnN0cz17fTt0aGlzLnNjb3BlbmFtZT1udWxsO3RoaXMuc3VmZml4Q29kZT10aGlzLnN3aXRjaENvZGU9dGhpcy52YXJEZWNsc0NvZGU9dGhpcy5wcmVmaXhDb2RlPVwiXCI7dGhpcy5icmVha0Jsb2Nrcz1bXTt0aGlzLmNvbnRpbnVlQmxvY2tzPVtdO3RoaXMuZXhjZXB0QmxvY2tzPVtdO3RoaXMuZmluYWxseUJsb2Nrcz1bXX1mdW5jdGlvbiBiKGEpe3JldHVybiB2b2lkIDA9PT1oW2FdP2E6YStcIl8kcnckXCJ9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWIudjtpZihudWxsPT09YXx8bnVsbD09PWN8fFwiX1wiIT09Yy5jaGFyQXQoMCl8fFwiX1wiIT09Yy5jaGFyQXQoMSl8fFwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJlwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMikpcmV0dXJuIGI7dmFyIGQ9YS52O2QucmVwbGFjZSgvXy9nLFwiXCIpO2lmKFwiXCI9PT1kKXJldHVybiBiO2Q9YS52O2QucmVwbGFjZSgvXl8qLyxcIlwiKTtyZXR1cm4gZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfXCIrXG5kK2MpfWZ1bmN0aW9uIGYoYSl7bGV0IGI9J1wiJztmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7bGV0IGQ9YS5jaGFyQ29kZUF0KGMpO2I9MTA9PWQ/YitcIlxcXFxuXCI6OTI9PWQ/YitcIlxcXFxcXFxcXCI6MzQ9PWR8fDMyPmR8fDEyNzw9ZCYmMjU2PmQ/YisoXCJcXFxceFwiKyhcIjBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSk6MjU2PD1kP2IrKFwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSk6YithLmNoYXJBdChjKX1yZXR1cm4gYisnXCInfXZhciBsO1NrLmdlbnN5bWNvdW50PTA7Yy5wcm90b3R5cGUuYWN0aXZhdGVTY29wZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bD1mdW5jdGlvbigpe3ZhciBiLGM9YS5ibG9ja3NbYS5jdXJibG9ja107aWYobnVsbD09PWMuX25leHQpZm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMucHVzaChhcmd1bWVudHNbYl0pfX07YS5wcm90b3R5cGUuZ2V0U291cmNlTGluZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnNvdXJjZSk7XG5yZXR1cm4gdGhpcy5zb3VyY2VbYS0xXX07YS5wcm90b3R5cGUuYW5ub3RhdGVTb3VyY2U9ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zb3VyY2Upe3ZhciBjPWEubGluZW5vO3ZhciBkPWEuY29sX29mZnNldDtsKFwiXFxuLy9cXG4vLyBsaW5lIFwiLGMsXCI6XFxuLy8gXCIsdGhpcy5nZXRTb3VyY2VMaW5lKGMpLFwiXFxuLy8gXCIpO2ZvcihiPTA7YjxkOysrYilsKFwiIFwiKTtsKFwiXlxcbi8vXFxuXCIpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEubGluZW5vJiZ2b2lkIDAhPT1hLmNvbF9vZmZzZXQpO2woXCIkY3VyckxpbmVObyA9IFwiLGMsXCI7XFxuJGN1cnJDb2xObyA9IFwiLGQsXCI7XFxuXFxuXCIpfX07YS5wcm90b3R5cGUuZ2Vuc3ltPWZ1bmN0aW9uKGEpe3JldHVybiBhPVwiJFwiKyhhfHxcIlwiKStTay5nZW5zeW1jb3VudCsrfTthLnByb3RvdHlwZS5uaWNlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW5zeW0oYS5yZXBsYWNlKFwiPFwiLFwiXCIpLnJlcGxhY2UoXCI+XCIsXCJcIikucmVwbGFjZShcIiBcIixcIl9cIikpfTtcbnZhciBoPVNrLmJ1aWx0aW4uc3RyLnJlc2VydmVkV29yZHNfO2EucHJvdG90eXBlLm1ha2VDb25zdGFudD1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMrPWFyZ3VtZW50c1tiXTtmb3IoZCBpbiB0aGlzLnUuY29uc3RzKWlmKHRoaXMudS5jb25zdHMuaGFzT3duUHJvcGVydHkoZCkmJihiPXRoaXMudS5jb25zdHNbZF0sYj09YykpcmV0dXJuIGQ7dmFyIGQ9dGhpcy51LnNjb3BlbmFtZStcIi5cIit0aGlzLmdlbnN5bShcImNvbnN0XCIpO3RoaXMudS5jb25zdHNbZF09YztyZXR1cm4gZH07YS5wcm90b3R5cGUuX2dyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD10aGlzLmdlbnN5bShhKTt0aGlzLnUubG9jYWx0ZW1wcy5wdXNoKGQpO2woXCJ2YXIgXCIsZCxcIj1cIik7Zm9yKGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWwoYXJndW1lbnRzW2NdKTtsKFwiO1wiKTtyZXR1cm4gZH07YS5wcm90b3R5cGUub3V0cHV0SW50ZXJydXB0VGVzdD1mdW5jdGlvbigpe3ZhciBhPVxuXCJcIjtpZihudWxsIT09U2suZXhlY0xpbWl0fHxudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQpYSs9XCJ2YXIgJGRhdGVOb3cgPSBEYXRlLm5vdygpO1wiLG51bGwhPT1Tay5leGVjTGltaXQmJihhKz1cImlmICgkZGF0ZU5vdyAtIFNrLmV4ZWNTdGFydCA+IFNrLmV4ZWNMaW1pdCkge3Rocm93IG5ldyBTay5idWlsdGluLlRpbWVMaW1pdEVycm9yKFNrLnRpbWVvdXRNc2coKSl9XCIpLG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGE9YStcImlmICgkZGF0ZU5vdyAtIFNrLmxhc3RZaWVsZCA+IFNrLnlpZWxkTGltaXQpIHtcIisoXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2sueWllbGQnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLCRjdXJyTGluZU5vLCRjdXJyQ29sTm8pO1wiKSxhKz1cIiRzdXNwLiRibGsgPSAkYmxrOyRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtyZXR1cm4gJHN1c3A7fVwiLFxudGhpcy51LmRvZXNTdXNwZW5kPSEwKTtyZXR1cm4gYX07YS5wcm90b3R5cGUuX2p1bXBmYWxzZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqZmFsc2VcIixcIihcIixhLFwiPT09ZmFsc2V8fCFTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgZmFpbGVkICovJGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIj09PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wbm90dW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIiE9PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdHJ1ZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqdHJ1ZVwiLFwiKFwiLGEsXCI9PT10cnVlfHxTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgcGFzc2VkICovJGJsaz1cIixcbmIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXA9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dCYmKGwoXCIkYmxrPVwiLGEsXCI7XCIpLHRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dD1hKX07YS5wcm90b3R5cGUuX2NoZWNrU3VzcGVuc2lvbj1mdW5jdGlvbihhKXtpZih0aGlzLnUuY2FuU3VzcGVuZCl7dmFyIGI9dGhpcy5uZXdCbG9jayhcImZ1bmN0aW9uIHJldHVybiBvciByZXN1bWUgc3VzcGVuc2lvblwiKTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYik7YT1hfHx7bGluZW5vOlwiJGN1cnJMaW5lTm9cIixjb2xfb2Zmc2V0OlwiJGN1cnJDb2xOb1wifTtsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7IHJldHVybiAkc2F2ZVN1c3BlbnNpb24oJHJldCwnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTsgfVwiKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITA7XG50aGlzLnUudGVtcHNUb1NhdmU9dGhpcy51LnRlbXBzVG9TYXZlLmNvbmNhdCh0aGlzLnUubG9jYWx0ZW1wcyl9ZWxzZSBsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7ICRyZXQgPSBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coJHJldCk7IH1cIil9O2EucHJvdG90eXBlLmN1bnBhY2tzdGFyc3RvYXJyYXk9ZnVuY3Rpb24oYSxiKXtpZighYXx8MD09YS5sZW5ndGgpcmV0dXJuXCJbXVwiO2xldCBjPSExO2ZvcihsZXQgZCBvZiBhKXtpZihiJiZjKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiRXh0ZW5kZWQgYXJndW1lbnQgdW5wYWNraW5nIGlzIG5vdCBwZXJtaXR0ZWQgaW4gUHl0aG9uIDJcIik7ZC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQmJihjPSEwKX1pZihjKXtiPXRoaXMuX2dyKFwidW5wYWNrXCIsXCJbXVwiKTtmb3IobGV0IGMgb2YgYSljLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuU3RhcnJlZD9sKGIsXG5cIi5wdXNoKFwiLHRoaXMudmV4cHIoYyksXCIpO1wiKToobChcIiRyZXQgPSBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIiksIGZ1bmN0aW9uKGUpIHsgXCIsYixcIi5wdXNoKGUpOyB9KTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpO3JldHVybiBifXJldHVyblwiW1wiK2EubWFwKGE9PnRoaXMudmV4cHIoYSkpLmpvaW4oXCIsXCIpK1wiXVwifTthLnByb3RvdHlwZS5jdHVwbGVsaXN0b3JzZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmFzc2VydHMuYXNzZXJ0KFwidHVwbGVcIj09PWN8fFwibGlzdFwiPT09Y3x8XCJzZXRcIj09PWMpO3ZhciBlPSExO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXtlPSEwO3ZhciBmPWQ7YnJlYWt9aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZSl7aWYoZSl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdW5wYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiLFxudGhpcy5maWxlbmFtZSxhLmxpbmVubyk7Zm9yKGQ9ZisxO2Q8YS5lbHRzLmxlbmd0aDtkKyspaWYoYS5lbHRzW2RdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm11bHRpcGxlIHN0YXJyZWQgZXhwcmVzc2lvbnMgaW4gYXNzaWdubWVudFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO31jPWU/ZjphLmVsdHMubGVuZ3RoO2woXCIkcmV0ID0gU2suYWJzdHIuc2VxdWVuY2VVbnBhY2soXCIrYitcIixcIitjK1wiLFwiKyhlP2EuZWx0cy5sZW5ndGgtMTpjKStcIiwgXCIrZStcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbigpO2I9dGhpcy5fZ3IoXCJpdGVtc1wiLFwiJHJldFwiKTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZD09PWY/dGhpcy52ZXhwcihhLmVsdHNbZF0udmFsdWUsYitcIltcIitkK1wiXVwiKTp0aGlzLnZleHByKGEuZWx0c1tkXSxiK1wiW1wiK2QrXCJdXCIpfWVsc2UgaWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkfHxcInNldFwiPT09XG5jKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiTGlzdCBwYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFwiLHRoaXMuY3VucGFja3N0YXJzdG9hcnJheShhLmVsdHMpLFwiKVwiKX1pZihcInR1cGxlXCI9PT1jKXtlPSEwO2I9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWY9dGhpcy52ZXhwcihhLmVsdHNbZF0pLGUmJi0xPT1mLmluZGV4T2YoXCIkY29uc3RcIikmJihlPSExKSxiLnB1c2goZik7aWYoZSlyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi50dXBsZShbXCIrYitcIl0pXCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2QpYltkXT10aGlzLl9ncihcImVsZW1cIixiW2RdKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixcbmIsXCJdKVwiKX1iPVtdO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZCliLnB1c2godGhpcy5fZ3IoXCJlbGVtXCIsdGhpcy52ZXhwcihhLmVsdHNbZF0pKSk7cmV0dXJuIHRoaXMuX2dyKFwibG9hZFwiK2MsXCJuZXcgU2suYnVpbHRpbnNbJ1wiLGMsXCInXShbXCIsYixcIl0pXCIpfX07YS5wcm90b3R5cGUuY2RpY3Q9ZnVuY3Rpb24oYSl7dmFyIGI7dmFyIGM9W107aWYobnVsbCE9PWEua2V5cylmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYS52YWx1ZXMubGVuZ3RoPT09YS5rZXlzLmxlbmd0aCksYj0wO2I8YS52YWx1ZXMubGVuZ3RoOysrYil7dmFyIGQ9dGhpcy52ZXhwcihhLnZhbHVlc1tiXSk7Yy5wdXNoKHRoaXMudmV4cHIoYS5rZXlzW2JdKSk7Yy5wdXNoKGQpfXJldHVybiB0aGlzLl9ncihcImxvYWRkaWN0XCIsXCJuZXcgU2suYnVpbHRpbnNbJ2RpY3QnXShbXCIsYyxcIl0pXCIpfTthLnByb3RvdHlwZS5jbGlzdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxpc3RDb21wKTtcbnZhciBiPXRoaXMuX2dyKFwiX2NvbXByXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2xpc3QnXShbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJsaXN0XCIsYixhLmdlbmVyYXRvcnMsMCxhLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jZGljdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkRpY3RDb21wKTt2YXIgYj10aGlzLl9ncihcIl9kY29tcHJcIixcIm5ldyBTay5idWlsdGlucy5kaWN0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImRpY3RcIixiLGEuZ2VuZXJhdG9ycywwLGEudmFsdWUsYS5rZXksYSl9O2EucHJvdG90eXBlLmNzZXRjb21wPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TZXRDb21wKTt2YXIgYj10aGlzLl9ncihcIl9zZXRjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLnNldChbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJzZXRcIixiLGEuZ2VuZXJhdG9ycywwLFxuYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2NvbXBnZW49ZnVuY3Rpb24oYSxiLGMsZSxmLGgsbSl7dmFyIGQ9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgc3RhcnRcIiksZz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBza2lwXCIpLGs9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgYW5jaG9yXCIpLG49Y1tlXSxwPXRoaXMudmV4cHIobi5pdGVyKTtwPXRoaXMuX2dyKFwiaXRlclwiLFwiU2suYWJzdHIuaXRlcihcIixwLFwiKVwiKTt2YXIgcTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7bChcIiRyZXQgPSBTay5hYnN0ci5pdGVybmV4dChcIixwLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKG0pO3A9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihwLGspO3RoaXMudmV4cHIobi50YXJnZXQscCk7dmFyIHU9bi5pZnM/bi5pZnMubGVuZ3RoOjA7Zm9yKHE9MDtxPHU7KytxKXA9dGhpcy52ZXhwcihuLmlmc1txXSksdGhpcy5fanVtcGZhbHNlKHAsZCk7KytlPGMubGVuZ3RoJiZcbnRoaXMuY2NvbXBnZW4oYSxiLGMsZSxmLGgsbSk7ZT49Yy5sZW5ndGgmJihjPXRoaXMudmV4cHIoZiksXCJkaWN0XCI9PT1hPyhhPXRoaXMudmV4cHIoaCksbChiLFwiLm1wJGFzc19zdWJzY3JpcHQoXCIsYSxcIixcIixjLFwiKTtcIikpOlwibGlzdFwiPT09YT9sKGIsXCIudi5wdXNoKFwiLGMsXCIpO1wiKTpcInNldFwiPT09YSYmbChiLFwiLnYubXAkYXNzX3N1YnNjcmlwdChcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fanVtcChnKSx0aGlzLnNldEJsb2NrKGcpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soayk7cmV0dXJuIGJ9O2EucHJvdG90eXBlLmN5aWVsZD1mdW5jdGlvbihhKXtpZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO3ZhciBiPVwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7YS52YWx1ZSYmKGI9dGhpcy52ZXhwcihhLnZhbHVlKSk7XG5hPXRoaXMubmV3QmxvY2soXCJhZnRlciB5aWVsZFwiKTtsKFwicmV0dXJuIFsvKnJlc3VtZSovXCIsYSxcIiwvKnJldCovXCIsYixcIl07XCIpO3RoaXMuc2V0QmxvY2soYSk7cmV0dXJuXCIkZ2VuLmdpJHNlbnR2YWx1ZVwifTthLnByb3RvdHlwZS5jY29tcGFyZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhLm9wcy5sZW5ndGg9PT1hLmNvbXBhcmF0b3JzLmxlbmd0aCk7dmFyIGM9dGhpcy52ZXhwcihhLmxlZnQpO3ZhciBkPWEub3BzLmxlbmd0aDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZG9uZVwiKTt2YXIgZj10aGlzLl9ncihcImNvbXBhcmVyZXNcIixcIm51bGxcIik7Zm9yKGI9MDtiPGQ7KytiKXt2YXIgaD10aGlzLnZleHByKGEuY29tcGFyYXRvcnNbYl0pO2woXCIkcmV0ID0gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChcIixjLFwiLFwiLGgsXCIsJ1wiLGEub3BzW2JdLnByb3RvdHlwZS5fYXN0bmFtZSxcIicsIHRydWUpKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO1xubChmLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXBmYWxzZShcIiRyZXRcIixlKTtjPWh9dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO3JldHVybiBmfTthLnByb3RvdHlwZS5jY2FsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEuZnVuYyk7bGV0IGM9dGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuYXJncywhU2suX19mdXR1cmVfXy5weXRob24zKTt2YXIgZD1cInVuZGVmaW5lZFwiO2lmKGEua2V5d29yZHMmJjA8YS5rZXl3b3Jkcy5sZW5ndGgpe2xldCBjPSExO2Q9W107Zm9yKGxldCBiIG9mIGEua2V5d29yZHMpe2lmKGMmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQWR2YW5jZWQgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO2IuYXJnPyhkLnB1c2goXCInXCIrYi5hcmcuditcIidcIiksZC5wdXNoKHRoaXMudmV4cHIoYi52YWx1ZSkpKTpjPSEwfWQ9XCJbXCIrZC5qb2luKFwiLFwiKStcblwiXVwiO2lmKGMpe2Q9dGhpcy5fZ3IoXCJrZXl3b3JkQXJnc1wiLGQpO2ZvcihsZXQgYyBvZiBhLmtleXdvcmRzKWMuYXJnfHwobChcIiRyZXQgPSBTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheShcIixkLFwiLFwiLHRoaXMudmV4cHIoYy52YWx1ZSksXCIsXCIsYixcIik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKX19U2suX19mdXR1cmVfXy5zdXBlcl9hcmdzJiZhLmZ1bmMuaWQmJlwic3VwZXJcIj09PWEuZnVuYy5pZC52JiZcIltdXCI9PT1jJiYobCgnaWYgKHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiIHx8IHNlbGYudG9TdHJpbmcoKS5pbmRleE9mKFwiV2luZG93XCIpID4gMCkgeyB0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJzdXBlcigpOiBubyBhcmd1bWVudHNcIikgfTsnKSxjPVwiWyRnYmwuX19jbGFzc19fLHNlbGZdXCIpO2woXCIkcmV0ID0gKFwiLGIsXCIudHAkY2FsbCk/XCIsYixcIi50cCRjYWxsKFwiLGMsXCIsXCIsZCxcIikgOiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixcbmIsXCIsdW5kZWZpbmVkLHVuZGVmaW5lZCxcIixkLFwiLFwiLGMsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7cmV0dXJuIHRoaXMuX2dyKFwiY2FsbFwiLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY3NsaWNlPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TbGljZSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXt2YXIgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjt2YXIgYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIn1lbHNlIGI9YS5sb3dlcj90aGlzLnZleHByKGEubG93ZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygwKVwiLGM9YS51cHBlcj90aGlzLnZleHByKGEudXBwZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KVwiO1xuYT1hLnN0ZXA/dGhpcy52ZXhwcihhLnN0ZXApOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7cmV0dXJuIHRoaXMuX2dyKFwic2xpY2VcIixcIm5ldyBTay5idWlsdGluc1snc2xpY2UnXShcIixiLFwiLFwiLGMsXCIsXCIsYSxcIilcIil9O2EucHJvdG90eXBlLmVzbGljZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgQXJyYXkpO3ZhciBjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKHRoaXMudnNsaWNlc3ViKGFbYl0pKTtyZXR1cm4gdGhpcy5fZ3IoXCJleHRzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWyd0dXBsZSddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLnZzbGljZXN1Yj1mdW5jdGlvbihhKXtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp2YXIgYj10aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6Yj10aGlzLmNzbGljZShhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkVsbGlwc2lzOlNrLmFzc2VydHMuZmFpbChcInRvZG8gY29tcGlsZS5qcyBFbGxpcHNpcztcIik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmI9dGhpcy5lc2xpY2UoYS5kaW1zKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGtpbmRcIil9cmV0dXJuIGJ9O2EucHJvdG90eXBlLnZzbGljZT1mdW5jdGlvbihhLGIsYyxlKXthPXRoaXMudnNsaWNlc3ViKGEpO3JldHVybiB0aGlzLmNoYW5kbGVzdWJzY3IoYixjLGEsZSl9O2EucHJvdG90eXBlLmNoYW5kbGVzdWJzY3I9ZnVuY3Rpb24oYSxiLGMsZSl7aWYoYT09PVNrLmFzdG5vZGVzLkxvYWR8fGE9PT1Tay5hc3Rub2Rlcy5BdWdMb2FkKXJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYixcIixcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCksdGhpcy5fZ3IoXCJsc3Vic2NyXCIsXCIkcmV0XCIpO2E9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YT09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlPyhsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsXG5iLFwiLFwiLGMsXCIsXCIsZSxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKTphPT09U2suYXN0bm9kZXMuRGVsP2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtKFwiLGIsXCIsXCIsYyxcIik7XCIpOlNrLmFzc2VydHMuZmFpbChcImhhbmRsZXN1YnNjciBmYWlsXCIpfTthLnByb3RvdHlwZS5jYm9vbG9wPWZ1bmN0aW9uKGEpe3ZhciBiLGM7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkJvb2xPcCk7dmFyIGQ9YS5vcD09PVNrLmFzdG5vZGVzLkFuZD90aGlzLl9qdW1wZmFsc2U6dGhpcy5fanVtcHRydWU7dmFyIGU9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBib29sb3BcIik7dmFyIGY9YS52YWx1ZXM7dmFyIGg9Zi5sZW5ndGg7Zm9yKGI9MDtiPGg7KytiKWE9dGhpcy52ZXhwcihmW2JdKSwwPT09YiYmKGM9dGhpcy5fZ3IoXCJib29sb3BzdWNjXCIsYSkpLGwoYyxcIj1cIixhLFwiO1wiKSxkLmNhbGwodGhpcyxhLGUpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKTtcbnJldHVybiBjfTthLnByb3RvdHlwZS5jam9pbmVkc3RyPWZ1bmN0aW9uKGEpe2xldCBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Kb2luZWRTdHIpO2ZvcihsZXQgYyBvZiBhLnZhbHVlcylhPXRoaXMudmV4cHIoYyksYj9sKGIsXCI9XCIsYixcIi5zcSRjb25jYXQoXCIsYSxcIik7XCIpOmI9dGhpcy5fZ3IoXCJqb2luZWRzdHJcIixhKTtifHwoYj1cIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2Zvcm1hdHRlZHZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPXRoaXMudmV4cHIoYS52YWx1ZSk7c3dpdGNoKGEuY29udmVyc2lvbil7Y2FzZSBcInNcIjpiPXRoaXMuX2dyKFwidmFsdWVcIixcIm5ldyBTay5idWlsdGluLnN0cihcIixiLFwiKVwiKTticmVhaztjYXNlIFwiYVwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5hc2NpaShcIixiLFwiKVwiKTticmVhaztjYXNlIFwiclwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5yZXByKFwiLFxuYixcIilcIil9YT1hLmZvcm1hdF9zcGVjP3RoaXMudmV4cHIoYS5mb3JtYXRfc3BlYyk6XCJTay5idWlsdGluLnN0ci4kZW1wdHlzdHJcIjtyZXR1cm4gdGhpcy5fZ3IoXCJmb3JtYXR0ZWRcIixcIlNrLmFic3RyLm9iamVjdEZvcm1hdChcIitiK1wiLFwiK2ErXCIpXCIpfTthLnByb3RvdHlwZS52ZXhwcj1mdW5jdGlvbihhLGIsYyxrKXt2YXIgZDthLmxpbmVubz50aGlzLnUubGluZW5vJiYodGhpcy51LmxpbmVubz1hLmxpbmVubyx0aGlzLnUubGluZW5vU2V0PSExKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Cb29sT3A6cmV0dXJuIHRoaXMuY2Jvb2xvcChhKTtjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOnJldHVybiB0aGlzLl9ncihcImJpbm9wXCIsXCJTay5hYnN0ci5udW1iZXJCaW5PcChcIix0aGlzLnZleHByKGEubGVmdCksXCIsXCIsdGhpcy52ZXhwcihhLnJpZ2h0KSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6cmV0dXJuIHRoaXMuX2dyKFwidW5hcnlvcFwiLFxuXCJTay5hYnN0ci5udW1iZXJVbmFyeU9wKFwiLHRoaXMudmV4cHIoYS5vcGVyYW5kKSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTpyZXR1cm4gdGhpcy5jbGFtYmRhKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6cmV0dXJuIHRoaXMuY2lmZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdDpyZXR1cm4gdGhpcy5jZGljdChhKTtjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnJldHVybiB0aGlzLmNsaXN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOnJldHVybiB0aGlzLmNkaWN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6cmV0dXJuIHRoaXMuY3NldGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6cmV0dXJuIHRoaXMuY2dlbmV4cChhKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnJldHVybiB0aGlzLmN5aWVsZChhKTtjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6cmV0dXJuIHRoaXMuY2NvbXBhcmUoYSk7XG5jYXNlIFNrLmFzdG5vZGVzLkNhbGw6cmV0dXJuIGI9dGhpcy5jY2FsbChhKSx0aGlzLmFubm90YXRlU291cmNlKGEpLGI7Y2FzZSBTay5hc3Rub2Rlcy5OdW06aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm4pcmV0dXJuIGEubjtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5sbmcoJ1wiK2Eubi52LnRvU3RyaW5nKCkrXCInKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLm4udj90aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmludF8oXCIrYS5uLnYrXCIpXCIpOnRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBhPTA9PT1hLm4udiYmLUluZmluaXR5PT09MS9hLm4udj9cIi0wXCI6YS5uLnYsdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5mbG9hdF8oXCIrXG5hK1wiKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXgpcmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uY29tcGxleChcIisoMD09PWEubi5yZWFsJiYtSW5maW5pdHk9PT0xL2Eubi5yZWFsP1wiLTBcIjphLm4ucmVhbCkrXCIsIFwiKygwPT09YS5uLmltYWcmJi1JbmZpbml0eT09PTEvYS5uLmltYWc/XCItMFwiOmEubi5pbWFnKStcIilcIik7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIE51bSB0eXBlXCIpO2Nhc2UgU2suYXN0bm9kZXMuQnl0ZXM6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtiPVtdO2E9YS5zLiRqc3N0cigpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGEuY2hhckNvZGVBdChjKSk7cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uYnl0ZXMoW1wiLGIuam9pbihcIiwgXCIpLFwiXSlcIil9Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLFxuZihhLnMuJGpzc3RyKCkpLFwiKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTphLmN0eCE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQmJmEuY3R4IT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJihkPXRoaXMudmV4cHIoYS52YWx1ZSkpO2s9YS5hdHRyLiRyKCkudjtrPWsuc3Vic3RyaW5nKDEsay5sZW5ndGgtMSk7az1lKHRoaXMudS5wcml2YXRlXyxuZXcgU2suYnVpbHRpbi5zdHIoaykpLnY7az10aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnN0cignXCIraytcIicpXCIpO3N3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGMsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixjLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxcbmssJy4kanNzdHIoKSArIFwiXFwnXCIpOycpLGwoXCJcXG59O1wiKSx0aGlzLl9ncihcImxhdHRyXCIsXCIkcmV0XCIpO2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixkLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsZCwnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldCA9IHVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldCA9IFwiLGMsXCIudHAkc2V0YXR0cihcIixrLFwiLFwiLGIsXCIsIHRydWUpO1wiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7XG5jYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiJHJldCA9IFwiLGQsXCIudHAkc2V0YXR0cihcIixrLFwiLCB1bmRlZmluZWQsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF0dHJpYnV0ZSBleHByZXNzaW9uXCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYyxcIixcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLHRoaXMuX2dyKFwiZ2l0ZW1cIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6Y2FzZSBTay5hc3Rub2Rlcy5EZWw6cmV0dXJuIHRoaXMudnNsaWNlKGEuc2xpY2UsXG5hLmN0eCx0aGlzLnZleHByKGEudmFsdWUpLGIpO2Nhc2UgU2suYXN0bm9kZXMuQXVnU3RvcmU6bChcIiRyZXQ9dW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0PVNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsYyxcIixcIixrLFwiLFwiLGIsXCIsIHRydWUpXCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiB0aGlzLm5hbWVvcChhLmlkLGEuY3R4LGIpO2Nhc2UgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50OmlmKGEuY3R4PT09U2suYXN0bm9kZXMuU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuRGVsKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gYSBjb25zdGFudCBuYW1lXCIpO1xuc3dpdGNoKGEudmFsdWUpe2Nhc2UgU2suYnVpbHRpbi5ub25lLm5vbmUkOnJldHVyblwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7Y2FzZSBTay5idWlsdGluLmJvb2wudHJ1ZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wudHJ1ZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wuZmFsc2UkXCI7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIG5hbWVkIGNvbnN0YW50XCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwibGlzdFwiKTtjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJ0dXBsZVwiKTtjYXNlIFNrLmFzdG5vZGVzLlNldDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwic2V0XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJzdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgdXNlIHN0YXJyZWQgZXhwcmVzc2lvbiBoZXJlXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWNhc2UgU2suYXN0bm9kZXMuSm9pbmVkU3RyOnJldHVybiB0aGlzLmNqb2luZWRzdHIoYSk7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTpyZXR1cm4gdGhpcy5jZm9ybWF0dGVkdmFsdWUoYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgdmV4cHJcIil9fTthLnByb3RvdHlwZS52c2VxZXhwcj1mdW5jdGlvbihhLGIpe3ZhciBjO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMD09PWJ8fGEubGVuZ3RoPT09Yi5sZW5ndGgpO3ZhciBkPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpZC5wdXNoKHRoaXMudmV4cHIoYVtjXSx2b2lkIDA9PT1iP3ZvaWQgMDpiW2NdKSk7cmV0dXJuIGR9O2EucHJvdG90eXBlLmNhdWdhc3NpZ249XG5mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQXVnQXNzaWduKTt2YXIgYj1hLnRhcmdldDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6dmFyIGM9dGhpcy52ZXhwcihiLnZhbHVlKTtiPW5ldyBTay5hc3Rub2Rlcy5BdHRyaWJ1dGUoYi52YWx1ZSxiLmF0dHIsU2suYXN0bm9kZXMuQXVnTG9hZCxiLmxpbmVubyxiLmNvbF9vZmZzZXQpO3ZhciBkPXRoaXMudmV4cHIoYix2b2lkIDAsYyk7dmFyIGU9dGhpcy52ZXhwcihhLnZhbHVlKTthPXRoaXMuX2dyKFwiaW5wbGJpbm9wYXR0clwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyk7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yz10aGlzLnZleHByKGIudmFsdWUpO3ZhciBmPVxudGhpcy52c2xpY2VzdWIoYi5zbGljZSk7Yj1uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGIudmFsdWUsZixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7ZD10aGlzLnZleHByKGIsdm9pZCAwLGMsZik7ZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BzdWJzY3JcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMsZik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiBjPXRoaXMubmFtZW9wKGIuaWQsU2suYXN0bm9kZXMuTG9hZCksZT10aGlzLnZleHByKGEudmFsdWUpLGE9dGhpcy5fZ3IoXCJpbnBsYmlub3BcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixjLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIiksdGhpcy5uYW1lb3AoYi5pZCxcblNrLmFzdG5vZGVzLlN0b3JlLGEpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gYXVnYXNzaWduXCIpfX07YS5wcm90b3R5cGUuZXhwckNvbnN0YW50PWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk51bTpyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEubik/MTowO2Nhc2UgU2suYXN0bm9kZXMuU3RyOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5zKT8xOjA7ZGVmYXVsdDpyZXR1cm4tMX19O2EucHJvdG90eXBlLm5ld0Jsb2NrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudS5ibG9ja251bSsrO3RoaXMudS5ibG9ja3NbYl09W107dGhpcy51LmJsb2Nrc1tiXS5fbmFtZT1hfHxcIjx1bm5hbWVkPlwiO3RoaXMudS5ibG9ja3NbYl0uX25leHQ9bnVsbDtyZXR1cm4gYn07YS5wcm90b3R5cGUuc2V0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jdXJibG9jaz1cbmF9O2EucHJvdG90eXBlLnB1c2hCcmVha0Jsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuYnJlYWtCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wQnJlYWtCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5icmVha0Jsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucHVzaENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jb250aW51ZUJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BDb250aW51ZUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoRXhjZXB0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5leGNlcHRCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wRXhjZXB0QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZXhjZXB0QmxvY2tzLnBvcCgpfTtcbmEucHJvdG90eXBlLnB1c2hGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTt0aGlzLnUuZmluYWxseUJsb2Nrcy5wdXNoKHtibGs6YSxicmVha0RlcHRoOnRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGh9KX07YS5wcm90b3R5cGUucG9wRmluYWxseUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmZpbmFsbHlCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnBlZWtGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/dGhpcy51LmZpbmFsbHlCbG9ja3NbdGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoLTFdOnZvaWQgMH07YS5wcm90b3R5cGUuc2V0dXBFeGNlcHQ9ZnVuY3Rpb24oYSl7bChcIiRleGMucHVzaChcIixhLFwiKTtcIil9O2EucHJvdG90eXBlLmVuZEV4Y2VwdD1cbmZ1bmN0aW9uKCl7bChcIiRleGMucG9wKCk7XCIpfTthLnByb3RvdHlwZS5vdXRwdXRMb2NhbHM9ZnVuY3Rpb24oYSl7dmFyIGIsYz17fTtmb3IoYj0wO2EuYXJnbmFtZXMmJmI8YS5hcmduYW1lcy5sZW5ndGg7KytiKWNbYS5hcmduYW1lc1tiXV09ITA7YS5sb2NhbG5hbWVzLnNvcnQoKTt2YXIgZD1bXTtmb3IoYj0wO2I8YS5sb2NhbG5hbWVzLmxlbmd0aDsrK2Ipe3ZhciBlPWEubG9jYWxuYW1lc1tiXTt2b2lkIDA9PT1jW2VdJiYoZC5wdXNoKGUpLGNbZV09ITApfXJldHVybiAwPGQubGVuZ3RoP1widmFyIFwiK2Quam9pbihcIixcIikrXCI7IC8qIGxvY2FscyAqL1wiOlwiXCJ9O2EucHJvdG90eXBlLm91dHB1dFN1c3BlbnNpb25IZWxwZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZD1hLmxvY2FsbmFtZXMuY29uY2F0KGEudGVtcHNUb1NhdmUpLGU9e30sZj1hLnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJmEuc3RlLmNoaWxkSGFzRnJlZSxoPSgwPGQubGVuZ3RoP1xuXCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjtcIjpcIlwiKStcInZhciAkd2FrZUZyb21TdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7dmFyIHN1c3AgPSBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbjsgXCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb24gPSB1bmRlZmluZWQ7JGJsaz1zdXNwLiRibGs7ICRsb2M9c3VzcC4kbG9jOyAkZ2JsPXN1c3AuJGdibDsgJGV4Yz1zdXNwLiRleGM7ICRlcnI9c3VzcC4kZXJyOyAkcG9zdGZpbmFsbHk9c3VzcC4kcG9zdGZpbmFsbHk7JGN1cnJMaW5lTm89c3VzcC4kbGluZW5vOyAkY3VyckNvbE5vPXN1c3AuJGNvbG5vOyBTay5sYXN0WWllbGQ9RGF0ZS5ub3coKTtcIisoZj9cIiRjZWxsPXN1c3AuJGNlbGw7XCI6XCJcIik7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKyl7dmFyIGw9ZFtiXTt2b2lkIDA9PT1lW2xdJiYoaCs9bCtcIj1zdXNwLiR0bXBzLlwiK2wrXCI7XCIsZVtsXT0hMCl9aCs9XCJ0cnkgeyAkcmV0PXN1c3AuY2hpbGQucmVzdW1lKCk7IH0gY2F0Y2goZXJyKSB7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJ30pOyBpZigkZXhjLmxlbmd0aD4wKSB7ICRlcnI9ZXJyOyAkYmxrPSRleGMucG9wKCk7IH0gZWxzZSB7IHRocm93IGVycjsgfSB9fTtcIjtoKz1cInZhciAkc2F2ZVN1c3BlbnNpb24gPSBmdW5jdGlvbigkY2hpbGQsICRmaWxlbmFtZSwgJGxpbmVubywgJGNvbG5vKSB7dmFyIHN1c3AgPSBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbigpOyBzdXNwLmNoaWxkPSRjaGlsZDtzdXNwLnJlc3VtZT1mdW5jdGlvbigpe1wiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uPXN1c3A7IHJldHVybiBcIithLnNjb3BlbmFtZStcIihcIisoYS5zdGUuZ2VuZXJhdG9yP1wiJGdlblwiOlwiXCIpK1wiKTsgfTtzdXNwLmRhdGE9c3VzcC5jaGlsZC5kYXRhO3N1c3AuJGJsaz0kYmxrO3N1c3AuJGxvYz0kbG9jO3N1c3AuJGdibD0kZ2JsO3N1c3AuJGV4Yz0kZXhjO3N1c3AuJGVycj0kZXJyO3N1c3AuJHBvc3RmaW5hbGx5PSRwb3N0ZmluYWxseTtzdXNwLiRmaWxlbmFtZT0kZmlsZW5hbWU7c3VzcC4kbGluZW5vPSRsaW5lbm87c3VzcC4kY29sbm89JGNvbG5vO3N1c3Aub3B0aW9uYWw9c3VzcC5jaGlsZC5vcHRpb25hbDtcIitcbihmP1wic3VzcC4kY2VsbD0kY2VsbDtcIjpcIlwiKTtlPXt9O2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspbD1kW2JdLHZvaWQgMD09PWVbbF0mJihjLnB1c2goJ1wiJytsKydcIjonK2wpLGVbbF09ITApO3JldHVybiBoKz1cInN1c3AuJHRtcHM9e1wiK2Muam9pbihcIixcIikrXCJ9O3JldHVybiBzdXNwO307XCJ9O2EucHJvdG90eXBlLm91dHB1dEFsbFVuaXRzPWZ1bmN0aW9uKCl7dmFyIGEsYixjPVwiXCI7Zm9yKGI9MDtiPHRoaXMuYWxsVW5pdHMubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5hbGxVbml0c1tiXTtjKz1lLnByZWZpeENvZGU7Yys9dGhpcy5vdXRwdXRMb2NhbHMoZSk7ZS5kb2VzU3VzcGVuZCYmKGMrPXRoaXMub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnMoZSkpO2MrPWUudmFyRGVjbHNDb2RlO2MrPWUuc3dpdGNoQ29kZTt2YXIgZj1lLmJsb2Nrczt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihhPTA7YTxmLmxlbmd0aDsrK2Epe3ZhciBsPWE7aWYoIShsIGluIGgpKWZvcig7OylpZihoW2xdPVxuITAsYys9XCJjYXNlIFwiK2wrXCI6IC8qIC0tLSBcIitmW2xdLl9uYW1lK1wiIC0tLSAqL1wiLGMrPWZbbF0uam9pbihcIlwiKSxudWxsIT09ZltsXS5fbmV4dClpZihmW2xdLl9uZXh0IGluIGgpe2MrPVwiLyoganVtcCAqLyBjb250aW51ZTtcIjticmVha31lbHNlIGMrPVwiLyogYWxsb3dpbmcgY2FzZSBmYWxsdGhyb3VnaCAqL1wiLGw9ZltsXS5fbmV4dDtlbHNle2MrPVwidGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IoJ2ludGVybmFsIGVycm9yOiB1bnRlcm1pbmF0ZWQgYmxvY2snKTtcIjticmVha319Yys9ZS5zdWZmaXhDb2RlfXJldHVybiBjfTthLnByb3RvdHlwZS5jaWY9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLklmKTt2YXIgYz10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpO2lmKDA9PT1jKWEub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aCYmdGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7ZWxzZSBpZigxPT09Yyl0aGlzLnZzZXFzdG10KGEuYm9keSk7XG5lbHNle3ZhciBkPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZcIik7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiYoYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBicmFuY2ggb2YgaWZcIikpO2M9dGhpcy52ZXhwcihhLnRlc3QpO2Eub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aD8odGhpcy5fanVtcGZhbHNlKGMsYiksdGhpcy52c2Vxc3RtdChhLmJvZHkpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhiKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSk6KHRoaXMuX2p1bXBmYWxzZShjLGQpLHRoaXMudnNlcXN0bXQoYS5ib2R5KSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfX07YS5wcm90b3R5cGUuY3doaWxlPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpKWEub3JlbHNlJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNle3ZhciBiPXRoaXMubmV3QmxvY2soXCJ3aGlsZSB0ZXN0XCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtcbnZhciBjPXRoaXMubmV3QmxvY2soXCJhZnRlciB3aGlsZVwiKTt2YXIgZD0wPGEub3JlbHNlLmxlbmd0aD90aGlzLm5ld0Jsb2NrKFwid2hpbGUgb3JlbHNlXCIpOm51bGw7dmFyIGU9dGhpcy5uZXdCbG9jayhcIndoaWxlIGJvZHlcIik7dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTt0aGlzLl9qdW1wZmFsc2UodGhpcy52ZXhwcihhLnRlc3QpLGQ/ZDpjKTt0aGlzLl9qdW1wKGUpO3RoaXMucHVzaEJyZWFrQmxvY2soYyk7dGhpcy5wdXNoQ29udGludWVCbG9jayhiKTt0aGlzLnNldEJsb2NrKGUpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlV2hpbGUpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGU9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2UrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZSksdGhpcy5zZXRCbG9jayhlKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpOzA8YS5vcmVsc2UubGVuZ3RoJiYodGhpcy5zZXRCbG9jayhkKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSx0aGlzLl9qdW1wKGMpKTt0aGlzLnNldEJsb2NrKGMpfX07YS5wcm90b3R5cGUuY2Zvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZm9yIHN0YXJ0XCIpLGM9dGhpcy5uZXdCbG9jayhcImZvciBjbGVhbnVwXCIpLGQ9dGhpcy5uZXdCbG9jayhcImZvciBlbmRcIik7dGhpcy5wdXNoQnJlYWtCbG9jayhkKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO1xudmFyIGU9dGhpcy52ZXhwcihhLml0ZXIpO2lmKHRoaXMudS5zdGUuZ2VuZXJhdG9yKXt2YXIgZj1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woZixcIj1Tay5hYnN0ci5pdGVyKFwiLGUsXCIpO1wiKX1lbHNlIGY9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLGUsXCIpXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGYsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYoZixjKTt0aGlzLnZleHByKGEudGFyZ2V0LGYpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlRm9yKSYmdGhpcy51LmNhblN1c3BlbmQmJihmPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKSxsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTtcIixcIiRzdXNwLiRibGsgPSBcIitmK1wiO1wiLFwiJHN1c3Aub3B0aW9uYWwgPSB0cnVlO1wiLFwicmV0dXJuICRzdXNwO1wiLFwifVwiKSx0aGlzLl9qdW1wKGYpLHRoaXMuc2V0QmxvY2soZiksdGhpcy51LmRvZXNTdXNwZW5kPSEwKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKX07YS5wcm90b3R5cGUuY3JhaXNlPWZ1bmN0aW9uKGEpe2lmKGEuZXhjKXt2YXIgYj1cbnRoaXMuX2dyKFwiZXhjXCIsdGhpcy52ZXhwcihhLmV4YykpLGM9dGhpcy5uZXdCbG9jayhcImV4Y2VwdGlvbiBub3cgaW5zdGFudGlhdGVkXCIpLGQ9dGhpcy5fZ3IoXCJpc2NsYXNzXCIsYitcIi5wcm90b3R5cGUgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIik7dGhpcy5fanVtcGZhbHNlKGQsYyk7YS5pbnN0PyhkPXRoaXMuX2dyKFwiaW5zdFwiLHRoaXMudmV4cHIoYS5pbnN0KSksbChcImlmKCEoXCIsZCxcIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKSB7XCIsZCxcIj0gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1wiLGQsXCJdKTtcIixcIn1cIiksbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYixcIixcIixkLFwiLnYpO1wiKSk6bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKFwiLGIsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChiLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtsKFwiaWYgKFwiLGIsXG5cIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikge3Rocm93IFwiLGIsXCI7fSBlbHNlIHt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoJ2V4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uJyk7fTtcIil9ZWxzZSBsKFwidGhyb3cgJGVycjtcIil9O2EucHJvdG90eXBlLm91dHB1dEZpbmFsbHlDYXNjYWRlPWZ1bmN0aW9uKGEpe2lmKDA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aClsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7IGlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nKSB7IHJldHVybiAkcG9zdGZpbmFsbHkucmV0dXJuaW5nOyB9IGVsc2UgeyAkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7ICRwb3N0ZmluYWxseT11bmRlZmluZWQ7IGNvbnRpbnVlOyB9IH1cIik7ZWxzZXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7XCIsXCJpZiAoJHBvc3RmaW5hbGx5LnJldHVybmluZ1wiLFxuYi5icmVha0RlcHRoPT1hLmJyZWFrRGVwdGg/XCJ8fCAkcG9zdGZpbmFsbHkuaXNCcmVha1wiOlwiXCIsXCIpIHtcIixcIiRibGs9XCIsYi5ibGssXCI7Y29udGludWU7XCIsXCJ9IGVsc2Uge1wiLFwiJGJsaz0kcG9zdGZpbmFsbHkuZ290b0Jsb2NrOyRwb3N0ZmluYWxseT11bmRlZmluZWQ7Y29udGludWU7XCIsXCJ9XCIsXCJ9XCIpfX07YS5wcm90b3R5cGUuY3RyeT1mdW5jdGlvbihhKXt2YXIgYixjPWEuaGFuZGxlcnMubGVuZ3RoO2lmKGEuZmluYWxib2R5KXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwiZmluYWxib2R5XCIpO3ZhciBlPXRoaXMubmV3QmxvY2soXCJmaW5hbGV4aFwiKTt2YXIgZj10aGlzLl9ncihcImZpbmFsbHlfcmVyYWlzZVwiLFwidW5kZWZpbmVkXCIpO3RoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTt0aGlzLnNldHVwRXhjZXB0KGUpfXZhciBtPVtdO2ZvcihiPTA7YjxjOysrYiltLnB1c2godGhpcy5uZXdCbG9jayhcImV4Y2VwdF9cIitcbmIrXCJfXCIpKTt2YXIgcT10aGlzLm5ld0Jsb2NrKFwidW5oYW5kbGVkXCIpO3ZhciBCPXRoaXMubmV3QmxvY2soXCJvcmVsc2VcIik7dmFyIEQ9dGhpcy5uZXdCbG9jayhcImVuZFwiKTswIT1tLmxlbmd0aCYmdGhpcy5zZXR1cEV4Y2VwdChtWzBdKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7MCE9bS5sZW5ndGgmJnRoaXMuZW5kRXhjZXB0KCk7dGhpcy5fanVtcChCKTtmb3IoYj0wO2I8YzsrK2Ipe3RoaXMuc2V0QmxvY2sobVtiXSk7dmFyIEU9YS5oYW5kbGVyc1tiXTtpZighRS50eXBlJiZiPGMtMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdFwiLHRoaXMuZmlsZW5hbWUsRS5saW5lbm8pO2lmKEUudHlwZSl7dmFyIEY9dGhpcy52ZXhwcihFLnR5cGUpO3ZhciBNPWI9PWMtMT9xOm1bYisxXTtGPXRoaXMuX2dyKFwiaW5zdGFuY2VcIixcIlNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoJGVyciwgXCIsRixcIikpXCIpO1xudGhpcy5fanVtcGZhbHNlKEYsTSl9RS5uYW1lJiZ0aGlzLnZleHByKEUubmFtZSxcIiRlcnJcIik7dGhpcy52c2Vxc3RtdChFLmJvZHkpO3RoaXMuX2p1bXAoRCl9dGhpcy5zZXRCbG9jayhxKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhCKTt0aGlzLnZzZXFzdG10KGEub3JlbHNlKTt0aGlzLl9qdW1wKEQpO3RoaXMuc2V0QmxvY2soRCk7YS5maW5hbGJvZHkmJih0aGlzLmVuZEV4Y2VwdCgpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhlKSxsKGYsXCI9JGVycjtcIiksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGQpLHRoaXMucG9wRmluYWxseUJsb2NrKCksdGhpcy52c2Vxc3RtdChhLmZpbmFsYm9keSksbChcImlmKFwiLGYsXCIhPT11bmRlZmluZWQpIHsgdGhyb3cgXCIsZixcIjt9XCIpLHRoaXMub3V0cHV0RmluYWxseUNhc2NhZGUoaCkpfTthLnByb3RvdHlwZS5jd2l0aD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJ3aXRoZXhoXCIpLGQ9dGhpcy5uZXdCbG9jayhcIndpdGh0aWR5dXBcIiksXG5lPXRoaXMubmV3QmxvY2soXCJ3aXRoY2FycnlvblwiKTt2YXIgZj10aGlzLl9ncihcIm1nclwiLHRoaXMudmV4cHIoYS5pdGVtc1tiXS5jb250ZXh0X2V4cHIpKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZXhpdCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZz10aGlzLl9ncihcImV4aXRcIixcIiRyZXRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZyk7bChcIiRyZXQgPSBTay5hYnN0ci5sb29rdXBTcGVjaWFsKFwiLGYsXCIsU2suYnVpbHRpbi5zdHIuJGVudGVyKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KCRyZXQpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcInZhbHVlXCIsXCIkcmV0XCIpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtXG4xXTt0aGlzLnNldHVwRXhjZXB0KGMpO2EuaXRlbXNbYl0ub3B0aW9uYWxfdmFycyYmdGhpcy5uYW1lb3AoYS5pdGVtc1tiXS5vcHRpb25hbF92YXJzLmlkLFNrLmFzdG5vZGVzLlN0b3JlLGYpO2IrMTxhLml0ZW1zLmxlbmd0aD90aGlzLmN3aXRoKGEsYisxKTp0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soYyk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixnLFwiLHVuZGVmaW5lZCxTay5idWlsdGluLmdldEV4Y0luZm8oJGVyciksdW5kZWZpbmVkLFtdKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3RoaXMuX2p1bXB0cnVlKFwiJHJldFwiLGUpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKGQpO3RoaXMucG9wRmluYWxseUJsb2NrKCk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsZyxcIixbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtcIik7XG50aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSl9O2EucHJvdG90eXBlLmNhc3NlcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52ZXhwcihhLnRlc3QpLGM9dGhpcy5uZXdCbG9jayhcImVuZFwiKTt0aGlzLl9qdW1wdHJ1ZShiLGMpO2woXCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcihcIixhLm1zZz90aGlzLnZleHByKGEubXNnKTpcIlwiLFwiKTtcIik7dGhpcy5zZXRCbG9jayhjKX07YS5wcm90b3R5cGUuY2ltcG9ydGFzPWZ1bmN0aW9uKGEsYixjKXthPWEudjt2YXIgZD1hLmluZGV4T2YoXCIuXCIpLGU9YztpZigtMSE9PWQpZm9yKGE9YS5zdWJzdHIoZCsxKTstMSE9PWQ7KWQ9YS5pbmRleE9mKFwiLlwiKSxjPS0xIT09ZD9hLnN1YnN0cigwLGQpOmEsZT10aGlzLl9ncihcImxhdHRyXCIsXCJTay5hYnN0ci5nYXR0cihcIixlLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoJ1wiLGMsXCInKSlcIiksYT1cbmEuc3Vic3RyKGQrMSk7cmV0dXJuIHRoaXMubmFtZW9wKGIsU2suYXN0bm9kZXMuU3RvcmUsZSl9O2EucHJvdG90eXBlLmNpbXBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8YzsrK2Ipe3ZhciBkPWEubmFtZXNbYl07bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsZC5uYW1lLiRyKCkudixcIiwkZ2JsLCRsb2MsW10sXCIsU2suX19mdXR1cmVfXy5hYnNvbHV0ZV9pbXBvcnQ/MDotMSxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZT10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtpZihkLmFzbmFtZSl0aGlzLmNpbXBvcnRhcyhkLm5hbWUsZC5hc25hbWUsZSk7ZWxzZXt2YXIgZj1kLm5hbWU7ZD1mLnYuaW5kZXhPZihcIi5cIik7LTEhPT1kJiYoZj1uZXcgU2suYnVpbHRpbi5zdHIoZi52LnN1YnN0cigwLGQpKSk7dGhpcy5uYW1lb3AoZixTay5hc3Rub2Rlcy5TdG9yZSxlKX19fTthLnByb3RvdHlwZS5jZnJvbWltcG9ydD1cbmZ1bmN0aW9uKGEpe3ZhciBjLGQ9YS5uYW1lcy5sZW5ndGg7dmFyIGU9W107dmFyIGY9YS5sZXZlbDswIT1mfHxTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydHx8KGY9LTEpO2ZvcihjPTA7YzxkOysrYyllW2NdPVwiJ1wiK2IoYS5uYW1lc1tjXS5uYW1lLnYpK1wiJ1wiO2woXCIkcmV0ID0gU2suYnVpbHRpbi5fX2ltcG9ydF9fKFwiLGEubW9kdWxlLiRyKCkudixcIiwkZ2JsLCRsb2MsW1wiLGUsXCJdLFwiLGYsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtmb3IoYz0wO2M8ZDsrK2Mpe2U9YS5uYW1lc1tjXTt2YXIgaD1cIidcIitlLm5hbWUuditcIidcIjtpZigwPT09YyYmXCIqXCI9PT1lLm5hbWUudil7U2suYXNzZXJ0cy5hc3NlcnQoMT09PWQpO2woXCJTay5pbXBvcnRTdGFyKFwiLGYsXCIsJGxvYywgJGdibCk7XCIpO2JyZWFrfXZhciBtPXRoaXMuX2dyKFwiaXRlbVwiLFwiU2suYWJzdHIuZ2F0dHIoXCIsZixcIiwgbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGgsXG5cIiksIHVuZGVmaW5lZClcIik7aD1lLm5hbWU7ZS5hc25hbWUmJihoPWUuYXNuYW1lKTt0aGlzLm5hbWVvcChoLFNrLmFzdG5vZGVzLlN0b3JlLG0pfX07YS5wcm90b3R5cGUuYnVpbGRjb2Rlb2JqPWZ1bmN0aW9uKGEsYyxmLGssaCxtKXt2YXIgZD1bXSxnPVtdLG49W10scD1bXSxxPW51bGwsdT1udWxsO2YmJihnPXRoaXMudnNlcWV4cHIoZikpO2smJmsuZGVmYXVsdHMmJihuPXRoaXMudnNlcWV4cHIoay5kZWZhdWx0cykpO2smJmsua3dfZGVmYXVsdHMmJihwPWsua3dfZGVmYXVsdHMubWFwKGE9PmE/dGhpcy52ZXhwcihhKTpcInVuZGVmaW5lZFwiKSk7ayYmay52YXJhcmcmJihxPWsudmFyYXJnKTtrJiZrLmt3YXJnJiYodT1rLmt3YXJnKTtpZighU2suX19mdXR1cmVfXy5weXRob24zJiZrJiZrLmt3b25seWFyZ3MmJjAhPWsua3dvbmx5YXJncy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJLZXl3b3JkLW9ubHkgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO1xudmFyIEY9dGhpcy5lbnRlclNjb3BlKGMsYSxhLmxpbmVubyx0aGlzLmNhblN1c3BlbmQpO2Y9dGhpcy51LnN0ZS5nZW5lcmF0b3I7dmFyIE09dGhpcy51LnN0ZS5oYXNGcmVlO3ZhciBWPXRoaXMudS5zdGUuY2hpbGRIYXNGcmVlO3ZhciB5PXRoaXMubmV3QmxvY2soXCJjb2Rlb2JqIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK0YrXCI9KGZ1bmN0aW9uIFwiK3RoaXMubmljZU5hbWUoYy52KStcIiQoXCI7dmFyIEc9W107aWYoZil7aWYodSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKToga2V5d29yZCBhcmd1bWVudHMgaW4gZ2VuZXJhdG9ycyBub3Qgc3VwcG9ydGVkXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7aWYocSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKTogdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtHLnB1c2goXCIkZ2VuXCIpfWVsc2V7dSYmXG4oRy5wdXNoKFwiJGt3YVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRrd2FcIikpO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHLnB1c2godGhpcy5uYW1lb3Aoay5hcmdzW2FdLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZhPGsua3dvbmx5YXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmt3b25seWFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7cSYmRy5wdXNoKHRoaXMubmFtZW9wKGsudmFyYXJnLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpfWxldCBMPSFmO00mJihMfHxHLnB1c2goXCIkZnJlZVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRmcmVlXCIpKTt0aGlzLnUucHJlZml4Q29kZT1MP3RoaXMudS5wcmVmaXhDb2RlK1wiJHBvc2FyZ3MsJGt3YXJnc1wiOnRoaXMudS5wcmVmaXhDb2RlK0cuam9pbihcIixcIik7dGhpcy51LnByZWZpeENvZGUrPVwiKXtcIjtmJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZ2VuZXJhdG9yXFxuXCIpO1xuTSYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBmcmVlXFxuXCIpO1YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBoYXMgY2VsbFxcblwiKTtMJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZmFzdCBjYWxsXFxuXCIpO3ZhciBUPVwie31cIjtmJiYoeT1cIiRnZW4uZ2kkcmVzdW1lYXRcIixUPVwiJGdlbi5naSRsb2NhbHNcIik7YT1cIiwkY2VsbD17fVwiO1YmJmYmJihhPVwiLCRjZWxsPSRnZW4uZ2kkY2VsbHNcIik7dGhpcy51LnZhckRlY2xzQ29kZSs9XCJ2YXIgJGJsaz1cIit5K1wiLCRleGM9W10sJGxvYz1cIitUK2ErXCIsJGdibD1cIisoTD9cInRoaXMgJiYgdGhpcy5mdW5jX2dsb2JhbHNcIjpcInRoaXNcIikrKEwmJk0/XCIsJGZyZWU9dGhpcyAmJiB0aGlzLmZ1bmNfY2xvc3VyZVwiOlwiXCIpK1wiLCRlcnI9dW5kZWZpbmVkLCRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitGK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfSBlbHNlIHtcIjtpZihMKXt0aGlzLnUudmFyRGVjbHNDb2RlPXV8fHF8fGsmJmsua3dvbmx5YXJncyYmMCE9PWsua3dvbmx5YXJncy5sZW5ndGg/dGhpcy51LnZhckRlY2xzQ29kZStcIlxcbnZhciAkYXJncyA9IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXFxuXCI6dGhpcy51LnZhckRlY2xzQ29kZSsoXCJ2YXIgJGFyZ3MgPSAoKCEka3dhcmdzIHx8ICRrd2FyZ3MubGVuZ3RoPT09MCkgJiYgJHBvc2FyZ3MubGVuZ3RoPT09XCIrXG5HLmxlbmd0aCtcIikgPyAkcG9zYXJncyA6IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXCIpO2ZvcihhPTA7YTxHLmxlbmd0aDthKyspdGhpcy51LnZhckRlY2xzQ29kZSs9XCIsXCIrR1thXStcIj0kYXJnc1tcIithK1wiXVwiO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiO1xcblwifWlmKGYmJjA8bi5sZW5ndGgpZm9yKHk9ay5hcmdzLmxlbmd0aC1uLmxlbmd0aCxhPTA7YTxuLmxlbmd0aDsrK2EpRz10aGlzLm5hbWVvcChrLmFyZ3NbYSt5XS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYoXCIrRytcIj09PXVuZGVmaW5lZClcIitHK1wiPVwiK0YrXCIuJGRlZmF1bHRzW1wiK2ErXCJdO1wiO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHPWsuYXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZcbmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRz1rLmt3b25seWFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtxJiZ0aGlzLmlzQ2VsbChxLmFyZykmJihhPWIoZSh0aGlzLnUucHJpdmF0ZV8scS5hcmcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrYStcIj1cIithK1wiO1wiKTt1JiYodGhpcy51LmxvY2FsbmFtZXMucHVzaCh1LmFyZy52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz11LmFyZy52K1wiPW5ldyBTay5idWlsdGluc1snZGljdCddKCRrd2EpO1wiLHRoaXMuaXNDZWxsKHUuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyx1LmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIn1cIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJm0mJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiJGdibC5fX2NsYXNzX189JGdibC5cIittLnYrXCI7XCIpO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9IH1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfX0pO1wiO2guY2FsbCh0aGlzLEYpO2lmKGspe2ZvcihsZXQgYSBvZiBrLmFyZ3MpZC5wdXNoKGEuYXJnLnYpO1xuZm9yKGxldCBhIG9mIGsua3dvbmx5YXJnc3x8W10pZC5wdXNoKGEuYXJnLnYpO3RoaXMudS5hcmduYW1lcz1kfXRoaXMuZXhpdFNjb3BlKCk7MDxuLmxlbmd0aCYmbChGLFwiLiRkZWZhdWx0cz1bXCIsbi5qb2luKFwiLFwiKSxcIl07XCIpO2smJmsua3dvbmx5YXJncyYmMDxrLmt3b25seWFyZ3MubGVuZ3RoJiYobChGLFwiLmNvX2FyZ2NvdW50PVwiLGsuYXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi5jb19rd29ubHlhcmdjb3VudD1cIixrLmt3b25seWFyZ3MubGVuZ3RoLFwiO1wiKSxsKEYsXCIuJGt3ZGVmcz1bXCIscC5qb2luKFwiLFwiKSxcIl07XCIpKTswPGQubGVuZ3RoP2woRixcIi5jb192YXJuYW1lcz1bJ1wiLGQuam9pbihcIicsJ1wiKSxcIiddO1wiKTpsKEYsXCIuY29fdmFybmFtZXM9W107XCIpO3UmJmwoRixcIi5jb19rd2FyZ3M9MTtcIik7cSYmbChGLFwiLmNvX3ZhcmFyZ3M9MTtcIik7Znx8bChGLFwiLmNvX2Zhc3RjYWxsPTE7XCIpO2g9XCJcIjtNJiYoaD1cIiwkY2VsbFwiLChtPXRoaXMudS5zdGUuaGFzRnJlZSkmJihoKz1cIiwkZnJlZVwiKSk7XG5pZihmKXJldHVybiBrJiYwPGsuYXJncy5sZW5ndGg/dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe3ZhciAkb3JpZ2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJcIixjLnYsJ1wiLGFyZ3VtZW50cy5sZW5ndGgsJyxrLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLFwiLFwiLGsuYXJncy5sZW5ndGgsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCwkb3JpZ2FyZ3NcIixoLFwiKTt9KSlcIik6dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudixcIlxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCxbXVwiLGgsXCIpO30pKVwiKTtpZigwPGcubGVuZ3RoKXtsKFwiJHJldCA9IG5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixcbkYsXCIsJGdibFwiLGgsXCIpO1wiKTtmb3IobGV0IGEgb2YgZy5yZXZlcnNlKCkpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIixbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTtyZXR1cm4gdGhpcy5fZ3IoXCJmdW5jb2JqXCIsXCIkcmV0XCIpfXJldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIm5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixGLFwiLCRnYmxcIixoLFwiKVwiKX07YS5wcm90b3R5cGUuY2Z1bmN0aW9uPWZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmKTtiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsYS5uYW1lLGEuZGVjb3JhdG9yX2xpc3QsYS5hcmdzLGZ1bmN0aW9uKGIpe3RoaXMudnNlcXN0bXQoYS5ib2R5KTtsKFwicmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcIil9LGIpO3RoaXMubmFtZW9wKGEubmFtZSxTay5hc3Rub2Rlcy5TdG9yZSxiKX07YS5wcm90b3R5cGUuY2xhbWJkYT1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5MYW1iZGEpO3JldHVybiB0aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxsYW1iZGE+XCIpLG51bGwsYS5hcmdzLGZ1bmN0aW9uKGIpe2I9dGhpcy52ZXhwcihhLmJvZHkpO2woXCJyZXR1cm4gXCIsYixcIjtcIil9KX07YS5wcm90b3R5cGUuY2lmZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJuZXh0IG9mIGlmZXhwXCIpLGM9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZmV4cFwiKSxkPXRoaXMuX2dyKFwicmVzXCIsXCJudWxsXCIpLGU9dGhpcy52ZXhwcihhLnRlc3QpO3RoaXMuX2p1bXBmYWxzZShlLGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEuYm9keSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhiKTtsKGQsXCI9XCIsdGhpcy52ZXhwcihhLm9yZWxzZSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2dlbmV4cGdlbj1cbmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwic3RhcnQgZm9yIFwiK2IpLGU9dGhpcy5uZXdCbG9jayhcInNraXAgZm9yIFwiK2IpO3RoaXMubmV3QmxvY2soXCJpZiBjbGVhbnVwIGZvciBcIitiKTt2YXIgZj10aGlzLm5ld0Jsb2NrKFwiZW5kIGZvciBcIitiKSxnPWFbYl07aWYoMD09PWIpdmFyIGg9XCIkbG9jLiRpdGVyMFwiO2Vsc2V7dmFyIG09dGhpcy52ZXhwcihnLml0ZXIpO2g9XCIkbG9jLlwiK3RoaXMuZ2Vuc3ltKFwiaXRlclwiKTtsKGgsXCI9XCIsXCJTay5hYnN0ci5pdGVyKFwiLG0sXCIpO1wiKX10aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5hbm5vdGF0ZVNvdXJjZShjKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGgsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihjKTttPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYobSxmKTt0aGlzLnZleHByKGcudGFyZ2V0LFxubSk7dmFyIG49Zy5pZnM/Zy5pZnMubGVuZ3RoOjA7Zm9yKGg9MDtoPG47KytoKXRoaXMuYW5ub3RhdGVTb3VyY2UoZy5pZnNbaF0pLG09dGhpcy52ZXhwcihnLmlmc1toXSksdGhpcy5fanVtcGZhbHNlKG0sZCk7KytiPGEubGVuZ3RoJiZ0aGlzLmNnZW5leHBnZW4oYSxiLGMpO2I+PWEubGVuZ3RoJiYodGhpcy5hbm5vdGF0ZVNvdXJjZShjKSxhPXRoaXMudmV4cHIoYyksbChcInJldHVybiBbXCIsZSxcIi8qcmVzdW1lKi8sXCIsYSxcIi8qcmV0Ki9dO1wiKSx0aGlzLnNldEJsb2NrKGUpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZik7MT09PWImJmwoXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX07YS5wcm90b3R5cGUuY2dlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxnZW5leHByPlwiKSxudWxsLG51bGwsZnVuY3Rpb24oYil7dGhpcy5jZ2VuZXhwZ2VuKGEuZ2VuZXJhdG9ycywwLGEuZWx0KX0pO2I9dGhpcy5fZ3IoXCJnZW5lclwiLFxuXCJTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoXCIsYixcIik7XCIpO2woYixcIi5naSRsb2NhbHMuJGl0ZXIwPVNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihhLmdlbmVyYXRvcnNbMF0uaXRlciksXCIpO1wiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2NsYXNzPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5DbGFzc0RlZik7dmFyIGI9dGhpcy52c2VxZXhwcihhLmRlY29yYXRvcl9saXN0KTt2YXIgYz10aGlzLnZzZXFleHByKGEuYmFzZXMpO3ZhciBkPXRoaXMuZW50ZXJTY29wZShhLm5hbWUsYSxhLmxpbmVubyk7dmFyIGU9dGhpcy5uZXdCbG9jayhcImNsYXNzIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2QrXCI9KGZ1bmN0aW9uICRcIithLm5hbWUuditcIiRjbGFzc19vdXRlcigkZ2xvYmFscywkbG9jYWxzLCRjZWxsKXt2YXIgJGdibD0kZ2xvYmFscywkbG9jPSRsb2NhbHM7JGZyZWU9JGdsb2JhbHM7XCI7dGhpcy51LnN3aXRjaENvZGUrPVxuXCIoZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJF9jbG9zdXJlKCRjZWxsKXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XCJ2YXIgJGJsaz1cIitlK1wiLCRleGM9W10sJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS5zd2l0Y2hDb2RlKz1cIndoaWxlKHRydWUpe3RyeXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVxuXCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9fWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fX1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9KS5jYWxsKG51bGwsICRjZWxsKTt9KTtcIjt0aGlzLnUucHJpdmF0ZV89YS5uYW1lO3RoaXMuY2JvZHkoYS5ib2R5LGEubmFtZSk7bChcInJldHVybjtcIik7dGhpcy5leGl0U2NvcGUoKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoJGdibCxcIixkLFwiLFwiLGEubmFtZS4kcigpLnYsXG5cIixbXCIsYyxcIl0sICRjZWxsKTtcIik7Zm9yKGxldCBhIG9mIGIpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIiwgWyRyZXRdKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY2NvbnRpbnVlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCInY29udGludWUnIG91dHNpZGUgbG9vcFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2E9dGhpcy51LmNvbnRpbnVlQmxvY2tzW3RoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgtMV07U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aD9cbmwoXCIkcG9zdGZpbmFsbHk9e2lzQnJlYWs6dHJ1ZSxnb3RvQmxvY2s6XCIsYSxcIn07XCIpOnRoaXMuX2p1bXAoYSl9O2EucHJvdG90eXBlLmNicmVhaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidicmVhaycgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuYnJlYWtCbG9ja3NbdGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aC0xXTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg/bChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUudnN0bXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnUubGluZW5vPWEubGluZW5vO3RoaXMudS5saW5lbm9TZXQ9ITE7dGhpcy51LmxvY2FsdGVtcHM9W107aWYoU2suZGVidWdnaW5nJiZcbnRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYz10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyk7bChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlYnVnJ30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2MrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITB9dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmNmdW5jdGlvbihhLGIpO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmNjbGFzcyhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJldHVybjppZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtjPWEudmFsdWU/dGhpcy52ZXhwcihhLnZhbHVlKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOzA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD9sKFwicmV0dXJuIFwiLGMsXCI7XCIpOihsKFwiJHBvc3RmaW5hbGx5PXtyZXR1cm5pbmc6XCIsYyxcIn07XCIpLHRoaXMuX2p1bXAodGhpcy5wZWVrRmluYWxseUJsb2NrKCkuYmxrKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy52c2VxZXhwcihhLnRhcmdldHMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzaWduOnZhciBkPWEudGFyZ2V0cy5sZW5ndGg7XG5jPXRoaXMudmV4cHIoYS52YWx1ZSk7Zm9yKGI9MDtiPGQ7KytiKXRoaXMudmV4cHIoYS50YXJnZXRzW2JdLGMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmM9dGhpcy52ZXhwcihhLnZhbHVlKTt0aGlzLnZleHByKGEudGFyZ2V0LGMpO3RoaXMudmV4cHIoYS5hbm5vdGF0aW9uKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjpyZXR1cm4gdGhpcy5jYXVnYXNzaWduKGEpO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6dGhpcy5jcHJpbnQoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6cmV0dXJuIHRoaXMuY2ZvcihhKTtjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnJldHVybiB0aGlzLmN3aGlsZShhKTtjYXNlIFNrLmFzdG5vZGVzLklmOnJldHVybiB0aGlzLmNpZihhKTtjYXNlIFNrLmFzdG5vZGVzLlJhaXNlOnJldHVybiB0aGlzLmNyYWlzZShhKTtjYXNlIFNrLmFzdG5vZGVzLlRyeTpyZXR1cm4gdGhpcy5jdHJ5KGEpO2Nhc2UgU2suYXN0bm9kZXMuV2l0aDpyZXR1cm4gdGhpcy5jd2l0aChhLFxuMCk7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6cmV0dXJuIHRoaXMuY2Fzc2VydChhKTtjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpyZXR1cm4gdGhpcy5jaW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTpyZXR1cm4gdGhpcy5jZnJvbWltcG9ydChhKTtjYXNlIFNrLmFzdG5vZGVzLkdsb2JhbDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52ZXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhc3M6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CcmVhazp0aGlzLmNicmVhayhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbnRpbnVlOnRoaXMuY2NvbnRpbnVlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVidWdnZXI6bChcImRlYnVnZ2VyO1wiKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIHZzdG10OiBcIitKU09OLnN0cmluZ2lmeShhKSl9fTthLnByb3RvdHlwZS52c2Vxc3RtdD1mdW5jdGlvbihhKXt2YXIgYjtcbmZvcihiPTA7YjxhLmxlbmd0aDsrK2IpdGhpcy52c3RtdChhW2JdKX07YS5wcm90b3R5cGUuaXNDZWxsPWZ1bmN0aW9uKGEpe2E9YihlKHRoaXMudS5wcml2YXRlXyxhKS52KTtyZXR1cm4gdGhpcy51LnN0ZS5nZXRTY29wZShhKT09PVNrLlNZTVRBQl9DT05TVFMuQ0VMTH07YS5wcm90b3R5cGUubmFtZW9wPWZ1bmN0aW9uKGEsYyxmKXtpZigoYz09PVNrLmFzdG5vZGVzLlN0b3JlfHxjPT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5EZWwpJiZcIl9fZGVidWdfX1wiPT09YS52KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fXCIsdGhpcy5maWxlbmFtZSx0aGlzLnUubGluZW5vKTtTay5hc3NlcnRzLmFzc2VydChcIk5vbmVcIiE9PWEudik7aWYoXCJOb3RJbXBsZW1lbnRlZFwiPT09YS52KXJldHVyblwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCRcIjt2YXIgZD1lKHRoaXMudS5wcml2YXRlXyxcbmEpLnY7ZD1iKGQpO3ZhciBnPTM7dmFyIGg9dGhpcy51LnN0ZS5nZXRTY29wZShkKTt2YXIgbT1udWxsO3N3aXRjaChoKXtjYXNlIFNrLlNZTVRBQl9DT05TVFMuRlJFRTptPVwiJGZyZWVcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkNFTEw6bT1cIiRjZWxsXCI7Zz0yO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5MT0NBTDp0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9ja3x8dGhpcy51LnN0ZS5nZW5lcmF0b3J8fChnPTApO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfSU1QTElDSVQ6dGhpcy51LnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJihnPTEpO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfRVhQTElDSVQ6Zz0xfVNrLmFzc2VydHMuYXNzZXJ0KGh8fFwiX1wiPT09YS52LmNoYXJBdCgxKSk7YT1kO3RoaXMudS5zdGUuZ2VuZXJhdG9yfHx0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVxuU2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrP2Q9XCIkbG9jLlwiK2Q6KDA9PT1nfHwzPT09ZykmJnRoaXMudS5sb2NhbG5hbWVzLnB1c2goZCk7c3dpdGNoKGcpe2Nhc2UgMDpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGwoXCJpZiAoXCIsZCxcIiA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yKCdsb2NhbCB2YXJpYWJsZSBcXFxcJ1wiLGQsXCJcXFxcJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50Jyk7IH1cXG5cIiksZDtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkXCIpfWJyZWFrO2Nhc2UgMzpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiB0aGlzLl9ncihcImxvYWRuYW1lXCIsZCxcblwiIT09dW5kZWZpbmVkP1wiLGQsXCI6U2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpO1wiKTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAxOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZGdibFwiLFwiU2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpXCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRnYmwuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlICRnYmwuXCIsYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2dsb2JhbFwiKX1icmVhaztjYXNlIDI6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbStcblwiLlwiK2E7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKG0sXCIuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBhO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9kZXJlZlwiKX1icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlXCIpfX07YS5wcm90b3R5cGUuZW50ZXJTY29wZT1mdW5jdGlvbihhLGIsZSxmKXt2YXIgZD1uZXcgYztkLnN0ZT10aGlzLnN0LmdldFN0c0ZvckFzdChiKTtkLm5hbWU9YTtkLmZpcnN0bGluZW5vPWU7ZC5jYW5TdXNwZW5kPWZ8fCExO3RoaXMudSYmdGhpcy51LnByaXZhdGVfJiYoZC5wcml2YXRlXz10aGlzLnUucHJpdmF0ZV8pO3RoaXMuc3RhY2sucHVzaCh0aGlzLnUpO3RoaXMuYWxsVW5pdHMucHVzaChkKTthPXRoaXMuZ2Vuc3ltKFwic2NvcGVcIik7ZC5zY29wZW5hbWU9YTt0aGlzLnU9ZDt0aGlzLnUuYWN0aXZhdGVTY29wZSgpO3RoaXMubmVzdGxldmVsKys7XG5yZXR1cm4gYX07YS5wcm90b3R5cGUuZXhpdFNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51O3RoaXMubmVzdGxldmVsLS07KHRoaXMudT0wPD10aGlzLnN0YWNrLmxlbmd0aC0xP3RoaXMuc3RhY2sucG9wKCk6bnVsbCkmJnRoaXMudS5hY3RpdmF0ZVNjb3BlKCk7aWYoXCI8bW9kdWxlPlwiIT09YS5uYW1lLnYpe3ZhciBiPWEubmFtZS4kcigpLnY7Yj1iLnN1YnN0cmluZygxLGIubGVuZ3RoLTEpO2woYS5zY29wZW5hbWUsXCIuY29fbmFtZT1uZXcgU2suYnVpbHRpbnNbJ3N0ciddKCdcIixiLFwiJyk7XCIpO3RoaXMuc3RhY2subGVuZ3RoJiZcImNsYXNzXCI9PXRoaXMudS5zdGUuYmxvY2tUeXBlJiZsKGEuc2NvcGVuYW1lLFwiLmNvX3F1YWxuYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiK3RoaXMudS5uYW1lLnYrXCIuXCIrYitcIicpO1wiKX1mb3IodmFyIGMgaW4gYS5jb25zdHMpYS5jb25zdHMuaGFzT3duUHJvcGVydHkoYykmJihhLnN1ZmZpeENvZGUrPWMrXCIgPSBcIithLmNvbnN0c1tjXStcIjtcIil9O1xuYS5wcm90b3R5cGUuY2JvZHk9ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKXRoaXMudnN0bXQoYVtjXSxiKX07YS5wcm90b3R5cGUuY3ByaW50PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5QcmludCk7YS5kZXN0JiZ0aGlzLnZleHByKGEuZGVzdCk7dmFyIGM9YS52YWx1ZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLnByaW50XyhcIixcIm5ldyBTay5idWlsdGluc1snc3RyJ10oXCIsdGhpcy52ZXhwcihhLnZhbHVlc1tiXSksXCIpLnYpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YS5ubCYmKGwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLCdcIlxcXFxuXCIpOycpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSl9O2EucHJvdG90eXBlLmNtb2Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbnRlclNjb3BlKG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGU+XCIpLFxuYSwwLHRoaXMuY2FuU3VzcGVuZCksYz10aGlzLm5ld0Jsb2NrKFwibW9kdWxlIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2IrXCI9KGZ1bmN0aW9uKCRmb3JjZWdibCl7XCI7dGhpcy51LnZhckRlY2xzQ29kZT1cInZhciAkZ2JsID0gJGZvcmNlZ2JsIHx8IHt9LCAkYmxrPVwiK2MrXCIsJGV4Yz1bXSwkbG9jPSRnYmwsJGNlbGw9e30sJGVycj11bmRlZmluZWQ7JGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7dmFyICRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmXG4odGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitiK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfWlmIChTay5yZXRhaW5HbG9iYWxzKSB7ICAgIGlmIChTay5nbG9iYWxzKSB7ICRnYmwgPSBTay5nbG9iYWxzOyBTay5nbG9iYWxzID0gJGdibDsgJGxvYyA9ICRnYmw7IH0gICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgJGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7fSAgICBlbHNlIHsgU2suZ2xvYmFscyA9ICRnYmw7IH19IGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfVwiO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO1xudGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19IH0gfSk7XCI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTW9kdWxlOnRoaXMuY2JvZHkoYS5ib2R5KTtsKFwicmV0dXJuICRsb2M7XCIpO2JyZWFrO1xuZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvOyB1bmhhbmRsZWQgY2FzZSBpbiBjb21waWxlck1vZFwiKX10aGlzLmV4aXRTY29wZSgpO3RoaXMucmVzdWx0LnB1c2godGhpcy5vdXRwdXRBbGxVbml0cygpKTtyZXR1cm4gYn07U2suY29tcGlsZT1mdW5jdGlvbihiLGMsZSxmKXtlPVNrLl9fZnV0dXJlX187U2suX19mdXR1cmVfXz1PYmplY3QuY3JlYXRlKFNrLl9fZnV0dXJlX18pO3ZhciBkPVNrLnBhcnNlKGMsYiksZz1Tay5hc3RGcm9tUGFyc2UoZC5jc3QsYyxkLmZsYWdzKTtkPWQuZmxhZ3M7dmFyIGg9U2suc3ltYm9sdGFibGUoZyxjKTtiPW5ldyBhKGMsaCxkLGYsYik7Yz1iLmNtb2QoZyk7U2suX19mdXR1cmVfXz1lO3JldHVybntmdW5jbmFtZTpcIiRjb21waWxlZG1vZFwiLGNvZGU6XCIkY29tcGlsZWRtb2QgPSBmdW5jdGlvbigpIHtcIitiLnJlc3VsdC5qb2luKFwiXCIpK1wiXFxucmV0dXJuIFwiK2MrXCI7fSgpO1wifX07U2suZXhwb3J0U3ltYm9sKFwiU2suY29tcGlsZVwiLFNrLmNvbXBpbGUpO1xuU2sucmVzZXRDb21waWxlcj1mdW5jdGlvbigpe1NrLmdlbnN5bWNvdW50PTB9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnJlc2V0Q29tcGlsZXJcIixTay5yZXNldENvbXBpbGVyKTtTay5maXhSZXNlcnZlZD1iO1NrLmV4cG9ydFN5bWJvbChcIlNrLmZpeFJlc2VydmVkXCIsU2suZml4UmVzZXJ2ZWQpO1NrLnVuZml4UmVzZXJ2ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvX1xcJHJ3XFwkJC8sXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuZml4UmVzZXJ2ZWRcIixTay51bmZpeFJlc2VydmVkKTtTay5tYW5nbGVOYW1lPWU7U2suZXhwb3J0U3ltYm9sKFwiU2subWFuZ2xlTmFtZVwiLFNrLm1hbmdsZU5hbWUpO1NrLnJlc2VydmVkV29yZHNfPWg7U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXJ2ZWRXb3Jkc19cIixTay5yZXNlcnZlZFdvcmRzXyl9LGZ1bmN0aW9uKG0scSl7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWU9XG5mdW5jdGlvbihhLGMsYil7dmFyIGU9YS5yZXBsYWNlKC9cXC4vZyxcIi9cIiksZj1mdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC50cnlDYXRjaChmdW5jdGlvbigpe3JldHVybiBTay5yZWFkKGEpfSxmdW5jdGlvbihhKXt9KSxmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoe2ZpbGVuYW1lOmEsY29kZTpjLHBhY2thZ2VQYXRoOmJ9KX0pfTt2b2lkIDA9PT1iJiYoYj1Tay5yZWFsc3lzcGF0aCk7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoYi50cCRpdGVyKCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGYoYS52K1wiL1wiK2UrYywhMSksZnVuY3Rpb24oYil7cmV0dXJuIGI/YjpmKGEuditcIi9cIitlK1wiL19faW5pdF9fXCIrYyxhLnYrXCIvXCIrZSl9KX0pfTtTay5pbXBvcnRTZXRVcFBhdGg9ZnVuY3Rpb24oYSl7aWYoIVNrLnJlYWxzeXNwYXRoKXt2YXIgYz1bbmV3IFNrLmJ1aWx0aW4uc3RyKFwic3JjL2J1aWx0aW5cIiksXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvbGliXCIpLG5ldyBTay5idWlsdGluLnN0cihcIi5cIildO2ZvcihhPTA7YTxTay5zeXNwYXRoLmxlbmd0aDsrK2EpYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihTay5zeXNwYXRoW2FdKSk7U2sucmVhbHN5c3BhdGg9bmV3IFNrLmJ1aWx0aW4ubGlzdChjKX19O1NrLmltcG9ydE1vZHVsZUludGVybmFsXz1mdW5jdGlvbihhLGMsYixlLGYsbCxoKXt2YXIgZCxnLG0sayxwPW51bGwscT12b2lkIDAhPT1mP2YudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk6dm9pZCAwLEE9dm9pZCAwIT09cT9xLnYrXCIuXCI6XCJcIix0PXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRwYXRoKTp2b2lkIDA7U2suaW1wb3J0U2V0VXBQYXRoKGgpO2lmKGYmJiFxKXtpZihsKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHRvIGltcG9ydCByZWxhdGl2ZSB0byBpbnZhbGlkIHBhY2thZ2UgKG5vIG5hbWUpXCIpO1xufXZvaWQgMD09PWImJihiPUErYSk7dmFyIHY9YS5zcGxpdChcIi5cIik7aWYoMTx2Lmxlbmd0aCl7dmFyIEI9di5zbGljZSgwLHYubGVuZ3RoLTEpLmpvaW4oXCIuXCIpO3A9U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKEIsYyx2b2lkIDAsdm9pZCAwLGYsbCxoKX12YXIgRD1Tay5taXNjZXZhbC5jaGFpbihwLGZ1bmN0aW9uKG4pe3A9bjtnPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihiKSk7cmV0dXJuIHZvaWQgMCE9PWc/cHx8ZzpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYj1hO2lmKDE8di5sZW5ndGgpe2lmKCFwKXJldHVybjttPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihBK0IpKTtiPXZbdi5sZW5ndGgtMV07dD1tLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpfWs9bmV3IFNrLmJ1aWx0aW4ubW9kdWxlO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZSl7ZD1hK1wiLnB5XCI7dmFyIGM9XG5Tay5jb21waWxlKGUsZCxcImV4ZWNcIixoKX1lbHNlIGM9U2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoU2sub25CZWZvcmVJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkJlZm9yZUltcG9ydClyZXR1cm4gU2sub25CZWZvcmVJbXBvcnQoYSl9LGZ1bmN0aW9uKGMpe2lmKCExPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIkltcG9ydGluZyBcIithK1wiIGlzIG5vdCBhbGxvd2VkXCIpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihjKTtyZXR1cm4gU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcIi5qc1wiLHQpfSxmdW5jdGlvbihhKXtyZXR1cm4gYT97ZnVuY25hbWU6XCIkYnVpbHRpbm1vZHVsZVwiLGNvZGU6YS5jb2RlLGZpbGVuYW1lOmEuZmlsZW5hbWUscGFja2FnZVBhdGg6YS5wYWNrYWdlUGF0aH06U2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcblwiLnB5XCIsdCksZnVuY3Rpb24oYil7aWYoYT1iKXJldHVybiBTay5jb21waWxlKGEuY29kZSxhLmZpbGVuYW1lLFwiZXhlY1wiLGgpfSxmdW5jdGlvbihiKXtpZihiKXJldHVybiBiLnBhY2thZ2VQYXRoPWEucGFja2FnZVBhdGgsYn0pfSk7cmV0dXJuIGN9LGZ1bmN0aW9uKGEpe2lmKGEpe1NrLnN5c21vZHVsZXMubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoYiksayk7dmFyIGU9ay4kanM9YS5jb2RlO251bGw9PWQmJihkPWEuZmlsZW5hbWUpO251bGwhPVNrLmRhdGVTZXQmJlNrLmRhdGVTZXR8fChlPVwiU2suZXhlY1N0YXJ0ID0gU2subGFzdFlpZWxkID0gbmV3IERhdGUoKTtcXG5cIithLmNvZGUsU2suZGF0ZVNldD0hMCk7aWYoYyl7dmFyIGY9ZnVuY3Rpb24oYSl7dmFyIGIsYz1Tay5qc19iZWF1dGlmeShhKS5zcGxpdChcIlxcblwiKTtmb3IoYj0xO2I8PWMubGVuZ3RoOysrYil7dmFyIGQ9KFwiXCIrYikubGVuZ3RoO2ZvcihhPVwiXCI7NT5kOysrZClhKz1cIiBcIjtjW2ItMV09XCIvKiBcIitcbmErYitcIiAqLyBcIitjW2ItMV19cmV0dXJuIGMuam9pbihcIlxcblwiKX07ZT1mKGUpO1NrLmRlYnVnb3V0KGUpfWUrPVwiXFxuXCIrYS5mdW5jbmFtZStcIjtcIjtlPVNrLmdsb2JhbC5ldmFsKGUpO2suJGQ9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihiKSxfX2RvY19fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxfX3BhY2thZ2VfXzphLnBhY2thZ2VQYXRoP25ldyBTay5idWlsdGluLnN0cihiKTpCP25ldyBTay5idWlsdGluLnN0cihBK0IpOnE/cTpTay5idWlsdGluLm5vbmUubm9uZSR9O2EucGFja2FnZVBhdGgmJihrLiRkLl9fcGF0aF9fPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYS5wYWNrYWdlUGF0aCldKSk7cmV0dXJuIGUoay4kZCl9fSxmdW5jdGlvbihiKXt2YXIgYztpZih2b2lkIDA9PT1iKXtpZihsJiYhcClyZXR1cm47dGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoXCJObyBtb2R1bGUgbmFtZWQgXCIrYSk7fWlmKGIhPT1rLiRkKXtmb3IoYyBpbiBrLiRkKWJbY118fFxuKGJbY109ay4kZFtjXSk7ay4kZD1ifWlmKFNrLm9uQWZ0ZXJJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkFmdGVySW1wb3J0KXRyeXtTay5vbkFmdGVySW1wb3J0KGEpfWNhdGNoKFYpe31pZihwKXJldHVybiBtLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKHZbdi5sZW5ndGgtMV0pLGspLHA7ZiYmZi50cCRzZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihhKSxrKTtyZXR1cm4ga30pfSk7cmV0dXJuIGg/RDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coRCl9O1NrLmltcG9ydE1vZHVsZT1mdW5jdGlvbihhLGMsYil7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW49ZnVuY3Rpb24oYSxjLGIpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD1cbnZvaWQgMDtTay5yZXNldENvbXBpbGVyKCk7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsXCJfX21haW5fX1wiLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9dm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsYix2b2lkIDAsITEsZSl9O1NrLmltcG9ydEJ1aWx0aW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fYnVpbHRpbl9fLlwiK2EsYix2b2lkIDAsITEsZSl9O1NrLmJ1aWx0aW4uX19pbXBvcnRfXz1mdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsPVNrLmdsb2JhbHMsaDt2b2lkIDA9PT1mJiYoZj1Tay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD9cbjA6LTEpO2lmKDAhPT1mJiZjLl9fcGFja2FnZV9fJiZjLl9fcGFja2FnZV9fIT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZigoaD1jLl9fcGFja2FnZV9fLnYpJiYwPGYpe2M9aC5zcGxpdChcIi5cIik7aWYoZi0xPj1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wbGV2ZWwgcGFja2FnZVwiKTtjLmxlbmd0aC09Zi0xO2g9Yy5qb2luKFwiLlwiKX12YXIgZD1Tay5zeXNtb2R1bGVzLnF1aWNrJGxvb2t1cChuZXcgU2suYnVpbHRpbi5zdHIoaCkpfWlmKDA8ZiYmdm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZVwiKTthLnNwbGl0KFwiLlwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoMCE9PWYmJnZvaWQgMCE9PWQpcmV0dXJuXCJcIj09PWE/ZDpTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxcbnZvaWQgMCxoK1wiLlwiK2Esdm9pZCAwLGQsLTE9PWYsITApfSxmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwPT09Yj8oaD1kPXZvaWQgMCxTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsITApKTpifSxmdW5jdGlvbihiKXtpZihlJiYwIT09ZS5sZW5ndGgpe3ZhciBjO3ZhciBkPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cigoaHx8XCJcIikrKGgmJmE/XCIuXCI6XCJcIikrYSkpO2ZvcihiPTA7YjxlLmxlbmd0aDtiKyspe3ZhciBmPWVbYl07XCIqXCIhPWYmJnZvaWQgMD09PWQudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoZikpJiYoYz1Tay5taXNjZXZhbC5jaGFpbihjLFNrLmltcG9ydE1vZHVsZUludGVybmFsXy5iaW5kKG51bGwsZix2b2lkIDAsdm9pZCAwLHZvaWQgMCxkLCEwLCEwKSkpfXJldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoZCk7cmV0dXJuIGR9KX1yZXR1cm4gYn0sXG5mdW5jdGlvbihhKXtsIT09U2suZ2xvYmFscyYmKFNrLmdsb2JhbHM9bCk7cmV0dXJuIGF9KX07U2suaW1wb3J0U3Rhcj1mdW5jdGlvbihhLGMsYil7aWYoYj1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hbGxfX1wiKSkpZm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYiksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSljW2Yudl09U2suYWJzdHIuZ2F0dHIoYSxmKTtlbHNle2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYS4kZCk7Zm9yKGxldCBlIGluIGIpXCJfXCIhPWJbZV0uY2hhckF0KDApJiYoY1tiW2VdXT1hLiRkW2JbZV1dKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5cIixTay5pbXBvcnRNYWluKTtTay5leHBvcnRTeW1ib2woXCJTay5pbXBvcnRNYWluV2l0aEJvZHlcIixTay5pbXBvcnRNYWluV2l0aEJvZHkpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keVwiLFNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLl9faW1wb3J0X19cIixTay5idWlsdGluLl9faW1wb3J0X18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydFN0YXJcIixTay5pbXBvcnRTdGFyKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnRpbVNvcnQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3Q9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3RoaXMuTUlOX0dBTExPUD03O3RoaXMubGlzdGxlbmd0aD1jP2M6YS5zcSRsZW5ndGgoKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sdD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFwiTHRcIil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubGU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hdGhpcy5sdChjLGEpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmJpbmFyeV9zb3J0PVxuZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYj1hLmJhc2UrYztiPGEuYmFzZSthLmxlbjtiKyspe3ZhciBlPWEuYmFzZTt2YXIgZj1iO2ZvcihjPWEuZ2V0aXRlbShmKTtlPGY7KXt2YXIgbD1lKyhmLWU+PjEpO3RoaXMubHQoYyxhLmdldGl0ZW0obCkpP2Y9bDplPWwrMX1Tay5hc3NlcnRzLmFzc2VydChlPT09Zik7Zm9yKGw9YjtsPmU7bC0tKWEuc2V0aXRlbShsLGEuZ2V0aXRlbShsLTEpKTthLnNldGl0ZW0oZSxjKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuY291bnRfcnVuPWZ1bmN0aW9uKGEpe3ZhciBjO2lmKDE+PWEubGVuKXt2YXIgYj1hLmxlbjt2YXIgZT0hMX1lbHNlIGlmKGI9Mix0aGlzLmx0KGEuZ2V0aXRlbShhLmJhc2UrMSksYS5nZXRpdGVtKGEuYmFzZSkpKWZvcihlPSEwLGM9YS5iYXNlKzI7YzxhLmJhc2UrYS5sZW47YysrKWlmKHRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKSliKys7ZWxzZSBicmVhaztlbHNlIGZvcihlPSExLGM9YS5iYXNlK1xuMjtjPGEuYmFzZSthLmxlbiYmIXRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKTtjKyspYisrO3JldHVybntydW46bmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKGEubGlzdCxhLmJhc2UsYiksZGVzY2VuZGluZzplfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7dmFyIGEsYz1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LDAsdGhpcy5saXN0bGVuZ3RoKTtpZighKDI+Yy5sZW4pKXt0aGlzLm1lcmdlX2luaXQoKTtmb3IoYT10aGlzLm1lcmdlX2NvbXB1dGVfbWlucnVuKGMubGVuKTswPGMubGVuOyl7dmFyIGI9dGhpcy5jb3VudF9ydW4oYyk7Yi5kZXNjZW5kaW5nJiZiLnJ1bi5yZXZlcnNlKCk7aWYoYi5ydW4ubGVuPGEpe3ZhciBlPWIucnVuLmxlbjtiLnJ1bi5sZW49YTxjLmxlbj9hOmMubGVuO3RoaXMuYmluYXJ5X3NvcnQoYi5ydW4sZSl9Yy5hZHZhbmNlKGIucnVuLmxlbik7dGhpcy5wZW5kaW5nLnB1c2goYi5ydW4pO1xudGhpcy5tZXJnZV9jb2xsYXBzZSgpfVNrLmFzc2VydHMuYXNzZXJ0KGMuYmFzZT09dGhpcy5saXN0bGVuZ3RoKTt0aGlzLm1lcmdlX2ZvcmNlX2NvbGxhcHNlKCk7U2suYXNzZXJ0cy5hc3NlcnQoMT09dGhpcy5wZW5kaW5nLmxlbmd0aCk7U2suYXNzZXJ0cy5hc3NlcnQoMD09PXRoaXMucGVuZGluZ1swXS5iYXNlKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnBlbmRpbmdbMF0ubGVuPT10aGlzLmxpc3RsZW5ndGgpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5nYWxsb3A9ZnVuY3Rpb24oYSxjLGIsZSl7dmFyIGY7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxjLmxlbik7dmFyIGw9dGhpcztlPWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbC5sZShhLGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBsLmx0KGEsYil9O3ZhciBoPWMuYmFzZStiO3ZhciBkPTA7dmFyIGc9MTtpZihlKGMuZ2V0aXRlbShoKSxhKSl7Zm9yKGY9Yy5sZW4tYjtnPGY7KWlmKGUoYy5nZXRpdGVtKGgrZyksXG5hKSl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19ZWxzZSBicmVhaztnPmYmJihnPWYpO2QrPWI7Zys9Yn1lbHNle2ZvcihmPWIrMTtnPGYmJiFlKGMuZ2V0aXRlbShoLWcpLGEpOyl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19Zz5mJiYoZz1mKTtoPWItZDtkPWItZztnPWh9U2suYXNzZXJ0cy5hc3NlcnQoLTE8PWQ8Zzw9Yy5sZW4pO2ZvcihkKz0xO2Q8ZzspYj1kKyhnLWQ+PjEpLGUoYy5nZXRpdGVtKGMuYmFzZStiKSxhKT9kPWIrMTpnPWI7U2suYXNzZXJ0cy5hc3NlcnQoZD09Zyk7cmV0dXJuIGd9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfaW5pdD1mdW5jdGlvbigpe3RoaXMubWluX2dhbGxvcD10aGlzLk1JTl9HQUxMT1A7dGhpcy5wZW5kaW5nPVtdfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2xvPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZStcbmEubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1hLmJhc2U7YT1hLmNvcHlpdGVtcygpO3RyeXtpZih0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSksaCsrLDEhPWEubGVuJiYwIT09Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7OylpZih0aGlzLmx0KGMuZ2V0aXRlbShjLmJhc2UpLGEuZ2V0aXRlbShhLmJhc2UpKSl7dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha31lbHNle3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2I9dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZSksYSwwLCEwKTtmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKys7YS5hZHZhbmNlKGIpO2lmKDE+PVxuYS5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKTtoKys7aWYoMD09PWMubGVuKXJldHVybjtlPXRoaXMuZ2FsbG9wKGEuZ2V0aXRlbShhLmJhc2UpLGMsMCwhMSk7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2U7ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2MuYWR2YW5jZShlKTtpZigwPT09Yy5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEubGVuJiYwPD1jLmxlbik7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2MubGVuO2YrKyl0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpLGgrKztmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYS5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSksaCsrfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9oaT1cbmZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZSthLmxlbj09Yy5iYXNlKTt2YXIgbD10aGlzLm1pbl9nYWxsb3A7dmFyIGg9Yy5iYXNlK2MubGVuO2M9Yy5jb3B5aXRlbXMoKTt0cnl7aWYoaC0tLHRoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSksMCE9PWEubGVuJiYxIT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KXt2YXIgZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO3ZhciBnPWMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSk7aWYodGhpcy5sdChnLGQpKXtoLS07dGhpcy5zZXRpdGVtKGgsZCk7YS5sZW4tLTtpZigwPT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31lbHNle2gtLTt0aGlzLnNldGl0ZW0oaCxnKTtjLmxlbi0tO2lmKDE9PWMubGVuKXJldHVybjtlKys7Yj0wO2lmKGU+PWwpYnJlYWt9fWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Zz1jLmdldGl0ZW0oYy5iYXNlK1xuYy5sZW4tMSk7dmFyIG09dGhpcy5nYWxsb3AoZyxhLGEubGVuLTEsITApO2I9YS5sZW4tbTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpO2EubGVuLT1iO2lmKDA9PT1hLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGMucG9wcmlnaHQoKSk7aWYoMT09Yy5sZW4pcmV0dXJuO2Q9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTttPXRoaXMuZ2FsbG9wKGQsYyxjLmxlbi0xLCExKTtlPWMubGVuLW07Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UrbS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKTtjLmxlbi09ZTtpZigxPj1jLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSk7aWYoMD09PWEubGVuKXJldHVybjtpZihiPHRoaXMuTUlOX0dBTExPUCYmZTx0aGlzLk1JTl9HQUxMT1ApYnJlYWs7bCsrO3RoaXMubWluX2dhbGxvcD1sfX19ZmluYWxseXtTay5hc3NlcnRzLmFzc2VydCgwPD1cbmEubGVuJiYwPD1jLmxlbik7Zm9yKGY9YS5iYXNlK2EubGVuLTE7Zj5hLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2F0PWZ1bmN0aW9uKGEpezA+YSYmKGE9dGhpcy5wZW5kaW5nLmxlbmd0aCthKTt2YXIgYz10aGlzLnBlbmRpbmdbYV07dmFyIGI9dGhpcy5wZW5kaW5nW2ErMV07U2suYXNzZXJ0cy5hc3NlcnQoMDxjLmxlbiYmMDxiLmxlbik7U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlK2MubGVuPT1iLmJhc2UpO3RoaXMucGVuZGluZ1thXT1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LGMuYmFzZSxjLmxlbitiLmxlbik7dGhpcy5wZW5kaW5nLnNwbGljZShhKzEsMSk7YT10aGlzLmdhbGxvcChiLmdldGl0ZW0oYi5iYXNlKSxjLDAsITApO2MuYWR2YW5jZShhKTtcbjAhPT1jLmxlbiYmKGIubGVuPXRoaXMuZ2FsbG9wKGMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSksYixiLmxlbi0xLCExKSwwIT09Yi5sZW4mJihjLmxlbjw9Yi5sZW4/dGhpcy5tZXJnZV9sbyhjLGIpOnRoaXMubWVyZ2VfaGkoYyxiKSkpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGVuZGluZzsxPGEubGVuZ3RoOylpZigzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48PWFbYS5sZW5ndGgtMl0ubGVuK2FbYS5sZW5ndGgtMV0ubGVuKWFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgaWYoYVthLmxlbmd0aC0yXS5sZW48PWFbYS5sZW5ndGgtMV0ubGVuKXRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgYnJlYWt9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfZm9yY2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9XG50aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbXB1dGVfbWlucnVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzY0PD1hOyljfD1hJjEsYT4+PTE7cmV0dXJuIGErY307U2suYnVpbHRpbi5saXN0U2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubGlzdD1hO3RoaXMuYmFzZT1jO3RoaXMubGVuPWJ9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5jb3B5aXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJhc2UsYz10aGlzLmJhc2UrdGhpcy5sZW47U2suYXNzZXJ0cy5hc3NlcnQoMDw9YTw9Yyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3RTbGljZShuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMubGlzdC52LnNsaWNlKGEsYykpLDAsdGhpcy5sZW4pfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuYWR2YW5jZT1cbmZ1bmN0aW9uKGEpe3RoaXMuYmFzZSs9YTt0aGlzLmxlbi09YTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLmJhc2U8PXRoaXMubGlzdC5zcSRsZW5ndGgoKSl9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5nZXRpdGVtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxpc3QudlthXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wbGVmdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGlzdC52W3RoaXMuYmFzZV07dGhpcy5iYXNlKys7dGhpcy5sZW4tLTtyZXR1cm4gYX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnBvcHJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5sZW4tLTtyZXR1cm4gdGhpcy5saXN0LnZbdGhpcy5iYXNlK3RoaXMubGVuXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGEsXG5jLGI9dGhpcy5saXN0LGU9dGhpcy5iYXNlLGY9ZSt0aGlzLmxlbi0xO2U8ZjspYT1iLnZbZl0sYz1iLnZbZV0sYi52W2VdPWEsYi52W2ZdPWMsZSsrLGYtLX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5saXN0U2xpY2VcIixTay5idWlsdGluLmxpc3RTbGljZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50aW1Tb3J0XCIsU2suYnVpbHRpbi50aW1Tb3J0KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN1cGVyXz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3VwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdXBlcl8sXCJiYWQgY2FsbCB0byBzdXBlciwgdXNlICduZXcnXCIpO3RoaXMudHlwZT1hO3RoaXMub2JqPWM7aWYodm9pZCAwIT09YSYmIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGJlIHR5cGUsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt0aGlzLm9ial90eXBlPXZvaWQgMCE9PXRoaXMub2JqP3RoaXMuJHN1cGVyY2hlY2soYSx0aGlzLm9iaik6bnVsbH0sc2xvdHM6e3RwJGRvYzpcInN1cGVyKCkgLT4gc2FtZSBhcyBzdXBlcihfX2NsYXNzX18sIDxmaXJzdCBhcmd1bWVudD4pXFxuc3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcXG5zdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXFxuc3VwZXIodHlwZSwgdHlwZTIpIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNzdWJjbGFzcyh0eXBlMiwgdHlwZSlcXG5UeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XFxuY2xhc3MgQyhCKTpcXG4gICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkubWV0aChhcmcpXFxuVGhpcyB3b3JrcyBmb3IgY2xhc3MgbWV0aG9kcyB0b286XFxuY2xhc3MgQyhCKTpcXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjbWV0aChjbHMsIGFyZyk6XFxuICAgICAgICBzdXBlcigpLmNtZXRoKGFyZylcXG5cIixcbnRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN1cGVyXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3VwZXJcIixhLDEsMik7Yz1hWzBdO2E9YVsxXTtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTt0aGlzLm9iaj1hO3RoaXMudHlwZT1jO251bGwhPXRoaXMub2JqJiYodGhpcy5vYmpfdHlwZT10aGlzLiRzdXBlcmNoZWNrKGMsdGhpcy5vYmopKX0sJHIoKXtyZXR1cm4gdGhpcy5vYmo/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcIic+LCA8XCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5vYmopK1wiIG9iamVjdD4+XCIpOm5ldyBTay5idWlsdGluLnN0cihcIjxzdXBlcjogPGNsYXNzICdcIit0aGlzLnR5cGUucHJvdG90eXBlLnRwJG5hbWUrXG5cIic+LCBOVUxMPlwiKX0sdHAkZ2V0YXR0cihhLGMpe2xldCBiPXRoaXMub2JqX3R5cGU7aWYobnVsbD09YilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO3ZhciBlPWIucHJvdG90eXBlLnRwJG1ybztjb25zdCBmPWUubGVuZ3RoO2lmKGE9PT1Tay5idWlsdGluLnN0ci4kY2xhc3MpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTtsZXQgbDtmb3IobD0wO2wrMTxmJiZ0aGlzLnR5cGUhPT1lW2xdO2wrKyk7bCsrO2lmKGw+PWYpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTthPWEuJG1hbmdsZWQ7bGV0IGg7Zm9yKDtsPGY7KXtjPWVbbF0ucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYSkmJihoPWNbYV0pO2lmKHZvaWQgMCE9PWgpcmV0dXJuIGU9aC50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmKGg9ZS5jYWxsKGgsdGhpcy5vYmo9PT1iP251bGw6dGhpcy5vYmosYikpLGg7bCsrfX0sdHAkZGVzY3JfZ2V0KGEsXG5jKXtpZihudWxsPT09YXx8bnVsbCE9dGhpcy5vYmopcmV0dXJuIHRoaXM7aWYodGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zdXBlcl8pcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLm9iJHR5cGUsW3RoaXMudHlwZSxhXSk7e2M9dGhpcy4kc3VwZXJjaGVjayh0aGlzLnR5cGUsYSk7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi5zdXBlcl87Yi50eXBlPXRoaXMudHlwZTtiLm9iaj1hO2Iub2JqX3R5cGU9YztyZXR1cm4gYn19fSxnZXRzZXRzOntfX3RoaXNjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMudHlwZX0sJGRvYzpcInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpXCJ9LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2JqfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRkb2M6XCJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn0sX19zZWxmX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmpfdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiRkb2M6XCJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn19LHByb3RvOnskc3VwZXJjaGVjayhhLGMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKSYmYy4kaXNTdWJUeXBlKGEpKXJldHVybiBjO2lmKGMub2IkdHlwZS4kaXNTdWJUeXBlKGEpKXJldHVybiBjLm9iJHR5cGU7e2NvbnN0IGI9Yy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7aWYodm9pZCAwIT09YiYmYiE9PWMub2IkdHlwZSYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGIpJiZiLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGJ9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VwZXIodHlwZSwgb2JqKTogb2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlXCIpO319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbnM9e3JvdW5kOm51bGwsbGVuOm51bGwsbWluOm51bGwsbWF4Om51bGwsc3VtOm51bGwsYWJzOm51bGwsZmFiczpudWxsLFxub3JkOm51bGwsY2hyOm51bGwsaGV4Om51bGwsb2N0Om51bGwsYmluOm51bGwsZGlyOm51bGwscmVwcjpudWxsLG9wZW46bnVsbCxpc2luc3RhbmNlOm51bGwsaGFzaDpudWxsLGdldGF0dHI6bnVsbCxoYXNhdHRyOm51bGwsaWQ6bnVsbCxyZWR1Y2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJlZHVjZSksc29ydGVkOm51bGwsYW55Om51bGwsYWxsOm51bGwsZW51bWVyYXRlOlNrLmJ1aWx0aW4uZW51bWVyYXRlLGZpbHRlcjpTay5idWlsdGluLmZpbHRlcl8sbWFwOlNrLmJ1aWx0aW4ubWFwXyxyYW5nZTpTay5idWlsdGluLnJhbmdlXyxyZXZlcnNlZDpTay5idWlsdGluLnJldmVyc2VkLHppcDpTay5idWlsdGluLnppcF8sQmFzZUV4Y2VwdGlvbjpTay5idWlsdGluLkJhc2VFeGNlcHRpb24sQXR0cmlidXRlRXJyb3I6U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcixWYWx1ZUVycm9yOlNrLmJ1aWx0aW4uVmFsdWVFcnJvcixFeGNlcHRpb246U2suYnVpbHRpbi5FeGNlcHRpb24sXG5aZXJvRGl2aXNpb25FcnJvcjpTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yLEFzc2VydGlvbkVycm9yOlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IsSW1wb3J0RXJyb3I6U2suYnVpbHRpbi5JbXBvcnRFcnJvcixJbmRlbnRhdGlvbkVycm9yOlNrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcixJbmRleEVycm9yOlNrLmJ1aWx0aW4uSW5kZXhFcnJvcixMb29rdXBFcnJvcjpTay5idWlsdGluLkxvb2t1cEVycm9yLEtleUVycm9yOlNrLmJ1aWx0aW4uS2V5RXJyb3IsVHlwZUVycm9yOlNrLmJ1aWx0aW4uVHlwZUVycm9yLFVuaWNvZGVEZWNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcixVbmljb2RlRW5jb2RlRXJyb3I6U2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IsTmFtZUVycm9yOlNrLmJ1aWx0aW4uTmFtZUVycm9yLElPRXJyb3I6U2suYnVpbHRpbi5JT0Vycm9yLE5vdEltcGxlbWVudGVkRXJyb3I6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yLFxuU3lzdGVtRXhpdDpTay5idWlsdGluLlN5c3RlbUV4aXQsT3ZlcmZsb3dFcnJvcjpTay5idWlsdGluLk92ZXJmbG93RXJyb3IsT3BlcmF0aW9uRXJyb3I6U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcixOZWdhdGl2ZVBvd2VyRXJyb3I6U2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IsUnVudGltZUVycm9yOlNrLmJ1aWx0aW4uUnVudGltZUVycm9yLFJlY3Vyc2lvbkVycm9yOlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IsU3RvcEl0ZXJhdGlvbjpTay5idWlsdGluLlN0b3BJdGVyYXRpb24sU3ludGF4RXJyb3I6U2suYnVpbHRpbi5TeW50YXhFcnJvcixTeXN0ZW1FcnJvcjpTay5idWlsdGluLlN5c3RlbUVycm9yLGZsb2F0XyRydyQ6U2suYnVpbHRpbi5mbG9hdF8saW50XyRydyQ6U2suYnVpbHRpbi5pbnRfLGJvb2w6U2suYnVpbHRpbi5ib29sLGNvbXBsZXg6U2suYnVpbHRpbi5jb21wbGV4LGRpY3Q6U2suYnVpbHRpbi5kaWN0LGZpbGU6U2suYnVpbHRpbi5maWxlLGZyb3plbnNldDpTay5idWlsdGluLmZyb3plbnNldCxcblwiZnVuY3Rpb25cIjpTay5idWlsdGluLmZ1bmMsZ2VuZXJhdG9yOlNrLmJ1aWx0aW4uZ2VuZXJhdG9yLGxpc3Q6U2suYnVpbHRpbi5saXN0LGxvbmdfJHJ3JDpTay5idWlsdGluLmxuZyxtZXRob2Q6U2suYnVpbHRpbi5tZXRob2Qsb2JqZWN0OlNrLmJ1aWx0aW4ub2JqZWN0LHNsaWNlOlNrLmJ1aWx0aW4uc2xpY2Usc3RyOlNrLmJ1aWx0aW4uc3RyLHNldDpTay5idWlsdGluLnNldCx0dXBsZTpTay5idWlsdGluLnR1cGxlLHR5cGU6U2suYnVpbHRpbi50eXBlLGlucHV0Om51bGwscmF3X2lucHV0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLHNldGF0dHI6bnVsbCxqc2V2YWw6U2suYnVpbHRpbi5qc2V2YWwsanNtaWxsaXM6U2suYnVpbHRpbi5qc21pbGxpcyxxdWl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxleGl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxwcmludDpudWxsLGRpdm1vZDpudWxsLGZvcm1hdDpudWxsLFxuZ2xvYmFsczpudWxsLGlzc3ViY2xhc3M6bnVsbCxpdGVyOm51bGwsZXhlY2ZpbGU6U2suYnVpbHRpbi5leGVjZmlsZSxoZWxwOlNrLmJ1aWx0aW4uaGVscCxtZW1vcnl2aWV3OlNrLmJ1aWx0aW4ubWVtb3J5dmlldyxyZWxvYWQ6U2suYnVpbHRpbi5yZWxvYWQsc3VwZXJfJHJ3JDpTay5idWlsdGluLnN1cGVyXyx1bmljaHI6U2suYnVpbHRpbi51bmljaHIsdmFyczpTay5idWlsdGluLnZhcnMsYXBwbHlfJHJ3JDpTay5idWlsdGluLmFwcGx5XyxidWZmZXI6U2suYnVpbHRpbi5idWZmZXIsY29lcmNlOlNrLmJ1aWx0aW4uY29lcmNlLGludGVybjpTay5idWlsdGluLmludGVybixwcm9wZXJ0eTpTay5idWlsdGluLnByb3BlcnR5LGNsYXNzbWV0aG9kOlNrLmJ1aWx0aW4uY2xhc3NtZXRob2Qsc3RhdGljbWV0aG9kOlNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kfTtTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXCJidWlsdGluc1wiLFNrLmJ1aWx0aW5zLHtfX2ltcG9ydF9fOnskbWV0aDpTay5idWlsdGluLl9faW1wb3J0X18sXG4kZmxhZ3M6e05hbWVkQXJnczpbXCJuYW1lXCIsXCJnbG9iYWxzXCIsXCJsb2NhbHNcIixcImZyb21saXN0XCIsXCJsZXZlbFwiXX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lLCBmcm9tbGlzdD0oKSwgbGV2ZWw9MCkgLT4gbW9kdWxlXFxuXFxuSW1wb3J0IGEgbW9kdWxlLiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBieSB0aGUgUHl0aG9uXFxuaW50ZXJwcmV0ZXIgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2UsIGl0IGlzIGJldHRlciB0byB1c2VcXG5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIHRvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLlxcblxcblRoZSBnbG9iYWxzIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQ7XFxudGhleSBhcmUgbm90IG1vZGlmaWVkLiAgVGhlIGxvY2FscyBhcmd1bWVudCBpcyB1bnVzZWQuICBUaGUgZnJvbWxpc3RcXG5zaG91bGQgYmUgYSBsaXN0IG9mIG5hbWVzIHRvIGVtdWxhdGUgYGBmcm9tIG5hbWUgaW1wb3J0IC4uLicnLCBvciBhblxcbmVtcHR5IGxpc3QgdG8gZW11bGF0ZSBgYGltcG9ydCBuYW1lJycuXFxuV2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2UsIG5vdGUgdGhhdCBfX2ltcG9ydF9fKCdBLkInLCAuLi4pXFxucmV0dXJucyBwYWNrYWdlIEEgd2hlbiBmcm9tbGlzdCBpcyBlbXB0eSwgYnV0IGl0cyBzdWJtb2R1bGUgQiB3aGVuXFxuZnJvbWxpc3QgaXMgbm90IGVtcHR5LiAgVGhlIGxldmVsIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG9cXG5wZXJmb3JtIGFic29sdXRlIG9yIHJlbGF0aXZlIGltcG9ydHM6IDAgaXMgYWJzb2x1dGUsIHdoaWxlIGEgcG9zaXRpdmUgbnVtYmVyXFxuaXMgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cIn0sXG5hYnM6eyRtZXRoOlNrLmJ1aWx0aW4uYWJzLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC5cIn0sYWxsOnskbWV0aDpTay5idWlsdGluLmFsbCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYWxsIHZhbHVlcyB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBUcnVlLlwifSxhbnk6eyRtZXRoOlNrLmJ1aWx0aW4uYW55LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbnkgeCBpbiB0aGUgaXRlcmFibGUuXFxuXFxuSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gRmFsc2UuXCJ9LFxuYXNjaWk6eyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sYmluOnskbWV0aDpTay5idWlsdGluLmJpbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLlxcblxcbiAgID4+PiBiaW4oMjc5NjIwMilcXG4gICAnMGIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJ1wifSxcbmNhbGxhYmxlOnskbWV0aDpTay5idWlsdGluLmNhbGxhYmxlLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgaXMgY2FsbGFibGUgKGkuZS4sIHNvbWUga2luZCBvZiBmdW5jdGlvbikuXFxuXFxuTm90ZSB0aGF0IGNsYXNzZXMgYXJlIGNhbGxhYmxlLCBhcyBhcmUgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBhXFxuX19jYWxsX18oKSBtZXRob2QuXCJ9LGNocjp7JG1ldGg6U2suYnVpbHRpbi5jaHIsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGksIC8pXCIsJGRvYzpcIlJldHVybiBhIFVuaWNvZGUgc3RyaW5nIG9mIG9uZSBjaGFyYWN0ZXIgd2l0aCBvcmRpbmFsIGk7IDAgPD0gaSA8PSAweDEwZmZmZi5cIn0sZGVsYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5kZWxhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLFxuJGRvYzpcIkRlbGV0ZXMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuZGVsYXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8gYGBkZWwgeC55JydcIn0sZGlyOnskbWV0aDpTay5idWlsdGluLmRpciwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImRpcihbb2JqZWN0XSkgLT4gbGlzdCBvZiBzdHJpbmdzXFxuXFxuSWYgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIHJldHVybiB0aGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUuXFxuRWxzZSwgcmV0dXJuIGFuIGFscGhhYmV0aXplZCBsaXN0IG9mIG5hbWVzIGNvbXByaXNpbmcgKHNvbWUgb2YpIHRoZSBhdHRyaWJ1dGVzXFxub2YgdGhlIGdpdmVuIG9iamVjdCwgYW5kIG9mIGF0dHJpYnV0ZXMgcmVhY2hhYmxlIGZyb20gaXQuXFxuSWYgdGhlIG9iamVjdCBzdXBwbGllcyBhIG1ldGhvZCBuYW1lZCBfX2Rpcl9fLCBpdCB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZVxcbnRoZSBkZWZhdWx0IGRpcigpIGxvZ2ljIGlzIHVzZWQgYW5kIHJldHVybnM6XFxuICBmb3IgYSBtb2R1bGUgb2JqZWN0OiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcy5cXG4gIGZvciBhIGNsYXNzIG9iamVjdDogIGl0cyBhdHRyaWJ1dGVzLCBhbmQgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXNcXG4gICAgb2YgaXRzIGJhc2VzLlxcbiAgZm9yIGFueSBvdGhlciBvYmplY3Q6IGl0cyBhdHRyaWJ1dGVzLCBpdHMgY2xhc3MncyBhdHRyaWJ1dGVzLCBhbmRcXG4gICAgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXMgb2YgaXRzIGNsYXNzJ3MgYmFzZSBjbGFzc2VzLlwifSxcbmRpdm1vZDp7JG1ldGg6U2suYnVpbHRpbi5kaXZtb2QsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCB5LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHR1cGxlICh4Ly95LCB4JXkpLiAgSW52YXJpYW50OiBkaXYqeSArIG1vZCA9PSB4LlwifSxldmFsXyRydyQ6eyRuYW1lOlwiZXZhbFwiLCRtZXRoOlNrLmJ1aWx0aW4uZXZhbF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBzb3VyY2UsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIC8pXCIsJGRvYzpcIkV2YWx1YXRlIHRoZSBnaXZlbiBzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFscyBhbmQgbG9jYWxzLlxcblxcblRoZSBzb3VyY2UgbWF5IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFB5dGhvbiBleHByZXNzaW9uXFxub3IgYSBjb2RlIG9iamVjdCBhcyByZXR1cm5lZCBieSBjb21waWxlKCkuXFxuVGhlIGdsb2JhbHMgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGxvY2FscyBjYW4gYmUgYW55IG1hcHBpbmcsXFxuZGVmYXVsdGluZyB0byB0aGUgY3VycmVudCBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuSWYgb25seSBnbG9iYWxzIGlzIGdpdmVuLCBsb2NhbHMgZGVmYXVsdHMgdG8gaXQuXCJ9LFxuZm9ybWF0OnskbWV0aDpTay5idWlsdGluLmZvcm1hdCwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYz0nJywgLylcIiwkZG9jOlwiUmV0dXJuIHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpXFxuXFxuZm9ybWF0X3NwZWMgZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZy5cXG5TZWUgdGhlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Ugc2VjdGlvbiBvZiBoZWxwKCdGT1JNQVRUSU5HJykgZm9yXFxuZGV0YWlscy5cIn0sZ2V0YXR0cjp7JG1ldGg6U2suYnVpbHRpbi5nZXRhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiZ2V0YXR0cihvYmplY3QsIG5hbWVbLCBkZWZhdWx0XSkgLT4gdmFsdWVcXG5cXG5HZXQgYSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3Q7IGdldGF0dHIoeCwgJ3knKSBpcyBlcXVpdmFsZW50IHRvIHgueS5cXG5XaGVuIGEgZGVmYXVsdCBhcmd1bWVudCBpcyBnaXZlbiwgaXQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgYXR0cmlidXRlIGRvZXNuJ3RcXG5leGlzdDsgd2l0aG91dCBpdCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGF0IGNhc2UuXCJ9LFxuZ2xvYmFsczp7JG1ldGg6U2suYnVpbHRpbi5nbG9iYWxzLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY3VycmVudCBzY29wZSdzIGdsb2JhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogVXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgKndpbGwqIGFmZmVjdCBuYW1lIGxvb2t1cHMgaW4gdGhlIGN1cnJlbnRcXG5nbG9iYWwgc2NvcGUgYW5kIHZpY2UtdmVyc2EuXCJ9LGhhc2F0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzYXR0ciwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuXFxuXFxuVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcgZ2V0YXR0cihvYmosIG5hbWUpIGFuZCBjYXRjaGluZyBBdHRyaWJ1dGVFcnJvci5cIn0sXG5oYXNoOnskbWV0aDpTay5idWlsdGluLmhhc2gsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcblR3byBvYmplY3RzIHRoYXQgY29tcGFyZSBlcXVhbCBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBidXQgdGhlXFxucmV2ZXJzZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS5cIn0saGV4OnskbWV0aDpTay5idWlsdGluLmhleCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGhleCgxMjY0ODQzMClcXG4gICAnMHhjMGZmZWUnXCJ9LGlkOnskbWV0aDpTay5idWlsdGluLmlkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaWRlbnRpdHkgb2YgYW4gb2JqZWN0LlxcblxcblRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYW1vbmcgc2ltdWx0YW5lb3VzbHkgZXhpc3Rpbmcgb2JqZWN0cy5cXG4oQ1B5dGhvbiB1c2VzIHRoZSBvYmplY3QncyBtZW1vcnkgYWRkcmVzcy4pXCJ9LFxuaW5wdXQ6eyRtZXRoOlNrLmJ1aWx0aW4uaW5wdXQsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBwcm9tcHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmVhZCBhIHN0cmluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQuXFxuXFxuVGhlIHByb21wdCBzdHJpbmcsIGlmIGdpdmVuLCBpcyBwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dCB3aXRob3V0IGFcXG50cmFpbGluZyBuZXdsaW5lIGJlZm9yZSByZWFkaW5nIGlucHV0LlxcblxcbklmIHRoZSB1c2VyIGhpdHMgRU9GICgqbml4OiBDdHJsLUQsIFdpbmRvd3M6IEN0cmwtWitSZXR1cm4pLCByYWlzZSBFT0ZFcnJvci5cXG5PbiAqbml4IHN5c3RlbXMsIHJlYWRsaW5lIGlzIHVzZWQgaWYgYXZhaWxhYmxlLlwifSxpc2luc3RhbmNlOnskbWV0aDpTay5idWlsdGluLmlzaW5zdGFuY2UsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlLCAvKVwiLFxuJGRvYzpcIlJldHVybiB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIG9yIG9mIGEgc3ViY2xhc3MgdGhlcmVvZi5cXG5cXG5BIHR1cGxlLCBhcyBpbiBgYGlzaW5zdGFuY2UoeCwgKEEsIEIsIC4uLikpYGAsIG1heSBiZSBnaXZlbiBhcyB0aGUgdGFyZ2V0IHRvXFxuY2hlY2sgYWdhaW5zdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgaXNpbnN0YW5jZSh4LCBBKSBvciBpc2luc3RhbmNlKHgsIEIpXFxub3IgLi4uYGAgZXRjLlwifSxpc3N1YmNsYXNzOnskbWV0aDpTay5idWlsdGluLmlzc3ViY2xhc3MsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjbHMsIGNsYXNzX29yX3R1cGxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciAnY2xzJyBpcyBhIGRlcml2ZWQgZnJvbSBhbm90aGVyIGNsYXNzIG9yIGlzIHRoZSBzYW1lIGNsYXNzLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNzdWJjbGFzcyh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc3N1YmNsYXNzKHgsIEEpIG9yIGlzc3ViY2xhc3MoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LFxuaXRlcjp7JG1ldGg6U2suYnVpbHRpbi5pdGVyLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUgLylcIiwkZG9jOlwiaXRlcihpdGVyYWJsZSkgLT4gaXRlcmF0b3JcXG5pdGVyKGNhbGxhYmxlLCBzZW50aW5lbCkgLT4gaXRlcmF0b3JcXG5cXG5HZXQgYW4gaXRlcmF0b3IgZnJvbSBhbiBvYmplY3QuICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIGFyZ3VtZW50IG11c3RcXG5zdXBwbHkgaXRzIG93biBpdGVyYXRvciwgb3IgYmUgYSBzZXF1ZW5jZS5cXG5JbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBjYWxsYWJsZSBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyB0aGUgc2VudGluZWwuXCJ9LGxlbjp7JG1ldGg6U2suYnVpbHRpbi5sZW4sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBjb250YWluZXIuXCJ9LGxvY2Fsczp7JG1ldGg6U2suYnVpbHRpbi5sb2NhbHMsXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgbG9jYWwgdmFyaWFibGVzLlxcblxcbk5PVEU6IFdoZXRoZXIgb3Igbm90IHVwZGF0ZXMgdG8gdGhpcyBkaWN0aW9uYXJ5IHdpbGwgYWZmZWN0IG5hbWUgbG9va3VwcyBpblxcbnRoZSBsb2NhbCBzY29wZSBhbmQgdmljZS12ZXJzYSBpcyAqaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KiBhbmQgbm90XFxuY292ZXJlZCBieSBhbnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlcy5cIn0sbWF4OnskbWV0aDpTay5idWlsdGluLm1heCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJtYXgoaXRlcmFibGUsICpbLCBkZWZhdWx0PW9iaiwga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcbm1heChhcmcxLCBhcmcyLCAqYXJncywgKlssIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5cXG5XaXRoIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50LCByZXR1cm4gaXRzIGJpZ2dlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgbGFyZ2VzdCBhcmd1bWVudC5cIn0sXG5taW46eyRtZXRoOlNrLmJ1aWx0aW4ubWluLCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1pbihpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWluKGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgc21hbGxlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgc21hbGxlc3QgYXJndW1lbnQuXCJ9LG5leHQ6eyRuYW1lOlwibmV4dFwiLCRtZXRoOlNrLmJ1aWx0aW4ubmV4dF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJuZXh0KGl0ZXJhdG9yWywgZGVmYXVsdF0pXFxuXFxuUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgaXRlcmF0b3IuIElmIGRlZmF1bHQgaXMgZ2l2ZW4gYW5kIHRoZSBpdGVyYXRvclxcbmlzIGV4aGF1c3RlZCwgaXQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiByYWlzaW5nIFN0b3BJdGVyYXRpb24uXCJ9LFxub2N0OnskbWV0aDpTay5idWlsdGluLm9jdCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IG9jdCgzNDIzOTEpXFxuICAgJzBvMTIzNDU2NydcIn0sb3Blbjp7JG1ldGg6U2suYnVpbHRpbi5vcGVuLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwib3BlbihuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSAtPiBmaWxlIG9iamVjdFxcblxcbk9wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyB0aGVcXG5wcmVmZXJyZWQgd2F5IHRvIG9wZW4gYSBmaWxlLiAgU2VlIGZpbGUuX19kb2NfXyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cIn0sb3JkOnskbWV0aDpTay5idWlsdGluLm9yZCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgYywgLylcIixcbiRkb2M6XCJSZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBmb3IgYSBvbmUtY2hhcmFjdGVyIHN0cmluZy5cIn0scG93OnskbWV0aDpTay5idWlsdGluLnBvdywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIHo9Tm9uZSwgLylcIiwkZG9jOlwiRXF1aXZhbGVudCB0byB4Kip5ICh3aXRoIHR3byBhcmd1bWVudHMpIG9yIHgqKnkgJSB6ICh3aXRoIHRocmVlIGFyZ3VtZW50cylcXG5cXG5Tb21lIHR5cGVzLCBzdWNoIGFzIGludHMsIGFyZSBhYmxlIHRvIHVzZSBhIG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobSB3aGVuXFxuaW52b2tlZCB1c2luZyB0aGUgdGhyZWUgYXJndW1lbnQgZm9ybS5cIn0scHJpbnQ6eyRtZXRoOlNrLmJ1aWx0aW4ucHJpbnQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicHJpbnQodmFsdWUsIC4uLiwgc2VwPScgJywgZW5kPSdcXFxcbicsIGZpbGU9c3lzLnN0ZG91dCwgZmx1c2g9RmFsc2UpXFxuXFxuUHJpbnRzIHRoZSB2YWx1ZXMgdG8gYSBzdHJlYW0sIG9yIHRvIHN5cy5zdGRvdXQgYnkgZGVmYXVsdC5cXG5PcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czpcXG5maWxlOiAgYSBmaWxlLWxpa2Ugb2JqZWN0IChzdHJlYW0pOyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBzeXMuc3Rkb3V0LlxcbnNlcDogICBzdHJpbmcgaW5zZXJ0ZWQgYmV0d2VlbiB2YWx1ZXMsIGRlZmF1bHQgYSBzcGFjZS5cXG5lbmQ6ICAgc3RyaW5nIGFwcGVuZGVkIGFmdGVyIHRoZSBsYXN0IHZhbHVlLCBkZWZhdWx0IGEgbmV3bGluZS5cXG5mbHVzaDogd2hldGhlciB0byBmb3JjaWJseSBmbHVzaCB0aGUgc3RyZWFtLlwifSxcbnJlcHI6eyRtZXRoOlNrLmJ1aWx0aW4ucmVwciwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cXG5cXG5Gb3IgbWFueSBvYmplY3QgdHlwZXMsIGluY2x1ZGluZyBtb3N0IGJ1aWx0aW5zLCBldmFsKHJlcHIob2JqKSkgPT0gb2JqLlwifSxyb3VuZDp7JG1ldGg6U2suYnVpbHRpbi5yb3VuZCwkZmxhZ3M6e05hbWVkQXJnczpbXCJudW1iZXJcIixcIm5kaWdpdHNcIl19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8sIG51bWJlciwgbmRpZ2l0cz1Ob25lKVwiLCRkb2M6XCJSb3VuZCBhIG51bWJlciB0byBhIGdpdmVuIHByZWNpc2lvbiBpbiBkZWNpbWFsIGRpZ2l0cy5cXG5cXG5UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIgaWYgbmRpZ2l0cyBpcyBvbWl0dGVkIG9yIE5vbmUuICBPdGhlcndpc2VcXG50aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBudW1iZXIuICBuZGlnaXRzIG1heSBiZSBuZWdhdGl2ZS5cIn0sXG5zZXRhdHRyOnskbWV0aDpTay5idWlsdGluLnNldGF0dHIsJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlLCAvKVwiLCRkb2M6XCJTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxcblxcbnNldGF0dHIoeCwgJ3knLCB2KSBpcyBlcXVpdmFsZW50IHRvIGBgeC55ID0gdicnXCJ9LHNvcnRlZDp7JG1ldGg6U2suYnVpbHRpbi5zb3J0ZWQsJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJjbXBcIixcImtleVwiLFwicmV2ZXJzZVwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8sICosIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSBpbiBhc2NlbmRpbmcgb3JkZXIuXFxuXFxuQSBjdXN0b20ga2V5IGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZCB0byBjdXN0b21pemUgdGhlIHNvcnQgb3JkZXIsIGFuZCB0aGVcXG5yZXZlcnNlIGZsYWcgY2FuIGJlIHNldCB0byByZXF1ZXN0IHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlci5cIn0sXG5zdW06eyRtZXRoOlNrLmJ1aWx0aW4uc3VtLCRmbGFnczp7TmFtZWRBcmdzOltudWxsLFwic3RhcnRcIl0sRGVmYXVsdHM6W25ldyBTay5idWlsdGluLmludF8oMCldfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgc3RhcnQ9MClcIiwkZG9jOlwiUmV0dXJuIHRoZSBzdW0gb2YgYSAnc3RhcnQnIHZhbHVlIChkZWZhdWx0OiAwKSBwbHVzIGFuIGl0ZXJhYmxlIG9mIG51bWJlcnNcXG5cXG5XaGVuIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIHRoZSBzdGFydCB2YWx1ZS5cXG5UaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHNwZWNpZmljYWxseSBmb3IgdXNlIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIG1heVxcbnJlamVjdCBub24tbnVtZXJpYyB0eXBlcy5cIn0sdmFyczp7JG1ldGg6U2suYnVpbHRpbi52YXJzLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwidmFycyhbb2JqZWN0XSkgLT4gZGljdGlvbmFyeVxcblxcbldpdGhvdXQgYXJndW1lbnRzLCBlcXVpdmFsZW50IHRvIGxvY2FscygpLlxcbldpdGggYW4gYXJndW1lbnQsIGVxdWl2YWxlbnQgdG8gb2JqZWN0Ll9fZGljdF9fLlwifX0pO1xuU2suc2V0dXBPYmplY3RzPWZ1bmN0aW9uKGEpe2E/KFNrLmJ1aWx0aW5zLmZpbHRlcj1Tay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbnMubWFwPVNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGlucy56aXA9U2suYnVpbHRpbi56aXBfLFNrLmJ1aWx0aW5zLnJhbmdlPVNrLmJ1aWx0aW4ucmFuZ2VfLGRlbGV0ZSBTay5idWlsdGlucy54cmFuZ2UsZGVsZXRlIFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3IsZGVsZXRlIFNrLmJ1aWx0aW5zLnVuaWNvZGUsZGVsZXRlIFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmcsZGVsZXRlIFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JCxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LGRlbGV0ZSBTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZS50cCRzdHIsZGVsZXRlIFNrLmJ1aWx0aW5zLnJhd19pbnB1dCxcbmRlbGV0ZSBTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlLFNrLmJ1aWx0aW5zLmJ5dGVzPVNrLmJ1aWx0aW4uYnl0ZXMsU2suYnVpbHRpbnMuYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLmFzY2lpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiBhbiBBU0NJSS1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC5cXG5cXG5BcyByZXByKCksIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuXFxub2JqZWN0LCBidXQgZXNjYXBlIHRoZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5XFxucmVwcigpIHVzaW5nIFxcXFxcXFxceCwgXFxcXFxcXFx1IG9yIFxcXFxcXFxcVSBlc2NhcGVzLiBUaGlzIGdlbmVyYXRlcyBhIHN0cmluZyBzaW1pbGFyXFxudG8gdGhhdCByZXR1cm5lZCBieSByZXByKCkgaW4gUHl0aG9uIDIuXCJ9LFxubnVsbCxcImJ1aWx0aW5zXCIpKTooU2suYnVpbHRpbnMucmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnJhbmdlLCRuYW1lOlwicmFuZ2VcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9fSx2b2lkIDAsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy54cmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnhyYW5nZSwkbmFtZTpcInhyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LG51bGwsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLmZpbHRlciksU2suYnVpbHRpbnMubWFwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5tYXApLFNrLmJ1aWx0aW5zLnppcD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uemlwKSxTay5idWlsdGlucy5TdGFuZGFyZEVycm9yPVNrLmJ1aWx0aW4uRXhjZXB0aW9uLFNrLmJ1aWx0aW5zLnVuaWNvZGU9XG5Tay5idWlsdGluLnN0cixTay5idWlsdGlucy5iYXNlc3RyaW5nPVNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JD1Tay5idWlsdGluLmxuZyxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkpOm5ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkrXCJMXCIpfSxTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSxTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyKCl9LFNrLmJ1aWx0aW5zLnJhd19pbnB1dD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmF3X2lucHV0KSxTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlPVNrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGUsXG5kZWxldGUgU2suYnVpbHRpbnMuYnl0ZXMsZGVsZXRlIFNrLmJ1aWx0aW5zLmFzY2lpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suc2V0dXBPYmplY3RzXCIsU2suc2V0dXBPYmplY3RzKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluc1wiLFNrLmJ1aWx0aW5zKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0ci4kZW1wdHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0cj1Tay5idWlsdGluLnN0ci4kZW1wdHk7U2suYnVpbHRpbi5zdHIuJHV0Zjg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwidXRmLThcIik7U2suYnVpbHRpbi5zdHIuJGFzY2lpPW5ldyBTay5idWlsdGluLnN0cihcImFzY2lpXCIpO1NrLmJ1aWx0aW4uc3RyLiRkZWZhdWx0X2ZhY3Rvcnk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZGVmYXVsdF9mYWN0b3J5XCIpO1NrLmJ1aWx0aW4uc3RyLiRpbWFnPW5ldyBTay5idWlsdGluLnN0cihcImltYWdcIik7U2suYnVpbHRpbi5zdHIuJHJlYWw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwicmVhbFwiKTtcblNrLmJ1aWx0aW4uc3RyLiRhYnM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hYnNfX1wiKTtTay5idWlsdGluLnN0ci4kYnl0ZXM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ieXRlc19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjYWxsPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2FsbF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjbGFzcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NsYXNzX19cIik7U2suYnVpbHRpbi5zdHIuJGNtcD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NtcF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb21wbGV4PW5ldyBTay5idWlsdGluLnN0cihcIl9fY29tcGxleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb250YWlucz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvbnRhaW5zX19cIik7U2suYnVpbHRpbi5zdHIuJGNvcHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb3B5X19cIik7U2suYnVpbHRpbi5zdHIuJGRpY3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaWN0X19cIik7U2suYnVpbHRpbi5zdHIuJGRpcj1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZGlyX19cIik7U2suYnVpbHRpbi5zdHIuJGRvYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RvY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbnRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2VudGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGVxPW5ldyBTay5idWlsdGluLnN0cihcIl9fZXFfX1wiKTtTay5idWlsdGluLnN0ci4kZXhpdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2V4aXRfX1wiKTtTay5idWlsdGluLnN0ci4kaW5kZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbmRleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbml0PW5ldyBTay5idWlsdGluLnN0cihcIl9faW5pdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbnRfPW5ldyBTay5idWlsdGluLnN0cihcIl9faW50X19cIik7U2suYnVpbHRpbi5zdHIuJGl0ZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pdGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGZpbGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19maWxlX19cIik7U2suYnVpbHRpbi5zdHIuJGZsb2F0Xz1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZmxvYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZm9ybWF0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZm9ybWF0X19cIik7U2suYnVpbHRpbi5zdHIuJGdlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2VfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cmlidXRlX19cIik7U2suYnVpbHRpbi5zdHIuJGdldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJGd0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZ3RfX1wiKTtTay5idWlsdGluLnN0ci4ka2V5cz1uZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpO1NrLmJ1aWx0aW4uc3RyLiRsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlX19cIik7U2suYnVpbHRpbi5zdHIuJGxlbj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlbl9fXCIpO1xuU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50PW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuZ3RoX2hpbnRfX1wiKTtTay5idWlsdGluLnN0ci4kbG9hZGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fbG9hZGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGx0PW5ldyBTay5idWlsdGluLnN0cihcIl9fbHRfX1wiKTtTay5idWlsdGluLnN0ci4kbW9kdWxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbW9kdWxlX19cIik7U2suYnVpbHRpbi5zdHIuJG1pc3Npbmc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19taXNzaW5nX19cIik7U2suYnVpbHRpbi5zdHIuJG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJG5lPW5ldyBTay5idWlsdGluLnN0cihcIl9fbmVfX1wiKTtTay5idWlsdGluLnN0ci4kbmV3PW5ldyBTay5idWlsdGluLnN0cihcIl9fbmV3X19cIik7U2suYnVpbHRpbi5zdHIuJG5leHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik7U2suYnVpbHRpbi5zdHIuJHBhdGg9XG5uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3BhdGhfX1wiKTtTay5idWlsdGluLnN0ci4kcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19xdWFsbmFtZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXByPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmVwcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXZlcnNlZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JldmVyc2VkX19cIik7U2suYnVpbHRpbi5zdHIuJHJvdW5kPW5ldyBTay5idWlsdGluLnN0cihcIl9fcm91bmRfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kc3RyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc3RyX19cIik7U2suYnVpbHRpbi5zdHIuJHRydW5jPW5ldyBTay5idWlsdGluLnN0cihcIl9fdHJ1bmNfX1wiKTtTay5idWlsdGluLnN0ci4kd3JpdGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwid3JpdGVcIik7XG5Tay5taXNjZXZhbC5vcDJtZXRob2RfPXtFcTpTay5idWlsdGluLnN0ci4kZXEsTm90RXE6U2suYnVpbHRpbi5zdHIuJG5lLEd0OlNrLmJ1aWx0aW4uc3RyLiRndCxHdEU6U2suYnVpbHRpbi5zdHIuJGdlLEx0OlNrLmJ1aWx0aW4uc3RyLiRsdCxMdEU6U2suYnVpbHRpbi5zdHIuJGxlfX1dKTt9KS5jYWxsKHRoaXMgfHwgd2luZG93KVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1za3VscHQubWluLmpzLm1hcCIsIi8qXG5UaGUgVGltZWRBY3RpdmVjb2RlIGNsYXNzZXMgYXJlIGEgZ3JlYXQgZXhhbXBsZSBvZiB3aGVyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSB3b3VsZCBiZSB1c2VmdWxcbkJ1dCBzaW5jZSBKYXZhc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2UgdXNlIHRoZSBtaXhpbiBwYXR0ZXJuLlxuXG4qL1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlXCI7XG5pbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZVwiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbFwiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuXG52YXIgVGltZWRBY3RpdmVDb2RlTWl4aW4gPSB7XG4gICAgdGltZWRJbml0OiBhc3luYyBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpOyAvLyBwb3NpdGlvbiBsYXN0XG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTsgLy8gdGhlIHJ1biBidXR0b24gY2xpY2sgbGlzdGVuZXIgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZFxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKFwidGltZWRDb21wb25lbnRcIik7XG4gICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5kaXZpZF0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGlkZUJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1dHRvbkxpc3QgPSBbXG4gICAgICAgICAgICB0aGlzLnNhdmVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmdyYWRlQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQsXG4gICAgICAgICAgICB0aGlzLmNvYWNoQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5hdEJ1dHRvbixcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmIGJ1dHRvbkxpc3RbaV0gIT09IG51bGwpXG4gICAgICAgICAgICAgICAgJChidXR0b25MaXN0W2ldKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gYmplIC0gbm90IG5lZWRlZCBhbnltb3JlXG4gICAgcmVuZGVyVGltZWRJY29uOiBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcbiAgICB9LFxuXG4gICAgY2hlY2tDb3JyZWN0VGltZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcGN0X2NvcnJlY3QgaXMgc2V0IGJ5IHRoZSB1bml0dGVzdC9ndWkucHkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgICAgLy8gaXQgcmVsaWVzIG9uIGZpbmRpbmcgdGhpcyBvYmplY3QgaW4gdGhlIGVkTGlzdFxuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wY3RfY29ycmVjdCA+PSAxMDAuMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiSVwiOyAvLyB3ZSBpZ25vcmUgdGhpcyBpbiB0aGUgZ3JhZGluZyBpZiBubyB1bml0dGVzdHNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoaWRlRmVlZGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB9LFxuXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzOiBmdW5jdGlvbiAodGFrZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYXR0YWNoaW5nIHJ1bmJ1dHRvbmhhbmRsZXJcIik7XG4gICAgICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuY29kZURpdikuc2hvdygpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAkKHRoaXMuY29kZURpdikucmVtb3ZlQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBzbGlkZTogdGhpcy5zbGlkZWl0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgY2hhbmdlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWtlbikge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCkuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBUaW1lZExpdmVDb2RlIGV4dGVuZHMgTGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZExpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXRDb21wbGV0ZSA9IHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cblxuICAgIC8vIGZvciB0aW1lZCBleGFtcyB3ZSBuZWVkIHRvIGNhbGwgcnVuUHJvZyBhbmQgdGVsbCBpdCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gbm8gR1VJIGZvciBzbGlkZXJzIG9yIG90aGVyIHRoaW5ncy5cbiAgICAvLyB0aGUgYW5zd2Vycy5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBub1VJID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aW1lZEluaXRDb21wbGV0ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNBbnN3ZXJlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKG5vVUksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEpTQWN0aXZlQ29kZSBleHRlbmRzIEpTQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEpTQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSFRNTEFjdGl2ZUNvZGUgZXh0ZW5kcyBIVE1MQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEhUTUxBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRTUUxBY3RpdmVDb2RlIGV4dGVuZHMgU1FMQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZFNRTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQnJ5dGhvbkFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cbk9iamVjdC5hc3NpZ24oVGltZWRCcnl0aG9uQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcbiIsIi8qXG5cbmhpZ2hsaWdodCB2NFxuXG5IaWdobGlnaHRzIGFyYml0cmFyeSB0ZXJtcy5cblxuPGh0dHA6Ly9qb2hhbm5idXJrYXJkLmRlL2Jsb2cvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC9oaWdobGlnaHQtamF2YXNjcmlwdC10ZXh0LWhpZ2xpZ2h0aW5nLWpxdWVyeS1wbHVnaW4uaHRtbD5cblxuTUlUIGxpY2Vuc2UuXG5cbkpvaGFubiBCdXJrYXJkXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGU+XG48bWFpbHRvOmpiQGVhaW8uY29tPlxuXG4qL1xuXG5qUXVlcnkuZm4uaGlnaGxpZ2h0ID0gZnVuY3Rpb24ocGF0KSB7XG4gZnVuY3Rpb24gaW5uZXJIaWdobGlnaHQobm9kZSwgcGF0KSB7XG4gIHZhciBza2lwID0gMDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgdmFyIHBvcyA9IG5vZGUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YocGF0KTtcbiAgIGlmIChwb3MgPj0gMCkge1xuICAgIHZhciBzcGFubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFubm9kZS5jbGFzc05hbWUgPSAnaGlnaGxpZ2h0JztcbiAgICB2YXIgbWlkZGxlYml0ID0gbm9kZS5zcGxpdFRleHQocG9zKTtcbiAgICB2YXIgZW5kYml0ID0gbWlkZGxlYml0LnNwbGl0VGV4dChwYXQubGVuZ3RoKTtcbiAgICB2YXIgbWlkZGxlY2xvbmUgPSBtaWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO1xuICAgIHNwYW5ub2RlLmFwcGVuZENoaWxkKG1pZGRsZWNsb25lKTtcbiAgICBtaWRkbGViaXQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc3Bhbm5vZGUsIG1pZGRsZWJpdCk7XG4gICAgc2tpcCA9IDE7XG4gICB9XG4gIH1cbiAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY2hpbGROb2RlcyAmJiAhLyhzY3JpcHR8c3R5bGUpL2kudGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgIGkgKz0gaW5uZXJIaWdobGlnaHQobm9kZS5jaGlsZE5vZGVzW2ldLCBwYXQpO1xuICAgfVxuICB9XG4gIHJldHVybiBza2lwO1xuIH1cbiByZXR1cm4gdGhpcy5sZW5ndGggJiYgcGF0ICYmIHBhdC5sZW5ndGggPyB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gIGlubmVySGlnaGxpZ2h0KHRoaXMsIHBhdC50b1VwcGVyQ2FzZSgpKTtcbiB9KSA6IHRoaXM7XG59O1xuXG5qUXVlcnkuZm4ucmVtb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gcmV0dXJuIHRoaXMuZmluZChcInNwYW4uaGlnaGxpZ2h0XCIpLmVhY2goZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLm5vZGVOYW1lO1xuICB3aXRoICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgIHJlcGxhY2VDaGlsZCh0aGlzLmZpcnN0Q2hpbGQsIHRoaXMpO1xuICAgbm9ybWFsaXplKCk7XG4gIH1cbiB9KS5lbmQoKTtcbn07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvY3NzL2FjdGl2ZWNvZGUuY3NzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvL2hvbWUvcmVrL1J1bmVzdG9uZUNvbXBvbmVudHMvbm9kZV9tb2R1bGVzL21vbWVudC9sb2NhbGV8c3luY3wvXlxcLlxcLy4qJC8iLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzcz8xZDExIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY2ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGUtaTE4bi5lbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlLWkxOG4uc3ItQ3lybC5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvYWN0aXZlY29kZV9icnl0aG9uLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hY3RpdmVjb2RlX2h0bWwuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfanMuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2FjdGl2ZWNvZGVfc3FsLmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvLi9ydW5lc3RvbmUvYWN0aXZlY29kZS9qcy9hdWRpb3RvdXIuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL2V4dHJhY3RVbml0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvbGl2ZWNvZGUuanMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2pzL21kNS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0LXN0ZGxpYi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvc2t1bHB0Lm1pbi5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2FjdGl2ZWNvZGUvanMvdGltZWRfYWN0aXZlY29kZS5qcyIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzLy4vcnVuZXN0b25lL2NvbW1vbi9qcy9qcXVlcnkuaGlnaGxpZ2h0LmpzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8Y3J5cHRvIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvc3FsLmpzL2Rpc3R8ZnMiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy9pZ25vcmVkfC9ob21lL3Jlay9SdW5lc3RvbmVDb21wb25lbnRzL25vZGVfbW9kdWxlcy9zcWwuanMvZGlzdHxwYXRoIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfGZzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvaWdub3JlZHwvaG9tZS9yZWsvUnVuZXN0b25lQ29tcG9uZW50cy9ub2RlX21vZHVsZXMvdmVnYS1sb2FkZXIvc3JjfG5vZGUtZmV0Y2giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUM0SDtBQUM3QjtBQUMvRiw4QkFBOEIsbUZBQTJCLENBQUMsd0dBQXFDO0FBQy9GO0FBQ0EsMERBQTBELG9CQUFvQix3QkFBd0IsdUJBQXVCLG1CQUFtQixvQkFBb0IsNkJBQTZCLHNDQUFzQywyQ0FBMkMsOENBQThDLDBCQUEwQiwrQkFBK0Isa0NBQWtDLDBCQUEwQixrQkFBa0IsR0FBRyxzQkFBc0Isb0JBQW9CLHlCQUF5QixhQUFhLGNBQWMsa0JBQWtCLGtCQUFrQix1QkFBdUIsR0FBRywwQkFBMEIsb0JBQW9CLHlCQUF5QixtQkFBbUIsa0JBQWtCLDJDQUEyQyxrQkFBa0IsbUJBQW1CLEdBQUcsaUJBQWlCLHlCQUF5QixHQUFHLGFBQWEsdUJBQXVCLDRCQUE0Qix5QkFBeUIsaUJBQWlCLG1CQUFtQixpQkFBaUIsZ0JBQWdCLEdBQUcsaUJBQWlCLHlCQUF5Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixrQkFBa0IsR0FBRyxzQ0FBc0MsdUJBQXVCLHdCQUF3Qix5QkFBeUIseUJBQXlCLEdBQUcsMkJBQTJCLHdCQUF3QixHQUFHLGdCQUFnQixvQkFBb0IsdUJBQXVCLGdDQUFnQyxHQUFHLGtCQUFrQixrQ0FBa0MsR0FBRyxpQkFBaUIseUJBQXlCLHdCQUF3QixHQUFHLHNCQUFzQiwwQkFBMEIsR0FBRyxrQkFBa0IsMkNBQTJDLHlCQUF5Qix3QkFBd0Isa0JBQWtCLEdBQUcsaUJBQWlCLGdDQUFnQyx5QkFBeUIsc0JBQXNCLHdCQUF3QixxQkFBcUIsR0FBRyx3QkFBd0IsOEJBQThCLEdBQUcsOEJBQThCLGlDQUFpQyxHQUFHLG9CQUFvQixpQ0FBaUMsR0FBRyxrQkFBa0IsMkJBQTJCLEdB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7Ozs7O0FDOU5EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdKQUF3SjtBQUN4SjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7QUNySEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEhBQThIO0FBQzlIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7OztBQ3JIRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFZ0Q7QUFDdEI7QUFDTjtBQUNHO0FBQ0U7QUFDRjtBQUNNO0FBQ047QUFDWTtBQUNaO0FBQ2M7QUFDZDtBQUNJO0FBQ0U7QUFDVDtBQUNNO0FBQ2Q7QUFDRztBQUM1QjtBQUMrQjtBQUMvQjtBQUNBLG1CQUFtQixnREFBSzs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNPLHlCQUF5QixnRUFBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsV0FBVztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0IsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxxQkFBcUIsaURBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxPQUFPLEtBQUssUUFBUSxNQUFNLE1BQU07QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEdBQUcsS0FBSyxRQUFRLE1BQU0sTUFBTTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixXQUFXO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixPQUFPLEdBQUcsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxrRkFBa0YsWUFBWTtBQUM5RjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxt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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixhQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVCQUF1QixtQkFBbUI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sNkVBQTZFLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLGdTQUFnUyxNQUFNLEtBQUssTUFBTSx3TEFBd0wsTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTTtBQUNwOUIscUJBQXFCLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLHVFQUF1RSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0saUNBQWlDLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxpSUFBaUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTTtBQUN4akMsNHFEQUE0cUQsTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUss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QUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsNEJBQTRCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7Ozs7Ozs7OztBQ3BEQSxlOzs7Ozs7Ozs7O0FDQUEsZTs7Ozs7Ozs7OztBQ0FBLGU7Ozs7Ozs7Ozs7QUNBQSxlOzs7Ozs7Ozs7O0FDQUEsZSIsImZpbGUiOiJub2RlX21vZHVsZXNfbW9tZW50X2xvY2FsZV9zeW5jX3JlY3Vyc2l2ZV8tcnVuZXN0b25lX2FjdGl2ZWNvZGVfanNfYWNmYWN0b3J5X2pzLmJ1bmRsZS5qcz92PTUzYTE5MTE5ZjBjNjgzZWM5ZWRkIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9jc3NXaXRoTWFwcGluZ1RvU3RyaW5nLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIubW9kYWwtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB3aWR0aDogNzAwcHg7XFxuICAgIHBhZGRpbmc6IDI1cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2YyZjJmMjtcXG4gICAgei1pbmRleDogNTA7XFxufVxcblxcbi5tb2RhbC1saWdodHNvdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHotaW5kZXg6IDI1O1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbn1cXG5cXG4ubW9kYWwtY2xvc2UtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaGVpZ2h0OiA0M3B4O1xcbiAgICB3aWR0aDogNDNweDtcXG4gICAgLypiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2Nsb3NlLnBuZycpOyAqL1xcbiAgICB0b3A6IDFweDtcXG4gICAgcmlnaHQ6IDAuNXB4O1xcbn1cXG5cXG4uYWNfYWN0aW9ucyB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmFjX3NlcCB7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luOiAtMTVweCAxMHB4O1xcbiAgICB3aWR0aDogMXB4O1xcbiAgICBoZWlnaHQ6IDM1cHg7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmFjX3NlY3Rpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+ICo6bm90KC5hY19zZWN0aW9uKSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLmNsZWFyZml4IHtcXG4gICAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi5hY19vdXRwdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG4uYWNfb3V0cHV0IHByZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcXG59XFxuXFxuLmFjX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4uYWNfY2FwdGlvbl90ZXh0IHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmFjX3F1ZXN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNCwgMjM2LCAyMTcpO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuLmFjdGl2ZV9vdXQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1pbi13aWR0aDogMjBlbTtcXG4gICAgbWF4LWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmlzaWJsZS1hYy1jYW52YXMge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAuY29sLW1kLTEyIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5mdWxsX3dpZHRoIG9sIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hYy1kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4uYWMtZmVlZGJhY2sge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogM3B4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBncmVlbjtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X2ZhaWx1cmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IHJlZDtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3J1bmVzdG9uZS9hY3RpdmVjb2RlL2Nzcy9hY3RpdmVjb2RlLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWixhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLCtCQUErQjtJQUMvQixvQ0FBb0M7SUFDcEMsdUNBQXVDO0lBQ3ZDLG1CQUFtQjtJQUNuQix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLG1CQUFtQjtJQUNuQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFdBQVc7SUFDWCxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixXQUFXO0lBQ1gsdUNBQXVDO0lBQ3ZDLFFBQVE7SUFDUixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFlBQVk7SUFDWixVQUFVO0lBQ1YsU0FBUztBQUNiOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIseUJBQXlCO0FBQzdCO0FBQ0E7SUFDSSwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsV0FBVztBQUNmOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLDJCQUEyQjtJQUMzQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixZQUFZO0lBQ1osV0FBVztJQUNYLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLDBCQUEwQjtBQUM5QlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIubW9kYWwtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICB3aWR0aDogNzAwcHg7XFxuICAgIHBhZGRpbmc6IDI1cHg7XFxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmY7XFxuICAgIGJveC1zaGFkb3c6IDBweCAycHggN3B4ICMyOTI5Mjk7XFxuICAgIC1tb3otYm94LXNoYWRvdzogMHB4IDJweCA3cHggIzI5MjkyOTtcXG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMnB4IDdweCAjMjkyOTI5O1xcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDEwcHg7XFxuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTBweDtcXG4gICAgYmFja2dyb3VuZDogI2YyZjJmMjtcXG4gICAgei1pbmRleDogNTA7XFxufVxcblxcbi5tb2RhbC1saWdodHNvdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIHotaW5kZXg6IDI1O1xcbiAgICBiYWNrZ3JvdW5kOiAjMDAwO1xcbn1cXG5cXG4ubW9kYWwtY2xvc2UtcHJvZmlsZSB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgaGVpZ2h0OiA0M3B4O1xcbiAgICB3aWR0aDogNDNweDtcXG4gICAgLypiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2Nsb3NlLnBuZycpOyAqL1xcbiAgICB0b3A6IDFweDtcXG4gICAgcmlnaHQ6IDAuNXB4O1xcbn1cXG5cXG4uYWNfYWN0aW9ucyB7XFxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuXFxuLmFjX3NlcCB7XFxuICAgIGJhY2tncm91bmQ6ICMwMDA7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgbWFyZ2luOiAtMTVweCAxMHB4O1xcbiAgICB3aWR0aDogMXB4O1xcbiAgICBoZWlnaHQ6IDM1cHg7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGJvcmRlcjogMDtcXG59XFxuXFxuLmFjX3NlY3Rpb24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG1heC13aWR0aDogODAwcHg7XFxuICAgIGNsZWFyOiBib3RoO1xcbn1cXG5cXG4uYWNfc2VjdGlvbiA+ICo6bm90KC5hY19zZWN0aW9uKSB7XFxuICAgIG1heC13aWR0aDogNTAwcHQ7XFxuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLmFjX3NlY3Rpb24gLmNsZWFyZml4IHtcXG4gICAgcG9zaXRpb246IGluaXRpYWw7XFxufVxcblxcbi5hY19vdXRwdXQge1xcbiAgICBkaXNwbGF5OiBub25lO1xcbiAgICBtYXgtd2lkdGg6IDQ1MHB4O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xcbn1cXG4uYWNfb3V0cHV0IHByZSB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTtcXG59XFxuXFxuLmFjX2NhcHRpb24ge1xcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG5cXG4uYWNfY2FwdGlvbl90ZXh0IHtcXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcXG59XFxuXFxuLmFjX3F1ZXN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNCwgMjM2LCAyMTcpO1xcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XFxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xcbiAgICBtYXJnaW46IDVweDtcXG59XFxuXFxuLmFjdGl2ZV9vdXQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGNkY2RjO1xcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XFxuICAgIG1pbi13aWR0aDogMjBlbTtcXG4gICAgbWF4LWhlaWdodDogMzAwcHg7XFxuICAgIG92ZXJmbG93OiBhdXRvO1xcbn1cXG5cXG4udmlzaWJsZS1hYy1jYW52YXMge1xcbiAgICBib3JkZXI6IDJweCBzb2xpZCBibGFjaztcXG59XFxuXFxuLmFjX3NlY3Rpb24gPiAuY29sLW1kLTEyIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5mdWxsX3dpZHRoIG9sIHtcXG4gICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hYy1kaXNhYmxlZCB7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xcbn1cXG5cXG4uYWMtZmVlZGJhY2sge1xcbiAgICBib3JkZXI6IDFweCBzb2xpZCBibGFjaztcXG4gICAgcGFkZGluZzogM3B4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JleTtcXG4gICAgcGFkZGluZzogMTBweDtcXG4gICAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbn1cXG5cXG4uYWNfc3FsX3Jlc3VsdF9zdWNjZXNzIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGNvbG9yOiBncmVlbjtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblxcbi5hY19zcWxfcmVzdWx0X2ZhaWx1cmUge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgY29sb3I6IHJlZDtcXG4gICAgYm9yZGVyOiAwcHg7XFxuICAgIHBhZGRpbmc6IDBweDtcXG4gICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgbWluLWhlaWdodDogMHB4ICFpbXBvcnRhbnQ7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJ2YXIgbWFwID0ge1xuXHRcIi4vYWZcIjogNDI3ODYsXG5cdFwiLi9hZi5qc1wiOiA0Mjc4Nixcblx0XCIuL2FyXCI6IDMwODY3LFxuXHRcIi4vYXItZHpcIjogMTQxMzAsXG5cdFwiLi9hci1kei5qc1wiOiAxNDEzMCxcblx0XCIuL2FyLWt3XCI6IDk2MTM1LFxuXHRcIi4vYXIta3cuanNcIjogOTYxMzUsXG5cdFwiLi9hci1seVwiOiA1NjQ0MCxcblx0XCIuL2FyLWx5LmpzXCI6IDU2NDQwLFxuXHRcIi4vYXItbWFcIjogNDc3MDIsXG5cdFwiLi9hci1tYS5qc1wiOiA0NzcwMixcblx0XCIuL2FyLXNhXCI6IDE2MDQwLFxuXHRcIi4vYXItc2EuanNcIjogMTYwNDAsXG5cdFwiLi9hci10blwiOiAzNzEwMCxcblx0XCIuL2FyLXRuLmpzXCI6IDM3MTAwLFxuXHRcIi4vYXIuanNcIjogMzA4NjcsXG5cdFwiLi9helwiOiAzMTA4Myxcblx0XCIuL2F6LmpzXCI6IDMxMDgzLFxuXHRcIi4vYmVcIjogOTgwOCxcblx0XCIuL2JlLmpzXCI6IDk4MDgsXG5cdFwiLi9iZ1wiOiA2ODMzOCxcblx0XCIuL2JnLmpzXCI6IDY4MzM4LFxuXHRcIi4vYm1cIjogNjc0MzgsXG5cdFwiLi9ibS5qc1wiOiA2NzQzOCxcblx0XCIuL2JuXCI6IDg5MDUsXG5cdFwiLi9ibi5qc1wiOiA4OTA1LFxuXHRcIi4vYm9cIjogMTE1NjAsXG5cdFwiLi9iby5qc1wiOiAxMTU2MCxcblx0XCIuL2JyXCI6IDEyNzgsXG5cdFwiLi9ici5qc1wiOiAxMjc4LFxuXHRcIi4vYnNcIjogODA2MjIsXG5cdFwiLi9icy5qc1wiOiA4MDYyMixcblx0XCIuL2NhXCI6IDI0NjgsXG5cdFwiLi9jYS5qc1wiOiAyNDY4LFxuXHRcIi4vY3NcIjogNTgyMixcblx0XCIuL2NzLmpzXCI6IDU4MjIsXG5cdFwiLi9jdlwiOiA1MDg3Nyxcblx0XCIuL2N2LmpzXCI6IDUwODc3LFxuXHRcIi4vY3lcIjogNDczNzMsXG5cdFwiLi9jeS5qc1wiOiA0NzM3Myxcblx0XCIuL2RhXCI6IDI0NzgwLFxuXHRcIi4vZGEuanNcIjogMjQ3ODAsXG5cdFwiLi9kZVwiOiA1OTc0MCxcblx0XCIuL2RlLWF0XCI6IDYwMjE3LFxuXHRcIi4vZGUtYXQuanNcIjogNjAyMTcsXG5cdFwiLi9kZS1jaFwiOiA2MDg5NCxcblx0XCIuL2RlLWNoLmpzXCI6IDYwODk0LFxuXHRcIi4vZGUuanNcIjogNTk3NDAsXG5cdFwiLi9kdlwiOiA1MzAwLFxuXHRcIi4vZHYuanNcIjogNTMwMCxcblx0XCIuL2VsXCI6IDUwODM3LFxuXHRcIi4vZWwuanNcIjogNTA4MzcsXG5cdFwiLi9lbi1hdVwiOiA3ODM0OCxcblx0XCIuL2VuLWF1LmpzXCI6IDc4MzQ4LFxuXHRcIi4vZW4tY2FcIjogNzc5MjUsXG5cdFwiLi9lbi1jYS5qc1wiOiA3NzkyNSxcblx0XCIuL2VuLWdiXCI6IDIyMjQzLFxuXHRcIi4vZW4tZ2IuanNcIjogMjIyNDMsXG5cdFwiLi9lbi1pZVwiOiA0NjQzNixcblx0XCIuL2VuLWllLmpzXCI6IDQ2NDM2LFxuXHRcIi4vZW4tbnpcIjogNzYzMTksXG5cdFwiLi9lbi1uei5qc1wiOiA3NjMxOSxcblx0XCIuL2VvXCI6IDkyOTE1LFxuXHRcIi4vZW8uanNcIjogOTI5MTUsXG5cdFwiLi9lc1wiOiA1NTY1NSxcblx0XCIuL2VzLWRvXCI6IDU1MjUxLFxuXHRcIi4vZXMtZG8uanNcIjogNTUyNTEsXG5cdFwiLi9lcy11c1wiOiA3MTE0Nixcblx0XCIuL2VzLXVzLmpzXCI6IDcxMTQ2LFxuXHRcIi4vZXMuanNcIjogNTU2NTUsXG5cdFwiLi9ldFwiOiA1NjAzLFxuXHRcIi4vZXQuanNcIjogNTYwMyxcblx0XCIuL2V1XCI6IDc3NzYzLFxuXHRcIi4vZXUuanNcIjogNzc3NjMsXG5cdFwiLi9mYVwiOiA3Njk1OSxcblx0XCIuL2ZhLmpzXCI6IDc2OTU5LFxuXHRcIi4vZmlcIjogMTE4OTcsXG5cdFwiLi9maS5qc1wiOiAxMTg5Nyxcblx0XCIuL2ZvXCI6IDk0Njk0LFxuXHRcIi4vZm8uanNcIjogOTQ2OTQsXG5cdFwiLi9mclwiOiA5NDQ3MCxcblx0XCIuL2ZyLWNhXCI6IDYzMDQ5LFxuXHRcIi4vZnItY2EuanNcIjogNjMwNDksXG5cdFwiLi9mci1jaFwiOiA1MjMzMCxcblx0XCIuL2ZyLWNoLmpzXCI6IDUyMzMwLFxuXHRcIi4vZnIuanNcIjogOTQ0NzAsXG5cdFwiLi9meVwiOiA1MDQ0LFxuXHRcIi4vZnkuanNcIjogNTA0NCxcblx0XCIuL2dkXCI6IDIxMDEsXG5cdFwiLi9nZC5qc1wiOiAyMTAxLFxuXHRcIi4vZ2xcIjogMzg3OTQsXG5cdFwiLi9nbC5qc1wiOiAzODc5NCxcblx0XCIuL2dvbS1sYXRuXCI6IDIzMTY4LFxuXHRcIi4vZ29tLWxhdG4uanNcIjogMjMxNjgsXG5cdFwiLi9ndVwiOiA5NTM0OSxcblx0XCIuL2d1LmpzXCI6IDk1MzQ5LFxuXHRcIi4vaGVcIjogMjQyMDYsXG5cdFwiLi9oZS5qc1wiOiAyNDIwNixcblx0XCIuL2hpXCI6IDMwMDk0LFxuXHRcIi4vaGkuanNcIjogMzAwOTQsXG5cdFwiLi9oclwiOiAzMDMxNixcblx0XCIuL2hyLmpzXCI6IDMwMzE2LFxuXHRcIi4vaHVcIjogMjIxMzgsXG5cdFwiLi9odS5qc1wiOiAyMjEzOCxcblx0XCIuL2h5LWFtXCI6IDExNDIzLFxuXHRcIi4vaHktYW0uanNcIjogMTE0MjMsXG5cdFwiLi9pZFwiOiAyOTIxOCxcblx0XCIuL2lkLmpzXCI6IDI5MjE4LFxuXHRcIi4vaXNcIjogOTAxMzUsXG5cdFwiLi9pcy5qc1wiOiA5MDEzNSxcblx0XCIuL2l0XCI6IDkwNjI2LFxuXHRcIi4vaXQuanNcIjogOTA2MjYsXG5cdFwiLi9qYVwiOiAzOTE4Myxcblx0XCIuL2phLmpzXCI6IDM5MTgzLFxuXHRcIi4vanZcIjogMjQyODYsXG5cdFwiLi9qdi5qc1wiOiAyNDI4Nixcblx0XCIuL2thXCI6IDQwNDE1LFxuXHRcIi4va2EuanNcIjogNDA0MTUsXG5cdFwiLi9ra1wiOiA0Nzc3Mixcblx0XCIuL2trLmpzXCI6IDQ3NzcyLFxuXHRcIi4va21cIjogMTg3NTgsXG5cdFwiLi9rbS5qc1wiOiAxODc1OCxcblx0XCIuL2tuXCI6IDc5MjgyLFxuXHRcIi4va24uanNcIjogNzkyODIsXG5cdFwiLi9rb1wiOiAzMzczMCxcblx0XCIuL2tvLmpzXCI6IDMzNzMwLFxuXHRcIi4va3lcIjogMzMyOTEsXG5cdFwiLi9reS5qc1wiOiAzMzI5MSxcblx0XCIuL2xiXCI6IDM2ODQxLFxuXHRcIi4vbGIuanNcIjogMzY4NDEsXG5cdFwiLi9sb1wiOiA1NTQ2Nixcblx0XCIuL2xvLmpzXCI6IDU1NDY2LFxuXHRcIi4vbHRcIjogNTcwMTAsXG5cdFwiLi9sdC5qc1wiOiA1NzAxMCxcblx0XCIuL2x2XCI6IDM3NTk1LFxuXHRcIi4vbHYuanNcIjogMzc1OTUsXG5cdFwiLi9tZVwiOiAzOTg2MSxcblx0XCIuL21lLmpzXCI6IDM5ODYxLFxuXHRcIi4vbWlcIjogMzU0OTMsXG5cdFwiLi9taS5qc1wiOiAzNTQ5Myxcblx0XCIuL21rXCI6IDk1OTY2LFxuXHRcIi4vbWsuanNcIjogOTU5NjYsXG5cdFwiLi9tbFwiOiA4NzM0MSxcblx0XCIuL21sLmpzXCI6IDg3MzQxLFxuXHRcIi4vbXJcIjogMTAzNzAsXG5cdFwiLi9tci5qc1wiOiAxMDM3MCxcblx0XCIuL21zXCI6IDk4NDcsXG5cdFwiLi9tcy1teVwiOiA0MTIzNyxcblx0XCIuL21zLW15LmpzXCI6IDQxMjM3LFxuXHRcIi4vbXMuanNcIjogOTg0Nyxcblx0XCIuL210XCI6IDcyMTI2LFxuXHRcIi4vbXQuanNcIjogNzIxMjYsXG5cdFwiLi9teVwiOiA1NjE2NSxcblx0XCIuL215LmpzXCI6IDU2MTY1LFxuXHRcIi4vbmJcIjogNjQ5MjQsXG5cdFwiLi9uYi5qc1wiOiA2NDkyNCxcblx0XCIuL25lXCI6IDE2NzQ0LFxuXHRcIi4vbmUuanNcIjogMTY3NDQsXG5cdFwiLi9ubFwiOiA5MzkwMSxcblx0XCIuL25sLWJlXCI6IDU5ODE0LFxuXHRcIi4vbmwtYmUuanNcIjogNTk4MTQsXG5cdFwiLi9ubC5qc1wiOiA5MzkwMSxcblx0XCIuL25uXCI6IDgzODc3LFxuXHRcIi4vbm4uanNcIjogODM4NzcsXG5cdFwiLi9wYS1pblwiOiAxNTg1OCxcblx0XCIuL3BhLWluLmpzXCI6IDE1ODU4LFxuXHRcIi4vcGxcIjogNjQ0OTUsXG5cdFwiLi9wbC5qc1wiOiA2NDQ5NSxcblx0XCIuL3B0XCI6IDg5NTIwLFxuXHRcIi4vcHQtYnJcIjogNTc5NzEsXG5cdFwiLi9wdC1ici5qc1wiOiA1Nzk3MSxcblx0XCIuL3B0LmpzXCI6IDg5NTIwLFxuXHRcIi4vcm9cIjogOTY0NTksXG5cdFwiLi9yby5qc1wiOiA5NjQ1OSxcblx0XCIuL3J1XCI6IDIxNzkzLFxuXHRcIi4vcnUuanNcIjogMjE3OTMsXG5cdFwiLi9zZFwiOiA0MDk1MCxcblx0XCIuL3NkLmpzXCI6IDQwOTUwLFxuXHRcIi4vc2VcIjogMTA0OTAsXG5cdFwiLi9zZS5qc1wiOiAxMDQ5MCxcblx0XCIuL3NpXCI6IDkwMTI0LFxuXHRcIi4vc2kuanNcIjogOTAxMjQsXG5cdFwiLi9za1wiOiA2NDI0OSxcblx0XCIuL3NrLmpzXCI6IDY0MjQ5LFxuXHRcIi4vc2xcIjogMTQ5ODUsXG5cdFwiLi9zbC5qc1wiOiAxNDk4NSxcblx0XCIuL3NxXCI6IDUxMTA0LFxuXHRcIi4vc3EuanNcIjogNTExMDQsXG5cdFwiLi9zclwiOiA0OTEzMSxcblx0XCIuL3NyLWN5cmxcIjogMTM3MDksXG5cdFwiLi9zci1jeXJsLmpzXCI6IDEzNzA5LFxuXHRcIi4vc3IuanNcIjogNDkxMzEsXG5cdFwiLi9zc1wiOiA4NTg5Myxcblx0XCIuL3NzLmpzXCI6IDg1ODkzLFxuXHRcIi4vc3ZcIjogOTg3NjAsXG5cdFwiLi9zdi5qc1wiOiA5ODc2MCxcblx0XCIuL3N3XCI6IDkxMTcyLFxuXHRcIi4vc3cuanNcIjogOTExNzIsXG5cdFwiLi90YVwiOiAyNzMzMyxcblx0XCIuL3RhLmpzXCI6IDI3MzMzLFxuXHRcIi4vdGVcIjogMjMxMTAsXG5cdFwiLi90ZS5qc1wiOiAyMzExMCxcblx0XCIuL3RldFwiOiA1MjA5NSxcblx0XCIuL3RldC5qc1wiOiA1MjA5NSxcblx0XCIuL3RoXCI6IDkwNDEsXG5cdFwiLi90aC5qc1wiOiA5MDQxLFxuXHRcIi4vdGwtcGhcIjogNzU3NjgsXG5cdFwiLi90bC1waC5qc1wiOiA3NTc2OCxcblx0XCIuL3RsaFwiOiA4OTQ0NCxcblx0XCIuL3RsaC5qc1wiOiA4OTQ0NCxcblx0XCIuL3RyXCI6IDcyMzk3LFxuXHRcIi4vdHIuanNcIjogNzIzOTcsXG5cdFwiLi90emxcIjogMjgyNTQsXG5cdFwiLi90emwuanNcIjogMjgyNTQsXG5cdFwiLi90em1cIjogNTExMDYsXG5cdFwiLi90em0tbGF0blwiOiAzMDY5OSxcblx0XCIuL3R6bS1sYXRuLmpzXCI6IDMwNjk5LFxuXHRcIi4vdHptLmpzXCI6IDUxMTA2LFxuXHRcIi4vdWtcIjogNjc2OTEsXG5cdFwiLi91ay5qc1wiOiA2NzY5MSxcblx0XCIuL3VyXCI6IDEzNzk1LFxuXHRcIi4vdXIuanNcIjogMTM3OTUsXG5cdFwiLi91elwiOiA2NzkxLFxuXHRcIi4vdXotbGF0blwiOiA2MDU4OCxcblx0XCIuL3V6LWxhdG4uanNcIjogNjA1ODgsXG5cdFwiLi91ei5qc1wiOiA2NzkxLFxuXHRcIi4vdmlcIjogNjU2NjYsXG5cdFwiLi92aS5qc1wiOiA2NTY2Nixcblx0XCIuL3gtcHNldWRvXCI6IDE0Mzc4LFxuXHRcIi4veC1wc2V1ZG8uanNcIjogMTQzNzgsXG5cdFwiLi95b1wiOiA3NTgwNSxcblx0XCIuL3lvLmpzXCI6IDc1ODA1LFxuXHRcIi4vemgtY25cIjogODM4MzksXG5cdFwiLi96aC1jbi5qc1wiOiA4MzgzOSxcblx0XCIuL3poLWhrXCI6IDU1NzI2LFxuXHRcIi4vemgtaGsuanNcIjogNTU3MjYsXG5cdFwiLi96aC10d1wiOiA3NDE1Mixcblx0XCIuL3poLXR3LmpzXCI6IDc0MTUyXG59O1xuXG5cbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHR2YXIgaWQgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKTtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oaWQpO1xufVxuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1hcCwgcmVxKSkge1xuXHRcdHZhciBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIHJlcSArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRyZXR1cm4gbWFwW3JlcV07XG59XG53ZWJwYWNrQ29udGV4dC5rZXlzID0gZnVuY3Rpb24gd2VicGFja0NvbnRleHRLZXlzKCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXMobWFwKTtcbn07XG53ZWJwYWNrQ29udGV4dC5yZXNvbHZlID0gd2VicGFja0NvbnRleHRSZXNvbHZlO1xubW9kdWxlLmV4cG9ydHMgPSB3ZWJwYWNrQ29udGV4dDtcbndlYnBhY2tDb250ZXh0LmlkID0gNDY3MDA7IiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uLy4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9hY3RpdmVjb2RlLmNzc1wiO1xuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRlbnQubG9jYWxzIHx8IHt9OyIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5pbXBvcnQgSlNBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfanMuanNcIjtcbmltcG9ydCBIVE1MQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2h0bWwuanNcIjtcbmltcG9ydCBTUUxBY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfc3FsLmpzXCI7XG5pbXBvcnQgQnJ5dGhvbkFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9icnl0aG9uLmpzXCI7XG5pbXBvcnQgTGl2ZUNvZGUgZnJvbSBcIi4vbGl2ZWNvZGUuanNcIjtcbmltcG9ydCB7XG4gICAgVGltZWRBY3RpdmVDb2RlLFxuICAgIFRpbWVkTGl2ZUNvZGUsXG4gICAgVGltZWRKU0FjdGl2ZUNvZGUsXG4gICAgVGltZWRIVE1MQWN0aXZlQ29kZSxcbiAgICBUaW1lZFNRTEFjdGl2ZUNvZGUsXG4gICAgVGltZWRCcnl0aG9uQWN0aXZlQ29kZSxcbn0gZnJvbSBcIi4vdGltZWRfYWN0aXZlY29kZVwiO1xuaW1wb3J0IFwiLi4vLi4vY29tbW9uL2pzL2pxdWVyeS5oaWdobGlnaHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQUNGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mb28gPSBcImJhclwiO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlQWN0aXZlQ29kZShvcmlnLCBsYW5nLCBhZGRvcHRzKSB7XG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgb3JpZzogb3JpZyxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiBlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcyxcbiAgICAgICAgICAgIHB5dGhvbjM6IGVCb29rQ29uZmlnLnB5dGhvbjMsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhZGRvcHRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBhdHRybmFtZSBpbiBhZGRvcHRzKSB7XG4gICAgICAgICAgICAgICAgb3B0c1thdHRybmFtZV0gPSBhZGRvcHRzW2F0dHJuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFuZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYW5nID0gJChvcHRzLm9yaWcpLmZpbmQoXCJbZGF0YS1sYW5nXVwiKS5kYXRhKFwibGFuZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGV4dF9hcmVhID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXVxuICAgICAgICB2YXIgcHl0aG9uM19pbnRlcnByZXRlciA9ICQodGV4dF9hcmVhKS5hdHRyKFwiZGF0YS1weXRob24zX2ludGVycHJldGVyXCIpO1xuICAgICAgICBpZiAob3B0cy50aW1lZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZihweXRob24zX2ludGVycHJldGVyPT09XCJicnl0aG9uXCIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRCcnl0aG9uQWN0aXZlQ29kZShvcHRzKTsgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYW5nID09PSBcInB5dGhvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiamF2YVwiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJjcHBcIiB8fFxuICAgICAgICAgICAgICAgIGxhbmcgPT09IFwiY1wiIHx8XG4gICAgICAgICAgICAgICAgbGFuZyA9PT0gXCJweXRob24zXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRMaXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVkSlNBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcImh0bWxtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZEhUTUxBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nID09PSBcInNxbFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lZFNRTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWRBY3RpdmVDb2RlKG9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChsYW5nID09PVwicHl0aG9uM1wiKSAmJiAocHl0aG9uM19pbnRlcnByZXRlciA9PT0gXCJicnl0aG9uXCIpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJyeXRob25BY3RpdmVDb2RlKG9wdHMpOyAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobGFuZyA9PT0gXCJqYXZhc2NyaXB0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpTQWN0aXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyA9PT0gXCJodG1sbWl4ZWRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSFRNTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgPT09IFwic3FsXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNRTEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIFtcImphdmFcIiwgXCJjcHBcIiwgXCJjXCIsIFwicHl0aG9uM1wiLCBcInB5dGhvbjJcIiwgXCJvY3RhdmVcIl0uaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgbGFuZ1xuICAgICAgICAgICAgICAgICkgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXZlQ29kZShvcHRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBweXRob25cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjdGl2ZUNvZGUob3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdXNlZCBieSB3ZWIycHkgY29udHJvbGxlcihzKVxuICAgIHN0YXRpYyBhZGRBY3RpdmVDb2RlVG9EaXYob3V0ZXJkaXZpZCwgYWNkaXZpZCwgc2lkLCBpbml0aWFsY29kZSwgbGFuZ3VhZ2UpIHtcbiAgICAgICAgdmFyIHRoZXByZSwgbmV3YWM7XG4gICAgICAgIHZhciBhY2RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFjZGl2aWQpO1xuICAgICAgICAkKGFjZGl2KS5lbXB0eSgpO1xuICAgICAgICB0aGVwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgIHRoZXByZVtcImRhdGEtY29tcG9uZW50XCJdID0gXCJhY3RpdmVjb2RlXCI7XG4gICAgICAgIHRoZXByZS5pZCA9IG91dGVyZGl2aWQ7XG4gICAgICAgICQodGhlcHJlKS5kYXRhKFwibGFuZ1wiLCBsYW5ndWFnZSk7XG4gICAgICAgICQoYWNkaXYpLmFwcGVuZCh0aGVwcmUpO1xuICAgICAgICB2YXIgb3B0cyA9IHtcbiAgICAgICAgICAgIG9yaWc6IHRoZXByZSxcbiAgICAgICAgICAgIHVzZVJ1bmVzdG9uZVNlcnZpY2VzOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgYWRkb3B0cyA9IHtcbiAgICAgICAgICAgIHNpZDogc2lkLFxuICAgICAgICAgICAgZ3JhZGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAobGFuZ3VhZ2UgPT09IFwiaHRtbG1peGVkXCIpIHtcbiAgICAgICAgICAgIGFkZG9wdHNbXCJ2ZXJ0aWNhbFwiXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbmV3YWMgPSBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZSh0aGVwcmUsIGxhbmd1YWdlLCBhZGRvcHRzKTtcbiAgICAgICAgdmFyIHNhdmVkaXYgPSBuZXdhYy5kaXZpZDtcbiAgICAgICAgbmV3YWMuZGl2aWQgPSBzYXZlZGl2O1xuICAgICAgICBuZXdhYy5lZGl0b3Iuc2V0U2l6ZSg1MDAsIDMwMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbmV3YWMuZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZUFjdGl2ZUNvZGVGcm9tT3B0cyhvcHRzKSB7XG4gICAgICAgIHJldHVybiBBQ0ZhY3RvcnkuY3JlYXRlQWN0aXZlQ29kZShvcHRzLm9yaWcsIG9wdHMubGFuZywgb3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGVTY3JhdGNoQWN0aXZlY29kZSgpIHtcbiAgICAgICAgLyogc2V0IHVwIHRoZSBzY3JhdGNoIEFjdGl2ZWNvZGUgZWRpdG9yIGluIHRoZSBzZWFyY2ggbWVudSAqL1xuICAgICAgICAvLyB1c2UgdGhlIFVSTCB0byBhc3NpZ24gYSBkaXZpZCAtIGVhY2ggcGFnZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBBY3RpdmVjb2RlIGJsb2NrIGlkLlxuICAgICAgICAvLyBSZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBVUkwgYnV0IHRoZSBjb3Vyc2UgYW5kIHBhZ2UgbmFtZVxuICAgICAgICAvLyB0b2RvOiAgdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBlbGltaW5hdGVkIGFuZCBzaW1wbHkgbW92ZWQgdG8gdGhlIHRlbXBsYXRlIGZpbGVcblxuICAgICAgICBpZiAoZUJvb2tDb25maWcuZW5hYmxlU2NyYXRjaEFDID09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGRpdmlkID0gZUJvb2tDb25maWcuY291cnNlICsgXCJfc2NyYXRjaF9hY1wiO1xuICAgICAgICBkaXZpZCA9IGRpdmlkLnJlcGxhY2UoL1sjLl0vZywgXCJcIik7IC8vIGluIGNhc2UgYm9vayB0aXRsZSBoYXMgY2hhcmFjdGVycyB0aGF0IHdpbGwgbWVzcyB1cCBvdXIgc2VsZWN0b3JzXG4gICAgICAgIGVCb29rQ29uZmlnLnNjcmF0Y2hEaXYgPSBkaXZpZDtcbiAgICAgICAgbGV0IHN0ZGluID0gXCJcIjtcbiAgICAgICAgdmFyIGxhbmcgPSBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgPyBlQm9va0NvbmZpZy5hY0RlZmF1bHRMYW5ndWFnZVxuICAgICAgICAgICAgOiBcInB5dGhvblwiO1xuICAgICAgICBpZiAobGFuZyA9PT0gXCJqYXZhXCIgfHwgbGFuZyA9PT0gXCJjcHBcIiB8fCBsYW5nID09PSBcInB5dGhvbjNcIikge1xuICAgICAgICAgICAgc3RkaW4gPSBgZGF0YS1zdGRpbj1cInRleHQgZm9yIHN0ZGluXCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBIVE1MXG4gICAgICAgIHZhciBodG1sID0gYDxkaXYgaWQ9XCJhY19tb2RhbF8ke2RpdmlkfVwiIGNsYXNzPVwibW9kYWwgZmFkZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIHNjcmF0Y2gtYWMtbW9kYWxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+U2NyYXRjaCBBY3RpdmVDb2RlPC9oND5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1jb21wb25lbnQ9XCJhY3RpdmVjb2RlXCIgaWQ9JHtkaXZpZH0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSR7ZGl2aWR9X3F1ZXN0aW9uIGNsYXNzPVwiYWNfcXVlc3Rpb25cIj48cD5Vc2UgdGhpcyBhcmVhIGZvciB3cml0aW5nIGNvZGUgb3IgdGFraW5nIG5vdGVzLjwvcD48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBkYXRhLWNvZGVsZW5zPVwidHJ1ZVwiIGRhdGEtbGFuZz1cIiR7bGFuZ31cIiAke3N0ZGlufT5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgdmFyIGVsID0gJChodG1sKTtcbiAgICAgICAgJChcImJvZHlcIikuYXBwZW5kKGVsKTtcbiAgICAgICAgZWwub24oXCJzaG93bi5icy5tb2RhbCBzaG93LmJzLm1vZGFsXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVsLmZpbmQoXCIuQ29kZU1pcnJvclwiKS5lYWNoKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgZS5Db2RlTWlycm9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgICAgICBlLkNvZGVNaXJyb3IuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIHRvZ2dsZVNjcmF0Y2hBY3RpdmVjb2RlKCkge1xuICAgICAgICB2YXIgZGl2aWQgPSBcImFjX21vZGFsX1wiICsgZUJvb2tDb25maWcuc2NyYXRjaERpdjtcbiAgICAgICAgdmFyIGRpdiA9ICQoXCIjXCIgKyBkaXZpZCk7XG4gICAgICAgICQoYCMke2VCb29rQ29uZmlnLnNjcmF0Y2hEaXZ9YCkucmVtb3ZlQ2xhc3MoXCJhY19zZWN0aW9uXCIpO1xuICAgICAgICBkaXYubW9kYWwoXCJ0b2dnbGVcIik7XG4gICAgfVxufVxuXG4vL1xuLy8gUGFnZSBJbml0aWFsaXphdGlvblxuLy9cblxuJChkb2N1bWVudCkuYmluZChcInJ1bmVzdG9uZTpsb2dpbi1jb21wbGV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgQUNGYWN0b3J5LmNyZWF0ZVNjcmF0Y2hBY3RpdmVjb2RlKCk7XG4gICAgJChcIltkYXRhLWNvbXBvbmVudD1hY3RpdmVjb2RlXVwiKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdChcIltkYXRhLWNvbXBvbmVudD10aW1lZEFzc2Vzc21lbnRdXCIpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgZXhpc3RzIHdpdGhpbiBhIHRpbWVkIGNvbXBvbmVudCwgZG9uJ3QgcmVuZGVyIGl0IGhlcmVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmVkTGlzdFt0aGlzLmlkXSA9IEFDRmFjdG9yeS5jcmVhdGVBY3RpdmVDb2RlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoXCJ0ZXh0YXJlYVwiKS5kYXRhKFwibGFuZ1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3IgcmVuZGVyaW5nIEFjdGl2ZWNvZGUgUHJvYmxlbSAke3RoaXMuaWR9XG4gICAgICAgICAgICAgICAgRGV0YWlsczogJHtlcnJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobG9nZ2Vkb3V0KSB7XG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5kaXNhYmxlU2F2ZUxvYWQoKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGsgaW4gd2luZG93LmVkTGlzdCkge1xuICAgICAgICAgICAgd2luZG93LmVkTGlzdFtrXS5lbmFibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmlmICh0eXBlb2Ygd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgd2luZG93LmNvbXBvbmVudF9mYWN0b3J5ID0ge307XG59XG5cbndpbmRvdy5jb21wb25lbnRfZmFjdG9yeS5hY3RpdmVjb2RlID0gQUNGYWN0b3J5LmNyZWF0ZUFjdGl2ZUNvZGVGcm9tT3B0cztcblxuLy8gVGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZXhwb3NlIHRoaXMgb3V0c2lkZSB0aGUgbW9kdWxlLlxud2luZG93LkFDRmFjdG9yeSA9IEFDRmFjdG9yeTtcblxuLy8gVGhpcyBzZWVtcyBhIGJpdCBoYWNreSBhbmQgcG9zc2libHkgYnJpdHRsZSwgYnV0IGl0cyBoYXJkIHRvIGtub3cgaG93IGxvbmcgaXQgd2lsbCB0YWtlIHRvXG4vLyBmaWd1cmUgb3V0IHRoZSBsb2dpbi9sb2dvdXQgc3RhdHVzIG9mIHRoZSB1c2VyLiAgU29tZXRpbWVzIGl0cyBpbW1lZGlhdGUsIGFuZCBzb21ldGltZXMgaXRzXG4vLyBsb25nLiAgU28gdG8gYmUgc2FmZSB3ZSdsbCBkbyBpdCBib3RoIHdheXMuLlxudmFyIGxvZ2dlZG91dDtcbiQoZG9jdW1lbnQpLmJpbmQoXCJydW5lc3RvbmU6bG9nb3V0XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBsb2dnZWRvdXQgPSB0cnVlO1xufSk7XG4kKGRvY3VtZW50KS5iaW5kKFwicnVuZXN0b25lOmxvZ291dFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChsZXQgayBpbiB3aW5kb3cuZWRMaXN0KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0Lmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICB3aW5kb3cuZWRMaXN0W2tdLmRpc2FibGVTYXZlTG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG4iLCIkLmkxOG4oKS5sb2FkKHtcbiAgICBlbjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwiTG9hZCBIaXN0b3J5XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXI6IFwiQXVkaW8gVG91clwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkZWRfY29kZTogXCJMb2FkZWQgeW91ciBzYXZlZCBjb2RlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcIk5vIHNhdmVkIGNvZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIlJ1blwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrOiBcIlNob3cgRmVlZGJhY2tcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlOiBcIlNob3cgQ29kZVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGU6IFwiSGlkZSBDb2RlXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZWxlbnM6IFwiU2hvdyBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zOiBcIlNob3cgaW4gQ29kZUxlbnNcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCJIaWRlIENvZGVsZW5zXCIsXG5cbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcGFyc2VfZXJyb3I6XG4gICAgICAgICAgICBcIkEgcGFyc2UgZXJyb3IgbWVhbnMgdGhhdCBQeXRob24gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgc3ludGF4IG9uIHRoZSBsaW5lIHRoZSBlcnJvciBtZXNzYWdlIHBvaW50cyBvdXQuIENvbW1vbiBleGFtcGxlcyBhcmUgZm9yZ2V0dGluZyBjb21tYXMgYmV0ZXdlZW4gYXJndW1lbnRzIG9yIGZvcmdldHRpbmcgYSA6IG9uIGEgZm9yIHN0YXRlbWVudFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRvIGZpeCBhIHBhcnNlIGVycm9yIHlvdSBqdXN0IG5lZWQgdG8gbG9vayBjYXJlZnVsbHkgYXQgdGhlIGxpbmUgd2l0aCB0aGUgZXJyb3IgYW5kIHBvc3NpYmx5IHRoZSBsaW5lIGJlZm9yZSBpdC4gIE1ha2Ugc3VyZSBpdCBjb25mb3JtcyB0byBhbGwgb2YgUHl0aG9uJ3MgcnVsZXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3I6XG4gICAgICAgICAgICBcIlR5cGUgZXJyb3JzIG1vc3Qgb2Z0ZW4gb2NjdXIgd2hlbiBhbiBleHByZXNzaW9uIHRyaWVzIHRvIGNvbWJpbmUgdHdvIG9iamVjdHMgd2l0aCB0eXBlcyB0aGF0IHNob3VsZCBub3QgYmUgY29tYmluZWQuICBMaWtlIHJhaXNpbmcgYSBzdHJpbmcgdG8gYSBwb3dlclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVG8gZml4IGEgdHlwZSBlcnJvciB5b3Ugd2lsbCBtb3N0IGxpa2VseSBuZWVkIHRvIHRyYWNlIHRocm91Z2ggeW91ciBjb2RlIGFuZCBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBoYXZlIHRoZSB0eXBlcyB5b3UgZXhwZWN0IHRoZW0gdG8gaGF2ZS4gIEl0IG1heSBiZSBoZWxwZnVsIHRvIHByaW50IG91dCBlYWNoIHZhcmlhYmxlIGFsb25nIHRoZSB3YXkgdG8gYmUgc3VyZSBpdHMgdmFsdWUgaXMgd2hhdCB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yOlxuICAgICAgICAgICAgXCJBIG5hbWUgZXJyb3IgYWxtb3N0IGFsd2F5cyBtZWFucyB0aGF0IHlvdSBoYXZlIHVzZWQgYSB2YXJpYWJsZSBiZWZvcmUgaXQgaGFzIGEgdmFsdWUuICBPZnRlbiB0aGlzIG1heSBiZSBhIHNpbXBsZSB0eXBvLCBzbyBjaGVjayB0aGUgc3BlbGxpbmcgY2FyZWZ1bGx5LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIHlvdXIgZnVuY3Rpb24gY2FsbHMsIHRoaXMgaXMgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciBhIE5hbWVFcnJvciB0byBiZSBmb3VuZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3I6XG4gICAgICAgICAgICBcIkEgVmFsdWVFcnJvciBtb3N0IG9mdGVuIG9jY3VycyB3aGVuIHlvdSBwYXNzIGEgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBpcyBleHBlY3Rpbmcgb25lIHR5cGUgYW5kIHlvdSBwYXNzIGFub3RoZXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGhlIGVycm9yIG1lc3NhZ2UgZ2l2ZXMgeW91IGEgcHJldHR5IGdvb2QgaGludCBhYm91dCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYXMgd2VsbCBhcyB0aGUgdmFsdWUgdGhhdCBpcyBpbmNvcnJlY3QuIExvb2sgYXQgdGhlIGVycm9yIG1lc3NhZ2UgY2xvc2VseSBhbmQgdGhlbiB0cmFjZSBiYWNrIHRvIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBwcm9ibGVtYXRpYyB2YWx1ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXR0cmlidXRlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG1lc3NhZ2UgaXMgdGVsbGluZyB5b3UgdGhhdCB0aGUgb2JqZWN0IG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgZG90LCBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGUgb3IgbWV0aG9kIG9uIHRoZSByaWdodCBoYW5kIHNpZGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlRoZSBtb3N0IGNvbW1vbiB2YXJpYW50IG9mIHRoaXMgbWVzc2FnZSBpcyB0aGF0IHRoZSBvYmplY3QgdW5kZWZpbmVkIGRvZXMgbm90IGhhdmUgYXR0cmlidXRlIFguICBUaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSBvYmplY3Qgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBkb3QgaXMgbm90IHdoYXQgeW91IHRoaW5rLiBUcmFjZSB0aGUgdmFyaWFibGUgYmFjayBhbmQgcHJpbnQgaXQgb3V0IGluIHZhcmlvdXMgcGxhY2VzIHVudGlsIHlvdSBkaXNjb3ZlciB3aGVyZSBpdCBiZWNvbWVzIHVuZGVmaW5lZC4gIE90aGVyd2lzZSBjaGVjayB0aGUgYXR0cmlidXRlIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGRvdCBmb3IgYSB0eXBvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcbiAgICAgICAgICAgIFwiTW9zdCBvZiB0aGUgdGltZSB0aGlzIGVycm9yIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGZvcmdvdHRlbiBhIHJpZ2h0IHBhcmVudGhlc2lzIG9yIGhhdmUgZm9yZ290dGVuIHRvIGNsb3NlIGEgcGFpciBvZiBxdW90ZXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgZWFjaCBsaW5lIG9mIHlvdXIgcHJvZ3JhbSBhbmQgbWFrZSBzdXJlIHRoYXQgeW91ciBwYXJlbnRoZXNpcyBhcmUgYmFsYW5jZWQuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3RpbWVfbGltaXRfZXJyb3I6XG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIHRvbyBsb25nLiAgTW9zdCBwcm9ncmFtcyBpbiB0aGlzIGJvb2sgc2hvdWxkIHJ1biBpbiBsZXNzIHRoYW4gMTAgc2Vjb25kcyBlYXNpbHkuIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbml0ZSBsb29wLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQWRkIHNvbWUgcHJpbnQgc3RhdGVtZW50cyB0byBmaWd1cmUgb3V0IGlmIHlvdXIgcHJvZ3JhbSBpcyBpbiBhbiBpbmZpbnRlIGxvb3AuICBJZiBpdCBpcyBub3QgeW91IGNhbiBpbmNyZWFzZSB0aGUgcnVuIHRpbWUgd2l0aCBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXNlY3MpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XG4gICAgICAgICAgICBcIllvdXIgcHJvZ3JhbSBpcyBydW5uaW5nIGZvciB0b28gbG9uZy4gIE1vc3QgcHJvZ3JhbXMgaW4gdGhpcyBib29rIHNob3VsZCBydW4gaW4gbGVzcyB0aGFuIDMwIHNlY29uZHMgZWFzaWx5LiBUaGlzIHByb2JhYmx5IGluZGljYXRlcyB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW5pdGUgbG9vcC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkFkZCBzb21lIHByaW50IHN0YXRlbWVudHMgdG8gZmlndXJlIG91dCBpZiB5b3VyIHByb2dyYW0gaXMgaW4gYW4gaW5maW50ZSBsb29wLiAgSWYgaXQgaXMgbm90IHlvdSBjYW4gaW5jcmVhc2UgdGhlIHJ1biB0aW1lIHdpdGggc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zZWNzKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCBQeXRob24gY2FuJ3QgZmlndXJlIG91dCB0aGUgc3ludGF4IG9mIGEgcGFydGljdWxhciBzdGF0ZW1lbnQuICBTb21lIGV4YW1wbGVzIGFyZSBhc3NpZ25pbmcgdG8gYSBsaXRlcmFsLCBvciBhIGZ1bmN0aW9uIGNhbGxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3ludGF4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgeW91ciBhc3NpZ25tZW50IHN0YXRlbWVudHMgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudCBpcyBhIHZhcmlhYmxlLCBub3QgYSBsaXRlcmFsIG9yIGEgZnVuY3Rpb24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGFjY2VzcyBhbiBlbGVtZW50IG9mIGEgZGljdGlvbmFyeSwgYnV0IHRoZSBkaWN0aW9uYXJ5IGRvZXMgbm90IGhhdmUgdGhhdCB0aGUga2V5IHlvdSBhcmUgdXNpbmcuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2tleV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIllvdSBtYXkgaGF2ZSBhIHR5cG8gaW4gdGhlIG5hbWUgb2YgeW91ciBrZXkuICBJdCBpcyBhbHNvIGdvb2QgcHJhY3RpY2UgdG8gY2hlY2sgaWYgdGhlIGtleSBleGlzdHMgdXNpbmcgYSBzdGF0ZW1lbnQgbGlrZSBpZiBrZXkgaW4gbXlkaWN0LiAgWW91IGNhbiBhbHNvIHVzZSBteWRpY3QuZ2V0KGtleSxkZWZhdWx0dmFsdWUpIHNvIHRoYXQgaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkgeW91IGdldCB0aGUgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGVycm9yLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBtZXNzYWdlIG1lYW5zIHRoYXQgeW91IGFyZSB0cnlpbmcgdG8gaW5kZXggcGFzdCB0aGUgZW5kIG9mIGEgc3RyaW5nIG9yIGEgbGlzdC4gIEZvciBleGFtcGxlIGlmIHlvdXIgbGlzdCBoYXMgMyB0aGluZ3MgaW4gaXQgYW5kIHlvdSB0cnkgdG8gYWNjZXNzIHRoZSBpdGVtIGF0IHBvc2l0aW9uIDMgb3IgbW9yZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJSZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBpdGVtIGluIGEgbGlzdCBvciBzdHJpbmcgaXMgYXQgaW5kZXggcG9zaXRpb24gMCwgcXVpdGUgb2Z0ZW4gdGhpcyBtZXNzYWdlIGNvbWVzIGFib3V0IGJlY2F1c2UgeW91IGFyZSBvZmYgYnkgb25lLiAgUmVtZW1iZXIgaW4gYSBsaXN0IG9mIGxlbmd0aCAzIHRoZSBsYXN0IGxlZ2FsIGluZGV4IGlzIDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yOiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV91cmlfZXJyb3JfZml4OiBcIlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBleGlzdFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbXBvcnRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJPbmUgcHJvYmxlbSBtYXkgc2ltcGx5IGJlIHRoYXQgeW91IGhhdmUgYSB0eXBvLiAgSXQgbWF5IGFsc28gYmUgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBpbXBvcnQgYSBtb2R1bGUgdGhhdCBleGlzdHMgaW4gJ3JlYWwnIFB5dGhvbiwgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYm9vay4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHBsZWFzZSBzdWJtaXQgYSBmZWF0dXJlIHJlcXVlc3QgdG8gaGF2ZSB0aGUgbW9kdWxlIGFkZGVkLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XG4gICAgICAgICAgICBcIlRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gaW50ZXJuYWwgZXJyb3IsIHBhcnRpY3VsYXJseSBpZiB0aGUgbWVzc2FnZSByZWZlcmVuY2VzIHRoZSBjb25zb2xlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUcnkgcmVmcmVzaGluZyB0aGUgd2VicGFnZSwgYW5kIGlmIHRoZSBlcnJvciBjb250aW51ZXMsIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgYWxvbmcgd2l0aCB5b3VyIGNvZGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyB0ZWxscyB5b3UgdGhhdCB5b3UgYXJlIHRyeWluZyB0byBkaXZpZGUgYnkgMC4gVHlwaWNhbGx5IHRoaXMgaXMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBkZW5vbWluYXRvciBvZiBhIGRpdmlzaW9uIGV4cHJlc3Npb24gaGFzIHRoZSB2YWx1ZSAwXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJZb3UgbWF5IG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGRpdmlkaW5nIGJ5IDAgd2l0aCBhbiBpZiBzdGF0bWVudCwgb3IgeW91IG1heSBuZWVkIHRvIHJleGFtaW5lIHlvdXIgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGxlZ2FsIHZhbHVlcyBvZiB2YXJpYWJsZXMsIGl0IGNvdWxkIGJlIGFuIGVhcmxpZXIgc3RhdG1lbnQgdGhhdCBpcyB1bmV4cGVjdGVkbHkgYXNzaWduaW5nIGEgdmFsdWUgb2YgemVybyB0byB0aGUgdmFyaWFibGUgaW4gcXVlc3Rpb24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIG1lc3NhZ2UgYWxtb3N0IGFsd2F5cyBzaG93cyB1cCBpbiB0aGUgZm9ybSBvZiBNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJUaGlzIGFsd2F5cyBvY2N1cnMgd2hlbiBhIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZi4gIEl0cyBwcmV0dHkgbGlrZWx5IHRoYXQgeW91IGFyZSBub3QgZG9pbmcgdGhpcyBvbiBwdXJwb3NlLiBFeGNlcHQgaW4gdGhlIGNoYXB0ZXIgb24gcmVjdXJzaW9uLiAgSWYgeW91IGFyZSBpbiB0aGF0IGNoYXB0ZXIgdGhlbiBpdHMgbGlrZWx5IHlvdSBoYXZlbid0IGlkZW50aWZpZWQgYSBnb29kIGJhc2UgY2FzZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW50ZXJuYWxfZXJyb3I6XG4gICAgICAgICAgICBcIkFuIEludGVybmFsIGVycm9yIG1heSBtZWFuIHRoYXQgeW91J3ZlIHRyaWdnZXJlZCBhIGJ1ZyBpbiBvdXIgUHl0aG9uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUmVwb3J0IHRoaXMgZXJyb3IsIGFsb25nIHdpdGggeW91ciBjb2RlIGFzIGEgYnVnLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB5b3UgaGF2ZSBub3QgaW5kZW50ZWQgeW91ciBjb2RlIHByb3Blcmx5LiAgVGhpcyBpcyBtb3N0IGxpa2VseSB0byBoYXBwZW4gYXMgcGFydCBvZiBhbiBpZiwgZm9yLCB3aGlsZSBvciBkZWYgc3RhdGVtZW50LlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZWNrIHlvdXIgaWYsIGRlZiwgZm9yLCBhbmQgd2hpbGUgc3RhdGVtZW50cyB0byBiZSBzdXJlIHRoZSBsaW5lcyBhcmUgcHJvcGVybHkgaW5kZW50ZWQgYmVuZWF0aCB0aGVtLiAgQW5vdGhlciBzb3VyY2Ugb2YgdGhpcyBlcnJvciBjb21lcyBmcm9tIGNvcHlpbmcgYW5kIHBhc3RpbmcgY29kZSB3aGVyZSB5b3UgaGF2ZSBhY2NpZGVudGFsbHkgbGVmdCBzb21lIGJpdHMgb2YgY29kZSBseWluZyBhcm91bmQgdGhhdCBkb24ndCBiZWxvbmcgdGhlcmUgYW55bW9yZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yOlxuICAgICAgICAgICAgXCJUaGlzIGVycm9yIG9jY3VycyB3aGVuIHlvdSB0cnkgdG8gdXNlIGEgYnVpbHRpbiBmdW5jdGlvbiBvZiBQeXRob24gdGhhdCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhpcyBpbi1icm93c2VyIHZlcnNpb24gb2YgUHl0aG9uLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJGb3Igbm93IHRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byBub3QgdXNlIHRoZSBmdW5jdGlvbi4gIFRoZXJlIG1heSBiZSB3b3JrYXJvdW5kcy4gIElmIHlvdSByZWFsbHkgbmVlZCB0aGlzIGJ1aWx0aW4gZnVuY3Rpb24gdGhlbiBmaWxlIGEgYnVnIHJlcG9ydCBhbmQgdGVsbCB1cyBob3cgeW91IGFyZSB0cnlpbmcgdG8gdXNlIHRoZSBmdW5jdGlvbi5cIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZDogXCJGaWxlIG5vdCBmb3VuZDogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcbiAgICAgICAgICAgIFwiW0Vycm5vIDJdIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICckMSdcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc3RhcnRpbmc6IFwiQ2xpY2sgdGhlIHBsYXkgYnV0dG9uIHRvIGJlZ2luIHRoZSAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIlBsYXlpbmcgdGhlICQxXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRpbmdfYXVkaW86XG4gICAgICAgICAgICBcIkxvYWRpbmcgYXVkaW8uICBQbGVhc2Ugd2FpdC4gICBJZiB0aGUgdG91ciBkb2Vzbid0IHN0YXJ0IHNvb24gY2xpY2sgb24gdGhlIGxlZnRtb3N0IGNvbnRyb2wgYnV0dG9uIChQbGF5IGZpcnN0IGF1ZGlvIGluIHRvdXIpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2UgY3VycmVudCBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzZSBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpbzogXCJQbGF5IHBhdXNlZCBhdWRpb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWQ6XG4gICAgICAgICAgICBcIlRoZSAkMSBoYXMgYmVlbiBwYXVzZWQuIENsaWNrIG9uIHRoZSBwbGF5IGJ1dHRvbiB0byByZXN1bWUgdGhlIHRvdXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2lucHV0X3ByZzogXCJJbnB1dCBmb3IgUHJvZ3JhbVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XG4gICAgICAgICAgICBcIlRoZXJlIHdlcmUgZXJyb3JzIGNvbXBpbGluZyB5b3VyIGNvZGUuIFNlZSBiZWxvdy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGM6IFwiVGltZSBMaW1pdCBFeGNlZWRlZCBvbiB5b3VyIHByb2dyYW1cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2VydmVyX2VycjogXCJBIHNlcnZlciBlcnJvciBvY2N1cnJlZDogJDEgJDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XG4gICAgICAgICAgICBcIkNvbXBpbGluZyBhbmQgUnVubmluZyB5b3VyIENvZGUgTm93Li4uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2F2ZSAmIFJ1blwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZW5kZXI6IFwiU2F2ZSAmIFJlbmRlclwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hc3NlcnRpb25fZXJyb3I6XG4gICAgICAgICAgICBcIkFuIGFzc2VydGlvbiBlcnJvciBoYXBwZW5zIHdoZW4gcHl0aG9uIGVuY291bnRlcnMgYW4gYXNzZXJ0aW9uIHN0YXRlbWVudC4gIFB5dGhvbiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSB3b3JkIGFzc2VydDsgaWYgdGhhdCBleHByZXNzaW9uIGlzIFRydWUgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCB0aGUgcHJvZ3JhbSBjb250aW51ZXMuICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBGYWxzZSBQeXRob24gcmFpc2VzIGFuIGVycm9yIGFuZCBzdG9wcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlY2sgdGhlIGV4cHJlc3Npb24gdG8gdGhlIHJpZ2h0IG9mIGFzc2VydC4gIFRoZSBleHByZXNzaW9uIGlzIEZhbHNlIGFuZCB5b3Ugd2lsbCBuZWVkIHRvIGRldGVybWluZSB3aHkgdGhhdCBpcy4gIFlvdSBtYXkgd2FudCB0byBzaW1wbHkgcHJpbnQgb3V0IHRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBleHByZXNzaW9uIHRvIHVuZGVyc3RhbmQgd2h5IGl0IGlzIGV2YWx1YXRpbmcgdG8gRmFsc2UuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiTG9hZGluZyBEQi4uLlwiLFxuICAgIH0sXG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIFwicHQtYnJcIjoge1xuICAgICAgICBtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3Rvcnk6IFwiQ2FycmVnYXIgaGlzdMOzcmljb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcIlRvdXIgZGUgw6F1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRlZF9jb2RlOiBcIkPDs2RpZ28gc2Fsdm8gY2FycmVnYWRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19zYXZlZF9jb2RlOiBcIk7Do28gaMOhIGPDs2RpZ28gc2Fsdm8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3J1bl9jb2RlOiBcIkV4ZWN1dGFyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfZmVlZGJhY2s6IFwiRXhpYmlyIEZlZWRiYWNrc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGU6IFwiTW9zdHJhciBDw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZTogXCJPY3VsdGFyIEPDs2RpZ29cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuczogXCJNb3N0cmFyIENvZGVMZW5zXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwiTW9zdHJhciBlbSBDb2RlTGVuc1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zOiBcIk9jdWx0YXIgQ29kZWxlbnNcIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXJzZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBQYXJzZSBzaWduaWZpY2EgcXVlIFB5dGhvbiBuw6NvIGVudGVuZGUgYSBzaW50YXhlIGRhIGxpbmhhIHF1ZSBhIG1lbnNhZ2VtIGRlIGVycm8gYXBvbnRhLiBFeGVtcGxvcyBjb211bnMgc8OjbyBlc3F1ZWNlciB2w61yZ3VsYXMgZW50cmUgYXJndW1lbnRvcyBvdSBlc3F1ZWNlciAnOicgZW0gdW0gY29tYW5kbyBmb3IuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIFBhcnNlLCB2b2PDqiBzw7MgcHJlY2lzYSBvbGhhciBjdWlkYWRvc2FtZW50ZSBhIGxpbmhhIGNvbSBvIGVycm8gZSBwb3NzaXZlbG1lbnRlIGEgbGluaGEgYW50ZXMgZGVsYS4gVGVuaGEgY2VydGV6YSBxdWUgZXN0w6NvIGRlIGFjb3JkbyBjb20gdG9kYXMgYXMgcmVncmFzIGRlIFB5dGhvbi5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXJyb3MgZGUgdGlwYWdlbSBvY29ycmVtIG1haXMgZnJlcXVlbnRlbWVudGUgcXVhbmRvIHVtYSBleHByZXNzw6NvIHRlbnRhIGNvbWJpbmFyIGRvaXMgb2JqZXRvcyBjb20gdGlwb3MgcXVlIG7Do28gZGV2ZXJpYW0gc2VyIGNvbWJpbmFkb3MuIENvbW8gZWxldmFyIHVtYSBTdHJpbmcgYSB1bWEgcG90w6puY2lhLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90eXBlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiUGFyYSBjb3JyaWdpciB1bSBlcnJvIGRlIHRpcGFnZW0gdm9jw6ogcHJvdmF2ZWxtZW50ZSBwcmVjaXNhcsOhIHBlcmNvcnJlciBzZXUgY8OzZGlnbyBlIHRlciBjZXJ0ZXphIGRlIHF1ZSBhcyB2YXJpw6F2ZWlzIHBvc3N1ZW0gb3MgdGlwb3MgcXVlIHZvY8OqIGVzcGVyYSBxdWUgZWxhcyB0ZW5oYW0uIFBvZGUgc2VyIMO6dGlsIGltcHJpbWlyIGNhZGEgdmFyacOhdmVsIGFvIGxvbmdvIGRvIGNhbWluaG8gcGFyYSBjaGVjYXIgc2UgZWxhcyBwb3NzdWVtIG8gdmFsb3IgcXVlIHZvY8OqIGFjaGEgcXVlIGRldmVyaWFtIHRlci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBkZSBub21lIHF1YXNlIHNlbXByZSBzaWduaWZpY2EgcXVlIHZvY8OqIHVzb3UgdW1hIHZhcmnDoXZlbCBhbnRlcyBkZWxhIHRlciB1bSB2YWxvci4gRnJlcXVlbnRlbWVudGUgaXNzbyBwb2RlIHNlciB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvLCBlbnTDo28gY2hlcXVlIGEgb3J0b2dyYWZpYSBjdWlkYWRvc2FtZW50ZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBvIGxhZG8gZGlyZWl0byBkYXMgYXRyaWJ1acOnw7VlcyBlIHN1YXMgY2hhbWFkYXMgZGUgZnVuw6fDtWVzLCBzw6NvIG9zIGx1Z2FyZXMgbWFpcyBwcm92w6F2ZWlzIGRlIGVuY29udHJhciB1bSBlcnJvIGRlIG5vbWUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIHZhbG9yIG9jb3JyZSBtYWlzIGZyZXF1ZW50ZW1lbnRlIHF1YW5kbyB1bWEgZnVuw6fDo28gZXN0w6EgZXNwZXJhbmRvIHVtIHRpcG8gbWFzIHZvY8OqIHBhc3NhIHVtIHBhcsOibWV0cm8gZGUgb3V0cm8gdGlwby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBIG1lbnNhZ2VtIGRlIGVycm8gdGUgZMOhIHVtYSBib2EgZGljYSBzb2JyZSBvIG5vbWUgZGEgZnVuw6fDo28gZSBvIHZhbG9yIGluY29ycmV0by4gTGVpYSBhdGVudGFtZW50ZSBhIG1lbnNhZ2VtIGRlIGVycm8gZSB2b2x0ZSDDoCB2YXJpw6F2ZWwgcXVlIGNvbnTDqW0gbyB2YWxvciBwcm9ibGVtw6F0aWNvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3I6XG4gICAgICAgICAgICBcIkVzc2EgbWVuc2FnZW0gZGUgZXJybyBlc3TDoSB0ZSBkaXplbmRvIHF1ZSBvIG9iamV0byBkbyBsYWRvIGVzcXVlcmRvIGRvIHBvbnRvIG7Do28gdGVtIG8gYXRyaWJ1dG8gb3UgbcOpdG9kbyBkbyBzZXUgbGFkbyBkaXJlaXRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdHRyaWJ1dGVfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJBIHZhcmlhbnRlIG1haXMgY29tdW0gZGVzc2EgbWVuc2FnZW0gw6kgcXVlIG8gb2JqZXRvIGluZGVmaW5pZG8gbsOjbyB0ZW0gbyBhdHJpYnV0byBYLiBJc3NvIGRpeiBxdWUgbyBvYmpldG8gZG8gbGFkbyBlc3F1ZXJkbyBkbyBwb250byBuw6NvIMOpIG8gcXVlIHZvY8OqIHBlbnNhLiBSYXN0cmVpZSBlc3NhIHZhcmnDoXZlbCBlIGltcHJpbWEtYSBlbSB2w6FyaW9zIGx1Z2FyZXMgYXTDqSBkZXNjb2JyaXIgb25kZSBlbGEgc2UgdG9ybmEgaW5kZWZpbmlkYS4gQ2FzbyBjb250csOhcmlvLCBjaGVxdWUgc2UgaMOhIGVycm8gZGUgZGlnaXRhw6fDo28gbm8gYXRyaWJ1dG8gZG8gbGFkbyBkaXJlaXRvIGRvIHBvbnRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcjpcbiAgICAgICAgICAgIFwiTmEgbWFpb3JpYSBkYXMgdmV6ZXMgZXN0ZSBlcnJvIGluZGljYSBxdWUgdm9jw6ogZXNxdWVjZXUgZGUgZmVjaGFyIHVtIHBhcsOqbnRlc2VzIG91IGFzcGFzLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBjYWRhIGxpbmhhIGRvIHNldSBwcm9ncmFtYSBlIGNlcnRpZmlxdWUtc2UgZGUgcXVlIHRvZG9zIG9zIHBhcsOqbnRlc2VzIGVzdMOjbyBmZWNoYWRvcy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcjpcbiAgICAgICAgICAgIFwiU2V1IHByb2dyYW1hIGVzdMOhIGRlbW9yYW5kbyBtdWl0by4gT3MgcHJvZ3JhbWFzIGRlc3RlIGxpdnJvIGRldmVyaWFtIHJvZGFyIGVtIG1lbm9zIGRlIDEwIHNlZ3VuZG9zLiBJc3NvIHByb3ZhdmVsbWVudGUgaW5kaWNhIHF1ZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkltcHJpbWEgbWVuc2FnZW5zIGVtIGFsZ3VtYXMgbGluaGFzIHBhcmEgZGVzY29icmlyIHNlIHNldSBwcm9ncmFtYSBlc3TDoSBlbSB1bSBsb29wIGluZmluaXRvLiBDYXNvIG7Do28gZXN0ZWphLCB2b2PDqiBwb2RlIGF1bWVudGFyIG8gdGVtcG8gbGltaXRlIGRlIGV4ZWN1w6fDo28gY29tIG8gY29tYW5kbyBzeXMuc2V0RXhlY3V0aW9uTGltaXQobXMpXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3I6XG4gICAgICAgICAgICBcIlNldSBwcm9ncmFtYSBlc3TDoSBkZW1vcmFuZG8gbXVpdG8uIE9zIHByb2dyYW1hcyBkZXN0ZSBsaXZybyBkZXZlcmlhbSByb2RhciBlbSBtZW5vcyBkZSAzMCBzZWd1bmRvcy4gSXNzbyBwcm92YXZlbG1lbnRlIGluZGljYSBxdWUgc2V1IHByb2dyYW1hIGVzdMOhIGVtIHVtIGxvb3AgaW5maW5pdG8uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2dlbmVyYWxfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJbXByaW1hIG1lbnNhZ2VucyBlbSBhbGd1bWFzIGxpbmhhcyBwYXJhIGRlc2NvYnJpciBzZSBzZXUgcHJvZ3JhbWEgZXN0w6EgZW0gdW0gbG9vcCBpbmZpbml0by4gQ2FzbyBuw6NvIGVzdGVqYSwgdm9jw6ogcG9kZSBhdW1lbnRhciBvIHRlbXBvIGxpbWl0ZSBkZSBleGVjdcOnw6NvIGNvbSBvIGNvbWFuZG8gc3lzLnNldEV4ZWN1dGlvbkxpbWl0KG1zKVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGEgbWVuc2FnZW0gaW5kaWNhIHF1ZSBQeXRob24gbsOjbyBlbnRlbmRldSBhIHNpbnRheGUgZGUgdW0gY29tYW5kby4gQWxndW5zIGV4ZW1wbG9zIHPDo28gYXRyaWJ1acOnw6NvIGRlIHVtIGxpdGVyYWwsIG91IHVtYSBjaGFtYWRhIGRlIGZ1bsOnw6NvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3N5bnRheF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIkNoZXF1ZSBhcyBhdHJpYnVpw6fDtWVzIGRlIHNldSBwcm9ncmFtYSBlIGNlcnRpZmlxdWUtc2UgZGUgcXVlIG8gbGFkbyBlc3F1ZXJkbyDDqSB1bWEgdmFyacOhdmVsLCBlIG7Do28gdW0gbGl0ZXJhbCBvdSBmdW7Dp8Ojby5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gYWNlc3NhciB1bSBlbGVtZW50byBjdWphIGNoYXZlIG7Do28gZXhpc3RlIG5vIGRpY2lvbsOhcmlvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9rZXlfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJWb2PDqiBwb2RlIHRlciB1bSBlcnJvIGRlIGRpZ2l0YcOnw6NvIG5vIG5vbWUgZGEgc3VhIGNoYXZlLiDDiSB1bWEgYm9hIHByw6F0aWNhIGNoZWNhciBzZSBhIGNoYXZlIGV4aXN0ZSB1c2FuZG8gdW0gY29tYW5kbyAnaWYgKGNoYXZlKSBpbiBtZXVfZGljaW9uYXJpbycuIFZvY8OqIHRhbWLDqW0gcG9kZSB1c2FyIG8gY29tYW5kbyAnbWV1X2RpY2lvbmFyaW8uZ2V0KGNoYXZlLCB2YWxvclBhZHLDo28pJyBwYXJhIG9idGVyIG8gdmFsb3IgcGFkcsOjbyBhbyBpbnbDqXMgZGUgdW0gZXJybyBjYXNvIGEgY2hhdmUgbsOjbyBleGlzdGEuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yOlxuICAgICAgICAgICAgXCJWb2PDqiBlc3TDoSB0ZW50YW5kbyBhY2Vzc2FyIHVtIMOtbmRpY2UgYWzDqW0gZG8gZmluYWwgZGUgdW1hIHN0cmluZyBvdSBsaXN0YS4gUG9yIGV4ZW1wbG8sIHNlIHN1YSBsaXN0YSBwb3NzdWkgMyBlbGVtZW50b3MgbmVsYSBlIHZvY8OqIHRlbnRhIGFjZXNzYXIgbyBpdGVtIG5hIHBvc2nDp8OjbyAzIG91IG1haXMuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGV4X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiTGVtYnJlLXNlIHF1ZSBvIHByaW1laXJvIGVsZW1lbnRvIGRlIHVtYSBsaXN0YSBvdSBzdHJpbmcgZXN0w6Egbm8gw61uZGljZSAwLCBub3JtYWxtZW50ZSBlc3RhIG1lbnNhZ2VtIMOpIGV4aWJpZGEgcG9ycXVlIHZvY8OqIGVycm91IG8gw61uZGljZSBwb3IgMS4gRW0gdW1hIGxpc3RhIGRlIHRhbWFuaG8gMywgbyDDumx0aW1vIMOtbmRpY2UgdsOhbGlkbyDDqSAyXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3VyaV9lcnJvcjogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeDogXCJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yOlxuICAgICAgICAgICAgXCJFc3RhIG1lbnNhZ2VtIGluZGljYSBxdWUgdm9jw6ogZXN0w6EgdGVudGFuZG8gaW1wb3J0YXIgdW0gbcOzZHVsbyBxdWUgbsOjbyBleGlzdGVcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaW1wb3J0X2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVW0gcHJvYmxlbWEgcG9kZSBzZXIgYXBlbmFzIHVtIGVycm8gZGUgZGlnaXRhw6fDo28uIFRhbWLDqW0gcG9kZSBzZXIgcXVlIHZvY8OqIGVzdMOhIHRlbnRhbmRvIGltcG9ydGFyIHVtIG3Ds2R1bG8gcXVlIGV4aXN0ZSBlbSBQeXRob24gJ3JlYWwnLCBtYXMgbsOjbyBleGlzdGUgbmVzdGUgbGl2cm8uIFNlIGVzdGUgw6kgbyBjYXNvLCBwb3IgZmF2b3IgZW52aWUgdW0gcGVkaWRvIHBhcmEgdGVyIGVzc2UgbcOzZHVsbyBhZGljaW9uYWRvLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3I6XG4gICAgICAgICAgICBcIklzc28gcGFyZWNlIHNlciB1bSBlcnJvIGludGVybm8sIGVzcGVjaWFsbWVudGUgc2UgYSBtZW5zYWdlbSBmYXogcmVmZXLDqm5jaWEgYW8gY29uc29sZS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVmZXJlbmNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiVGVudGUgYXR1YWxpemFyIGEgcMOhZ2luYS4gU2UgbyBlcnJvIHBlcnNpc3RpciwgZW52aWUgdW0gcmVsYXTDs3JpbyBkZSBidWcganVudG8gY29tIHNldSBjw7NkaWdvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3I6XG4gICAgICAgICAgICBcIklzc28gZGl6IHF1ZSB2b2PDqiBlc3TDoSB0ZW50YW5kbyBkaXZpZGlyIHBvciAwLiBOb3JtYWxtZW50ZSDDqSBwb3JxdWUgbyB2YWxvciBkYSB2YXJpw6F2ZWwgbm8gZGVub21pbmFkb3IgZGUgdW1hIGRpdmlzw6NvIHRlbSBvIHZhbG9yIDBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlZvY8OqIHBvZGUgcHJvdGVnZXIgY29udHJhIGRpdmlkaXIgcG9yIDAgY29tIHVtIGNvbWFuZG8gJ2lmJywgb3Ugdm9jw6ogcG9kZSBwcmVjaXNhciByZWF2YWxpYXIgc3VhcyBzdXBvc2nDp8O1ZXMgc29icmUgb3MgdmFsb3JlcyBkYXMgdmFyacOhdmVpcywgcG9pcyB1bSBjb21hbmRvIGFudGVyaW9yIHBvZGUgdGVyIGluZXNwZXJhZGFtZW50ZSBhdHJpYnXDrWRvIG8gdmFsb3IgMCBhIGVzc2EgdmFyacOhdmVsLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0YSBtZW5zYWdlbSBxdWFzZSBzZW1wcmUgYXBhcmVjZSBuYSBmb3JtYSBkZSAnVGFtYW5obyBtw6F4aW1vIGRhIHBpbGhhIGRlIGNoYW1hZGFzIGV4Y2VkaWRvJy5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmFuZ2VfZXJyb3JfZml4OlxuICAgICAgICAgICAgXCJJc3NvIHNlbXByZSBvY29ycmUgcXVhbmRvIHVtYSBmdW7Dp8OjbyBjaGFtYSBlbGEgbWVzbWEuIFByb3ZhdmVsbWVudGUgdm9jw6ogbsOjbyBlc3TDoSBmYXplbmRvIGlzc28gZGUgcHJvcMOzc2l0bywgZXhjZXRvIG5vIGNhcMOtdHVsbyBzb2JyZSByZWN1cnPDo28uIFNlIHZvY8OqIGVzdMOhIG5lc3NlIGNhcMOtdHVsbywgZW50w6NvIHByb3ZhdmVsbWVudGUgYWluZGEgbsOjbyBpZGVudGlmaWNvdSB1bSBib20gY2FzbyBiYXNlLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcjpcbiAgICAgICAgICAgIFwiVW0gZXJybyBpbnRlcm5vIHBvZGUgc2lnbmlmaWNhciBxdWUgdm9jw6ogZGVzZW5jYWRlb3UgdW0gYnVnIG5vIG5vc3NvIFB5dGhvblwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlJlcG9ydGUgZXN0ZSBlcnJvIGNvbW8gdW0gYnVnLCBqdW50YW1lbnRlIGNvbSBzZXUgY8OzZGlnb1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcjpcbiAgICAgICAgICAgIFwiRXN0ZSBlcnJvIG9jb3JyZSBxdWFuZG8gdm9jw6ogbsOjbyBpbmRlbnRvdSBzZXUgY8OzZGlnbyBkZXZpZGFtZW50ZS4gSXNzbyDDqSBtYWlzIHByb3bDoXZlbCBkZSBvY29ycmVyIGNvbW8gcGFydGUgZGUgdW0gY29tYW5kbyBpZiwgZm9yLCB3aGlsZSBvdSBkZWYuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIHNldXMgY29tYW5kb3MgaWYsIGRlZiwgZm9yIGUgd2hpbGUgcGFyYSB0ZXIgY2VydGV6YSBkZSBxdWUgYXMgbGluaGFzIGVzdMOjbyBkZXZpZGFtZW50ZSBpbmRlbnRhZGFzIGFiYWl4byBkZWxhcy4gT3V0cmEgZm9udGUgZGVzdGUgZXJybyDDqSBjb3BpYXIgZSBjb2xhciBjw7NkaWdvIGVtIHF1ZSB2b2PDqiBhY2lkZW50YWxtZW50ZSBkZWl4b3UgcmVzdG9zIGRlIGPDs2RpZ28gcXVlIG7Do28gcGVydGVuY2VtIG1haXMgYWxpLlwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub3RfaW1wbGVtZW50ZWRfZXJyb3I6XG4gICAgICAgICAgICBcIkVzdGUgZXJybyBvY29ycmUgcXVhbmRvIHZvY8OqIHRlbnRhIHVzYXIgdW1hIGZ1bsOnw6NvIGVtYnV0aWRhIGRlIFB5dGhvbiBxdWUgbsOjbyBmb2kgaW1wbGVtZW50YWRhIG5lc3RhIHZlcnPDo28gYnJvd3NlciBkZSBQeXRob24uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvcl9maXg6XG4gICAgICAgICAgICBcIlBvciBlbnF1YW50byBhIMO6bmljYSBtYW5laXJhIGRlIGNvbnNlcnRhciBpc3NvIMOpIG7Do28gdXNhbmRvIGEgZnVuw6fDo28uIFBvZGVtIGhhdmVyIHNvbHXDp8O1ZXMgYWx0ZXJuYXRpdmFzLiBTZSB2b2PDqiByZWFsbWVudGUgcHJlY2lzYSBkZXN0YSBmdW7Dp8OjbyBlbWJ1dGlkYSwgZW52aWUtbm9zIHVtIHJlbGF0w7NyaW8gZGUgYnVnIGUgZGlnYWMgb21vIGVzdMOhIHRlbnRhbmRvIHVzYXIgYSBmdW7Dp8Ojby5cIixcblxuICAgICAgICBtc2dfYWN0aXZlY29kZV9maWxlX25vdF9mb3VuZDogXCJBcnF1aXZvIG7Do28gZW5jb250cmFkbzogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9ub19maWxlX29yX2RpcjpcbiAgICAgICAgICAgIFwiW0Vycm8gbsK6IDJdIEFycXVpdm8gb3UgZGlyZXTDs3JpbyBpbmV4aXN0ZW50ZTogJyQxJ1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zdGFydGluZzogXCJDbGlxdWUgbm8gYm90w6NvIGRlIGV4ZWN1w6fDo28gcGFyYSBjb21lw6dhciAkMVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wbGF5aW5nOiBcIkV4ZWN1dGFuZG8gJDFcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpbzpcbiAgICAgICAgICAgIFwiQ2FycmVnYW5kbyDDoXVkaW8uIFBvciBmYXZvciwgZXNwZXJlLiBTZSBvIHRvdXIgbsOjbyBjb21lw6dhciBsb2dvLCBjbGlxdWUgZW0gJ1N0b3AgVG91cicgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BhdXNlX2N1cnJlbnRfYXVkaW86IFwiUGF1c2FyIMOhdWRpbyBhdHVhbFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9wYXVzZV9hdWRpbzogXCJQYXVzYXIgw6F1ZGlvXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvOiBcIlJlcHJvZHV6aXIgw6F1ZGlvIHBhdXNhZG9cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXVkaW9fcGF1c2VkOlxuICAgICAgICAgICAgXCIkMSBmb2kgcGF1c2Fkby4gQ2xpcXVlIG5vIGJvdMOjbyBkZSBleGVjdcOnw6NvIHBhcmEgcmV0b21hciBvIHRvdXIuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2lucHV0X3ByZzogXCJFbnRyYWRhIHBhcmEgbyBwcm9ncmFtYVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnI6XG4gICAgICAgICAgICBcIkhvdXZlcmFtIGVycm9zIGFvIGNvbXBpbGFyIHNldSBjw7NkaWdvLiBWZWphIGFiYWl4by5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9leGM6IFwiTGltaXRlIGRlIHRlbXBvIGV4Y2VkaWRvIG5vIHNldSBwcm9ncmFtYVwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfZXJyOiBcIlVtIGVycm8gZGUgc2Vydmlkb3Igb2NvcnJldTogJDEgJDJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmc6XG4gICAgICAgICAgICBcIkNvbXBpbGFuZG8gZSBleGVjdXRhbmRvIHNldSBjw7NkaWdvLi4uXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3NlcnZlcl9jb21tX2VycjogXCJFcnJvIGFvIGNvbXVuaWNhciBjb20gbyBzZXJ2aWRvci5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2F2ZV9ydW46IFwiU2FsdmFyICYgRXhlY3V0YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcmVuZGVyOiBcIlNhbHZhciAmIFJlbmRlcml6YXJcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yOlxuICAgICAgICAgICAgXCJVbSBlcnJvIGRlIGFzc2Vyw6fDo28gb2NvcnJlIHF1YW5kbyBweXRob24gZW5jb250cmEgdW0gY29tYW5kbyAnYXNzZXJ0Jy4gUHl0aG9uIGF2YWxpYSBhIGV4cHJlc3PDo28gZG8gbGFkbyBkaXJlaXRvOyBzZSDDqSB2ZXJkYWRlaXJhLCBvIHByb2dyYW1hIGNvbnRpbnVhIG5vcm1hbG1lbnRlLiBTZSDDqSBmYWxzYSwgcHl0aG9uIGdlcmEgdW0gZXJybyBlIHBhcmEgYSBleGVjdcOnw6NvLlwiICxcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfYXNzZXJ0aW9uX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwiQ2hlcXVlIGEgZXhwcmVzc8OjbyBkbyBsYWRvIGRpcmVpdG8gZGUgJ2Fzc2VydCcuIEVzc2EgZXhwcmVzc8OjbyDDqSBmYWxzYSBlIMOpIHByZWNpc28gdmVyaWZpY2FyIG8gbW90aXZvLiBWb2PDqiBwb2RlIHF1ZXJlciBpbXByaW1pciBjYWRhIHBhcnRlIGRhIGV4cHJlc3PDo28gZSBlbnRlbmRlciBwb3JxdWUgw6kgZmFsc2EuXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfZGI6IFwiQ2FycmVnYW5kbyBiYW5jbyBkZSBkYWRvcy4uLlwiLFxuICAgIH0sXG59KTtcbiIsIiQuaTE4bigpLmxvYWQoe1xuICAgIFwic3ItQ3lybFwiOiB7XG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX2xvYWRfaGlzdG9yeTogXCLQo9GH0LjRgtCw0Zgg0LjRgdGC0L7RgNC40ZjRg1wiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9hdWRpb190b3VyOiBcItCQ0YPQtNC40L4g0YLRg9GA0LBcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbG9hZGVkX2NvZGU6IFwi0JLQsNGIINC40LfQstC+0YDQvdC4INC60L7QtCDRmNC1INGD0YfQuNGC0LDQvS5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfbm9fc2F2ZWRfY29kZTogXCLQndC1INC/0L7RgdGC0L7RmNC4INGB0L3QuNC80ZnQtdC9INC60L7QtC5cIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGU6IFwi0J/QvtC60YDQtdC90Lgg0L/RgNC+0LPRgNCw0LxcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfc2hvd19mZWVkYmFjazogXCLQn9GA0LjQutCw0LbQuCDRgNC10LfRg9C70YLQsNGCXCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfY29kZTogXCLQn9GA0LjQutCw0LbQuCDQutC+0LRcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlOiBcItCX0LDRgtCy0L7RgNC4INC60L7QtFwiLFxuICAgICAgICBtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVsZW5zOiBcItCa0L7RgNCw0Log0L/QviDQutC+0YDQsNC6XCIsXG4gICAgICAgIG1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnM6IFwi0JrQvtGA0LDQuiDQv9C+INC60L7RgNCw0LpcIixcbiAgICAgICAgbXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuczogXCLQl9Cw0YLQstC+0YDQuCDQutC+0YDQsNC6INC/0L4g0LrQvtGA0LDQulwiLFxuXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yOlxuICAgICAgICAgICAgXCLQodC40L3RgtCw0LrRgdC90LAg0LPRgNC10YjQutCwIChwYXJzZSBlcnJvcikg0LfQvdCw0YfQuCDQtNCwINCf0LDRmNGC0L7QvSDQvdC1INGA0LDQt9GD0LzQtSDRgdC40L3RgtCw0LrRgdGDINGDINC70LjQvdC40ZjQuCDQutC+0LPQsCDQvdCwINC60L7RmNGDINC/0L7RgNGD0LrQsCDQviDQs9GA0LXRiNGG0Lgg0YPQutCw0LfRg9GY0LUuINCi0LjQv9C40YfQvdC4INC/0YDQuNC80LXRgNC4INC+0LLQsNC60LLQtSDQs9GA0LXRiNC60LUg0YHRgyDQt9Cw0LHQvtGA0LDQstC70ZjQtdC90LAg0LTQstC+0YLQsNGH0LrQsCDQutC+0LQgJ2lmJyDQuNC70LggJ2Zvcicg0LjRgdC60LDQt9CwINC40LvQuCDQt9Cw0LHQvtGA0LDQstGZ0LXQvdCwINC30LDQv9C10YLQsCDQuNC30LzQtdGS0YMg0LDRgNCz0YPQvNC10L3QsNGC0LAg0LrQvtC0INC/0L7Qt9C40LLQsCDRhNGD0L3QutGG0LjRmNC1XCIsXG4gICAgICAgIG1zZ19zY3RpdmVjb2RlX3BhcnNlX2Vycm9yX2ZpeDpcbiAgICAgICAgICAgIFwi0JTQsCDQsdC40YHRgtC1INC40YHQv9GA0LDQstC40LvQuCDRgdC40L3RgtCw0LrRgdC90YMg0LPRgNC10YjQutGDINGC0YDQtdCx0LAg0L/QsNC20ZrQuNCy0L4g0LTQsCDQv9C+0LPQu9C10LTQsNGC0LUg0LvQuNC90LjRmNGDINC40LfQstC+0YDQvdC+0LMg0LrQvtC00LAg0L3QsCDQutC+0ZjRgyDRg9C60LDQt9GD0ZjQtSDQv9C+0YDRg9Cz0LAg0L4g0LPRgNC10YjRhtC4INC4INC80L7QttC00LAg0L/RgNC10YLRhdC+0LTQvdGDINC70LjQvdC40L3RgyDQuNC30LLQvtGA0L3QvtCzINC60L7QtNCwLiDQn9GA0L7QstC10YDQuNGC0LUg0LTQsCDQu9C4INGB0YMg0L/QvtGI0YLQvtCy0LDQvdCwINGB0LLQsCDRgdC40L3RgtCw0LrRgdC90LAg0L/RgNCw0LLQuNC70LAg0J/QsNGY0YLQvtC90LAuXCIsXG4gICAgfSxcbn0pO1xuIiwiLyoqXG4gKlxuICogQ3JlYXRlZCBieSBibWlsbGVyIG9uIDMvMTkvMTUuXG4gKi9cbi8qIERlZmluZSBnbG9iYWwgdmFyaWFibGVzIGZvciBFU0xpbnQgKi9cbi8qIGdsb2JhbCBTayAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5pbXBvcnQgQXVkaW9Ub3VyIGZyb20gXCIuL2F1ZGlvdG91ci5qc1wiO1xuaW1wb3J0IFwiLi9hY3RpdmVjb2RlLWkxOG4uZW4uanNcIjtcbmltcG9ydCBcIi4vYWN0aXZlY29kZS1pMThuLnB0LWJyLmpzXCI7XG5pbXBvcnQgXCIuL2FjdGl2ZWNvZGUtaTE4bi5zci1DeXJsLmpzXCI7XG5pbXBvcnQgQ29kZU1pcnJvciBmcm9tIFwiY29kZW1pcnJvclwiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3B5dGhvbi9weXRob24uanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9jc3MvY3NzLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9tb2RlL3htbC94bWwuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9zcWwvc3FsLmpzXCI7XG5pbXBvcnQgXCJjb2RlbWlycm9yL21vZGUvY2xpa2UvY2xpa2UuanNcIjtcbmltcG9ydCBcImNvZGVtaXJyb3IvbW9kZS9vY3RhdmUvb2N0YXZlLmpzXCI7XG5pbXBvcnQgXCIuLy4uL2Nzcy9hY3RpdmVjb2RlLmNzc1wiO1xuaW1wb3J0IFwiY29kZW1pcnJvci9saWIvY29kZW1pcnJvci5jc3NcIjtcbmltcG9ydCBcIi4vc2t1bHB0Lm1pbi5qc1wiO1xuaW1wb3J0IFwiLi9za3VscHQtc3RkbGliLmpzXCI7XG4vLyBVc2VkIGJ5IFNrdWxwdC5cbmltcG9ydCBlbWJlZCBmcm9tIFwidmVnYS1lbWJlZFwiO1xuLy8gQWRhcHQgZm9yIHVzZSBvdXRzaWRlIHdlYnBhY2sgLS0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtZW1iZWQuXG53aW5kb3cudmVnYUVtYmVkID0gZW1iZWQ7XG5cbnZhciBpc01vdXNlRG93biA9IGZhbHNlO1xuZG9jdW1lbnQub25tb3VzZWRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgaXNNb3VzZURvd24gPSB0cnVlO1xufTtcblxuZG9jdW1lbnQub25tb3VzZXVwID0gZnVuY3Rpb24gKCkge1xuICAgIGlzTW91c2VEb3duID0gZmFsc2U7XG59O1xud2luZG93LmVkTGlzdCA9IHt9O1xuXG52YXIgc29ja2V0LCBjb25uZWN0aW9uLCBkb2M7XG52YXIgY2hhdGNvZGVzU2VydmVyID0gXCJjaGF0LmNvZGVzXCI7XG5cbi8vIHNlcGFyYXRlIGludG8gY29uc3RydWN0b3IgYW5kIGluaXRcbmV4cG9ydCBjbGFzcyBBY3RpdmVDb2RlIGV4dGVuZHMgUnVuZXN0b25lQmFzZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdmFyIHN1ZmZTdGFydDtcbiAgICAgICAgdmFyIG9yaWcgPSAkKG9wdHMub3JpZykuZmluZChcInRleHRhcmVhXCIpWzBdO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdiA9IG9wdHMub3JpZztcbiAgICAgICAgdGhpcy51c2VSdW5lc3RvbmVTZXJ2aWNlcyA9IG9wdHMudXNlUnVuZXN0b25lU2VydmljZXM7XG4gICAgICAgIHRoaXMucHl0aG9uMyA9IG9wdHMucHl0aG9uMztcbiAgICAgICAgdGhpcy5hbGlnblZlcnRpY2FsID0gb3B0cy52ZXJ0aWNhbDtcbiAgICAgICAgdGhpcy5vcmlnRWxlbSA9IG9yaWc7XG4gICAgICAgIHRoaXMub3JpZ1RleHQgPSB0aGlzLm9yaWdFbGVtLnRleHRDb250ZW50O1xuICAgICAgICB0aGlzLmRpdmlkID0gb3B0cy5vcmlnLmlkO1xuICAgICAgICB0aGlzLmNvZGUgPSAkKG9yaWcpLnRleHQoKSB8fCBcIlxcblxcblxcblxcblxcblwiO1xuICAgICAgICB0aGlzLmxhbmd1YWdlID0gJChvcmlnKS5kYXRhKFwibGFuZ1wiKTtcbiAgICAgICAgdGhpcy50aW1lbGltaXQgPSAkKG9yaWcpLmRhdGEoXCJ0aW1lbGltaXRcIik7XG4gICAgICAgIHRoaXMuaW5jbHVkZXMgPSAkKG9yaWcpLmRhdGEoXCJpbmNsdWRlXCIpO1xuICAgICAgICB0aGlzLmhpZGVjb2RlID0gJChvcmlnKS5kYXRhKFwiaGlkZWNvZGVcIik7XG4gICAgICAgIHRoaXMuY2hhdGNvZGVzID0gJChvcmlnKS5kYXRhKFwiY2hhdGNvZGVzXCIpO1xuICAgICAgICB0aGlzLmhpZGVoaXN0b3J5ID0gJChvcmlnKS5kYXRhKFwiaGlkZWhpc3RvcnlcIik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSAkKG9wdHMub3JpZykuZmluZChgIyR7dGhpcy5kaXZpZH1fcXVlc3Rpb25gKVswXTtcbiAgICAgICAgdGhpcy50aWUgPSAkKG9yaWcpLmRhdGEoXCJ0aWVcIik7XG4gICAgICAgIHRoaXMuZGJ1cmwgPSAkKG9yaWcpLmRhdGEoXCJkYnVybFwiKTtcbiAgICAgICAgdGhpcy5weXRob24zX2ludGVycHJldGVyID0gJChvcmlnKS5kYXRhKFwicHl0aG9uM19pbnRlcnByZXRlclwiKTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmVuYWJsZWRvd25sb2FkID0gJChvcmlnKS5kYXRhKFwiZW5hYmxlZG93bmxvYWRcIik7XG4gICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkQnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5vdXRlckRpdiA9IG51bGw7XG4gICAgICAgIHRoaXMucGFydG5lciA9IFwiXCI7XG4gICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIGlmICghZUJvb2tDb25maWcuYWxsb3dfcGFpcnMgfHwgJChvcmlnKS5kYXRhKFwibm9wYWlyXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVBhcnRuZXIgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFydG5lciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOyAvLyBjcmVhdGUgcHJlIGZvciBvdXRwdXRcbiAgICAgICAgdGhpcy5ncmFwaGljcyA9IG51bGw7IC8vIGNyZWF0ZSBkaXYgZm9yIHR1cnRsZSBncmFwaGljc1xuICAgICAgICB0aGlzLmNvZGVjb2FjaCA9IG51bGw7XG4gICAgICAgIHRoaXMuY29kZWxlbnMgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbnRyb2xEaXYgPSBudWxsO1xuICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciA9IG51bGw7XG4gICAgICAgIHRoaXMudGltZXN0YW1wcyA9IFtcIk9yaWdpbmFsXCJdO1xuICAgICAgICB0aGlzLmF1dG9ydW4gPSAkKG9yaWcpLmRhdGEoXCJhdXRvcnVuXCIpO1xuICAgICAgICBpZiAodGhpcy5jaGF0Y29kZXMgJiYgZUJvb2tDb25maWcuZW5hYmxlX2NoYXRjb2Rlcykge1xuICAgICAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KFwid3NzOi8vXCIgKyBjaGF0Y29kZXNTZXJ2ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IG5ldyB3aW5kb3cuc2hhcmVkYi5Db25uZWN0aW9uKHNvY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgICAgIGRvYyA9IGNvbm5lY3Rpb24uZ2V0KFwiY2hhdGNvZGVzXCIsIFwiY2hhbm5lbHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JhZGVyYWN0aXZlIHx8IHRoaXMuaXNUaW1lZCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlY29kZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gdGhpcy5pbmNsdWRlcy5zcGxpdCgvXFxzKy8pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcmVmaXhFbmQgPSB0aGlzLmNvZGUuaW5kZXhPZihcIl5eXl5cIik7XG4gICAgICAgIGlmIChwcmVmaXhFbmQgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNvZGUuc3Vic3RyaW5nKDAsIHByZWZpeEVuZCk7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSB0aGlzLmNvZGUuc3Vic3RyaW5nKHByZWZpeEVuZCArIDUpO1xuICAgICAgICB9XG4gICAgICAgIHN1ZmZTdGFydCA9IHRoaXMuY29kZS5pbmRleE9mKFwiPT09PVwiKTtcbiAgICAgICAgaWYgKHN1ZmZTdGFydCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnN1ZmZpeCA9IHRoaXMuY29kZS5zdWJzdHJpbmcoc3VmZlN0YXJ0ICsgNSk7XG4gICAgICAgICAgICB0aGlzLmNvZGUgPSB0aGlzLmNvZGUuc3Vic3RyaW5nKDAsIHN1ZmZTdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gW3RoaXMuY29kZV07XG4gICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ29udHJvbHMoKTtcbiAgICAgICAgaWYgKCQob3JpZykuZGF0YShcImNhcHRpb25cIikpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwdGlvbiA9ICQob3JpZykuZGF0YShcImNhcHRpb25cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhcHRpb24gPSBcIkFjdGl2ZUNvZGVcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZENhcHRpb24oXCJydW5lc3RvbmVcIik7XG4gICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgMTAwMFxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5hdXRvcnVuKSB7XG4gICAgICAgICAgICAvLyBTaW11bGF0ZSBwcmVzc2luZyB0aGUgcnVuIGJ1dHRvbiwgc2luY2UgdGhpcyB3aWxsIGFsc28gcHJldmVudCB0aGUgdXNlciBmcm9tIGNsaWNraW5nIGl0IHVudGlsIHRoZSBpbml0aWFsIHJ1biBpcyBjb21wbGV0ZSwgYW5kIGFsc28gaGVscCB0aGUgdXNlciB1bmRlcnN0YW5kIHdoeSB0aGV5J3JlIHdhaXRpbmcuXG4gICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeSh0aGlzLnJ1bkJ1dHRvbkhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2F0ZV9jb21wb25lbnRfcmVhZHkoKTtcbiAgICB9XG5cbiAgICBjcmVhdGVFZGl0b3IoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5vdXRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBsaW5rZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgbGlua2Rpdi5pZCA9IHRoaXMuZGl2aWQucmVwbGFjZSgvXy9nLCBcIi1cIikudG9Mb3dlckNhc2UoKTsgLy8gOnJlZjogY2hhbmdlcyBfIHRvIC0gc28gYWRkIHRoaXMgYXMgYSB0YXJnZXRcbiAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5hZGRDbGFzcyhcImFjX3NlY3Rpb24gYWxlcnQgYWxlcnQtd2FybmluZ1wiKTtcbiAgICAgICAgdmFyIGNvZGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNvZGVEaXYpLmFkZENsYXNzKFwiYWNfY29kZV9kaXYgY29sLW1kLTEyXCIpO1xuICAgICAgICB0aGlzLmNvZGVEaXYgPSBjb2RlRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmxhbmcgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLnJlcGxhY2VXaXRoKHRoaXMub3V0ZXJEaXYpO1xuICAgICAgICBpZiAobGlua2Rpdi5pZCAhPT0gdGhpcy5kaXZpZCkge1xuICAgICAgICAgICAgLy8gRG9uJ3Qgd2FudCB0aGUgJ2V4dHJhJyB0YXJnZXQgaWYgdGhleSBtYXRjaC5cbiAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQobGlua2Rpdik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjb2RlRGl2KTtcbiAgICAgICAgdmFyIGVkbW9kZSA9IHRoaXMub3V0ZXJEaXYubGFuZztcbiAgICAgICAgaWYgKGVkbW9kZSA9PT0gXCJzcWxcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtc3FsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImphdmFcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtamF2YVwiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJjcHBcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtYysrc3JjXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcImNcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtY3NyY1wiO1xuICAgICAgICB9IGVsc2UgaWYgKGVkbW9kZSA9PT0gXCJweXRob24zXCIpIHtcbiAgICAgICAgICAgIGVkbW9kZSA9IFwicHl0aG9uXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZWRtb2RlID09PSBcIm9jdGF2ZVwiIHx8IGVkbW9kZSA9PT0gXCJNQVRMQUJcIikge1xuICAgICAgICAgICAgZWRtb2RlID0gXCJ0ZXh0L3gtb2N0YXZlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBpZihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmRpdmlkKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuY29kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZGl2aWQpO1xuXG4gICAgICAgIHZhciBvcHRzID0ge1xuICAgICAgICAgICAgdmFsdWU6IHRoaXMuY29kZSxcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgICAgICAgICAgbW9kZTogZWRtb2RlLFxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcbiAgICAgICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsXG4gICAgICAgICAgICBhdXRvTWF0Y2hQYXJlbnM6IHRydWUsXG4gICAgICAgICAgICBleHRyYUtleXM6IHtcbiAgICAgICAgICAgICAgICBUYWI6IFwiaW5kZW50TW9yZVwiLFxuICAgICAgICAgICAgICAgIFwiU2hpZnQtVGFiXCI6IFwiaW5kZW50TGVzc1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvcihjb2RlRGl2LG9wdHMgKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1ha2UgdGhlIGVkaXRvciByZXNpemFibGVcbiAgICAgICAgJChlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKSkucmVzaXphYmxlKHtcbiAgICAgICAgICAgIHJlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRTaXplKCQodGhpcykud2lkdGgoKSwgJCh0aGlzKS5oZWlnaHQoKSk7XG4gICAgICAgICAgICAgICAgZWRpdG9yLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnaXZlIHRoZSB1c2VyIGEgdmlzdWFsIGN1ZSB0aGF0IHRoZXkgaGF2ZSBjaGFuZ2VkIGJ1dCBub3Qgc2F2ZWRcbiAgICAgICAgZWRpdG9yLm9uKFxuICAgICAgICAgICAgXCJjaGFuZ2VcIixcbiAgICAgICAgICAgIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5hY0VkaXRFdmVudCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBldmVudHMgY2FuIGNvbWUgYmVmb3JlIGFueSByZWFsIGNoYW5nZXMgZm9yIHZhcmlvdXMgcmVhc29ucywgc29tZSB1bmtub3duXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYXZvaWRzIHVubmVjY3NhcnkgbG9nIGV2ZW50cyBhbmQgdXBkYXRlcyB0byB0aGUgYWN0aXZpdHkgY291bnRlclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcmlnVGV4dCA9PT0gZWRpdG9yLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5jc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci10b3BcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMnB4IHNvbGlkICNiNDMyMzJcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAkKGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpKS5jc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJvcmRlci1ib3R0b21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiMnB4IHNvbGlkICNiNDMyMzJcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQW5zd2VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJhY3RpdmVjb2RlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiZWRpdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWRpdG9yLmFjRWRpdEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApOyAvLyB1c2UgYmluZCB0byBwcmVzZXJ2ZSAqdGhpcyogaW5zaWRlIHRoZSBvbiBoYW5kbGVyLlxuICAgICAgICAvL1NvbHZpbmcgS2V5Ym9hcmQgVHJhcCBvZiBBY3RpdmVDb2RlOiBJZiB1c2VyIHVzZSB0YWIgZm9yIG5hdmlnYXRpb24gb3V0c2lkZSBvZiBBY3RpdmVDb2RlLCB0aGVuIGNoYW5nZSB0YWIgYmVoYXZpb3IgaW4gQWN0aXZlQ29kZSB0byBlbmFibGUgdGFiIHVzZXIgdG8gdGFiIG91dCBvZiB0aGUgdGV4dGFyZWFcbiAgICAgICAgJCh3aW5kb3cpLmtleWRvd24oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gZS5rZXlDb2RlID8gZS5rZXlDb2RlIDogZS53aGljaDtcbiAgICAgICAgICAgIGlmIChjb2RlID09IDkgJiYgJChcInRleHRhcmVhOmZvY3VzXCIpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGVkaXRvci5zZXRPcHRpb24oXCJleHRyYUtleXNcIiwge1xuICAgICAgICAgICAgICAgICAgICBUYWI6IGZ1bmN0aW9uIChjbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KFwiLnRhYi1jb250ZW50XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHRTaWJsaW5nLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwiU2hpZnQtVGFiXCI6IGZ1bmN0aW9uIChjbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KFwiLnRhYi1jb250ZW50XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXZpb3VzU2libGluZy5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBydW5CdXR0b25IYW5kbGVyKCkge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBydW4gYnV0dG9uIHVudGlsIHRoZSBydW4gaXMgZmluaXNoZWQuICAgIFxuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2coKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHRoZXJlIHdhcyBhbiBlcnJvciAke2V9IHJ1bm5pbmcgdGhlIGNvZGVgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2dSZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0N1cnJlbnRBbnN3ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlckZlZWRiYWNrKCk7XG4gICAgICAgIC8vIFRoZSBydW4gaXMgZmluaXNoZWQ7IHJlLWVuYWJsZSB0aGUgYnV0dG9uLlxuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbnRyb2xzKCkge1xuICAgICAgICB2YXIgY3RybERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBidXR0O1xuICAgICAgICAkKGN0cmxEaXYpLmFkZENsYXNzKFwiYWNfYWN0aW9uc1wiKTtcbiAgICAgICAgJChjdHJsRGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgLy8gUnVuXG4gICAgICAgIGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcnVuX2NvZGVcIikpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1zdWNjZXNzIHJ1bi1idXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMucnVuQnV0dG9uID0gYnV0dDtcbiAgICAgICAgY29uc29sZS5sb2coXCJhZGRpbmcgY2xpY2sgZnVuY3Rpb24gZm9yIHJ1blwiKTtcbiAgICAgICAgdGhpcy5ydW5CdXR0b24ub25jbGljayA9IHRoaXMucnVuQnV0dG9uSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuXG4gICAgICAgIHRoaXMuYWRkUmVzZXRCdXR0b24oY3RybERpdik7XG5cbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZG93bmxvYWQgfHwgZUJvb2tDb25maWcuZG93bmxvYWRzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5hZGREb3dubG9hZEJ1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGlkZWNvZGUgJiYgIXRoaXMuaGlkZWhpc3RvcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeUJ1dHRvbihjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiZ3JhZGVidXR0b25cIikgJiYgIXRoaXMuZ3JhZGVyYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZlZWRiYWNrQnV0dG9uKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNob3cvSGlkZSBDb2RlXG4gICAgICAgIGlmICh0aGlzLmhpZGVjb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUhpZGVTaG93KGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvZGVMZW5zXG4gICAgICAgIGlmICgkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJjb2RlbGVuc1wiKSAmJiAhdGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQ29kZUxlbnMoY3RybERpdik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXVkaW8gVG91clxuICAgICAgICBpZiAoJCh0aGlzLm9yaWdFbGVtKS5kYXRhKFwiYXVkaW9cIikpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlQXVkaW9Ub3VycyhjdHJsRGl2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZUJvb2tDb25maWcuaXNJbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUluc3RydWN0b3JTaGFyaW5nKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZVBhcnRuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBQYXJ0bmVyKGN0cmxEaXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoYXRjb2RlcyAmJiBlQm9va0NvbmZpZy5lbmFibGVfY2hhdGNvZGVzKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNoYXRDb2RlcyhjdHJsRGl2KTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRlckRpdikucHJlcGVuZChjdHJsRGl2KTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24pIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMucXVlc3Rpb24pLmh0bWwoKS5tYXRjaCgvXlxccyskLykpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMucXVlc3Rpb24pLnJlbW92ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLnByZXBlbmQodGhpcy5xdWVzdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sRGl2ID0gY3RybERpdjtcbiAgICB9XG5cbiAgICBhZGRGZWVkYmFja0J1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2ZlZWRiYWNrXCIpKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuZ3JhZGVCdXR0b24gPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuY3JlYXRlR3JhZGVTdW1tYXJ5LmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGFkZEhpc3RvcnlCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2hpc3RvcnlcIikpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLmF0dHIoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLmhpc3RCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyLmJpbmQodGhpcykpO1xuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRG93bmxvYWRCdXR0b24oY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkudGV4dChcIkRvd25sb2FkXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYnRuIHNhdmUtYnV0dG9uXCIpO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICB0aGlzLmRvd25sb2FkQnV0dG9uID0gYnV0dDtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLmRvd25sb2FkRmlsZS5iaW5kKHRoaXMsIHRoaXMubGFuZ3VhZ2UpKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICB9XG5cbiAgICBhZGRSZXNldEJ1dHRvbihjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiUmVzZXRcIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgIHRoaXMucmVzZXRCdXR0b24gPSBidXR0O1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKHRoaXMucmVzZXRDb2RlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGVuYWJsZUhpZGVTaG93KGN0cmxEaXYpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImFjX29wdCBidG4gYnRuLWRlZmF1bHRcIik7XG4gICAgICAgICQoYnV0dCkudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFwidHlwZVwiLCBcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQgPSBidXR0O1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGJ1dHQpO1xuICAgICAgICAkKGJ1dHQpLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5jb2RlRGl2KS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEhpc3RvcnlTY3J1YmJlcih0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyLnBhcmVudEVsZW1lbnQpLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoKSA9PVxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnNob3dIaWRlQnV0dCkudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2hpZGVfY29kZVwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5zaG93SGlkZUJ1dHQpLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2NvZGVcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZW5hYmxlQ29kZUxlbnMoY3RybERpdikge1xuICAgICAgICBsZXQgYnV0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19jb2RlbGVuc1wiKSk7XG4gICAgICAgICQoYnV0dCkuY3NzKFwibWFyZ2luLWxlZnRcIiwgXCIxMHB4XCIpO1xuICAgICAgICB0aGlzLmNsQnV0dG9uID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayh0aGlzLnNob3dDb2RlbGVucy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBlbmFibGVBdWRpb1RvdXJzKGN0cmxEaXYpIHtcbiAgICAgICAgbGV0IGJ1dHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICAkKGJ1dHQpLmFkZENsYXNzKFwiYWNfb3B0IGJ0biBidG4tZGVmYXVsdFwiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F1ZGlvX3RvdXJcIikpO1xuICAgICAgICAkKGJ1dHQpLmNzcyhcIm1hcmdpbi1sZWZ0XCIsIFwiMTBweFwiKTtcbiAgICAgICAgdGhpcy5hdEJ1dHRvbiA9IGJ1dHQ7XG4gICAgICAgIGN0cmxEaXYuYXBwZW5kQ2hpbGQoYnV0dCk7XG4gICAgICAgICQoYnV0dCkuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV3IEF1ZGlvVG91cihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXZpZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlLFxuICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3JpZ0VsZW0pLmRhdGEoXCJhdWRpb1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBlbmFibGVJbnN0cnVjdG9yU2hhcmluZyhjdHJsRGl2KSB7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgJChidXR0KS5hZGRDbGFzcyhcImJ0biBidG4taW5mb1wiKTtcbiAgICAgICAgJChidXR0KS50ZXh0KFwiU2hhcmUgQ29kZVwiKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgIHRoaXMuc2hhcmVCdXR0ID0gYnV0dDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgJChidXR0KS5jbGljayhcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFjb25maXJtKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJZb3UgYXJlIGFib3V0IHRvIHNoYXJlIHRoaXMgY29kZSB3aXRoIEFMTCBvZiB5b3VyIHN0dWRlbnRzLiAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlP1wiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICBlQm9va0NvbmZpZy5hamF4VVJMICsgXCJicm9hZGNhc3RfY29kZS5qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGxldCBwb3N0X3Byb21pc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzID0gYXdhaXQgcG9zdF9wcm9taXNlLmpzb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLm1lc3MgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KGBTaGFyZWQgQ29kZSB3aXRoICR7c3RhdHVzLnNoYXJlX2NvdW50fSBzdHVkZW50c2ApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiU2hhcmluZyBGYWlsZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dXBQYXJ0bmVyKGN0cmxEaXYpIHtcbiAgICAgICAgdmFyIGNoZWNrUGFydG5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICAgICAgY2hlY2tQYXJ0bmVyLnR5cGUgPSBcImNoZWNrYm94XCI7XG4gICAgICAgIGNoZWNrUGFydG5lci5pZCA9IGAke3RoaXMuZGl2aWR9X3BhcnRgO1xuICAgICAgICBjdHJsRGl2LmFwcGVuZENoaWxkKGNoZWNrUGFydG5lcik7XG4gICAgICAgIHZhciBwbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gICAgICAgIHBsYWJlbC5mb3IgPSBgJHt0aGlzLmRpdmlkfV9wYXJ0YDtcbiAgICAgICAgJChwbGFiZWwpLnRleHQoXCJQYWlyP1wiKTtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChwbGFiZWwpO1xuICAgICAgICAkKGNoZWNrUGFydG5lcikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFydG5lcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyVGV4dEJveC52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICQocGxhYmVsKS50ZXh0KFwiUGFpcj9cIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZEFncmVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwYXJ0bmVyQWdyZWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGlkQWdyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZEFncmVlID0gY29uZmlybShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlBhaXIgUHJvZ3JhbW1pbmcgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBjb25zZW50IG9mIHlvdXIgaW5zdHJ1Y3Rvci5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiWW91ciBwYXJ0bmVyIG11c3QgYmUgYSByZWdpc3RlcmVkIG1lbWJlciBvZiB0aGUgY2xhc3MgYW5kIGhhdmUgYWdyZWVkIHRvIHBhaXIgd2l0aCB5b3UuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkJ5IGNsaWNraW5nIE9LIHlvdSBjZXJ0aWZ5IHRoYXQgYm90aCBvZiB0aGVzZSBjb25kaXRpb25zIGhhdmUgYmVlbiBtZXQuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlkQWdyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInBhcnRuZXJBZ3JlZVwiLCBcInRydWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRuZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAkKHBsYWJlbCkudGV4dChcIndpdGg6IFwiKTtcbiAgICAgICAgICAgICAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICB2YXIgcGFydG5lclRleHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgIHBhcnRuZXJUZXh0Qm94LnR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChwYXJ0bmVyVGV4dEJveCk7XG4gICAgICAgICQocGFydG5lclRleHRCb3gpLmhpZGUoKTtcbiAgICAgICAgJChwYXJ0bmVyVGV4dEJveCkuY2hhbmdlKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFydG5lciA9IHBhcnRuZXJUZXh0Qm94LnZhbHVlO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBwcm9iYWJseSBvYnNvbGV0ZS4gIE5vdCBzdXJlIGlmIGFueW9uZSBhdCBNaWNoaWdhbiB3aWxsIGNvbWUgYmFja1xuICAgIC8vIHRvIHdvcmtpbmcgb24gdGhpcyBhZ2Fpbi5cbiAgICBlbmFibGVDaGF0Q29kZXMoY3RybERpdikge1xuICAgICAgICB2YXIgY2hhdEJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciBjaGFubmVscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICB2YXIgdG9waWMgPSB3aW5kb3cubG9jYXRpb24uaG9zdCArIFwiLVwiICsgdGhpcy5kaXZpZDtcbiAgICAgICAgY3RybERpdi5hcHBlbmRDaGlsZChjaGF0QmFyKTtcbiAgICAgICAgJChjaGF0QmFyKS50ZXh0KFwiQ2hhdDogXCIpO1xuICAgICAgICAkKGNoYXRCYXIpLmFwcGVuZChjaGFubmVscyk7XG4gICAgICAgIGxldCBidXR0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICQoYnV0dCkuYWRkQ2xhc3MoXCJhY19vcHQgYnRuIGJ0bi1kZWZhdWx0XCIpO1xuICAgICAgICAkKGJ1dHQpLnRleHQoXCJDcmVhdGUgQ2hhbm5lbFwiKTtcbiAgICAgICAgJChidXR0KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgICAgICQoYnV0dCkuYXR0cihcInRhcmdldFwiLCBcIl9ibGFua1wiKTtcbiAgICAgICAgJChidXR0KS5hdHRyKFxuICAgICAgICAgICAgXCJocmVmXCIsXG4gICAgICAgICAgICBcImh0dHA6Ly9cIiArXG4gICAgICAgICAgICAgICAgY2hhdGNvZGVzU2VydmVyICtcbiAgICAgICAgICAgICAgICBcIi9uZXc/XCIgK1xuICAgICAgICAgICAgICAgICQucGFyYW0oe1xuICAgICAgICAgICAgICAgICAgICB0b3BpYzogd2luZG93LmxvY2F0aW9uLmhvc3QgKyBcIi1cIiArIHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IFwiUHl0aG9uXCIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jaGF0QnV0dG9uID0gYnV0dDtcbiAgICAgICAgY2hhdEJhci5hcHBlbmRDaGlsZChidXR0KTtcbiAgICAgICAgdmFyIHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBkb2MuZGF0YTtcbiAgICAgICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgICAgICQoY2hhbm5lbHMpLmh0bWwoXCJcIik7XG4gICAgICAgICAgICBkYXRhW1wiY2hhbm5lbHNcIl0uZm9yRWFjaChmdW5jdGlvbiAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbC5hcmNoaXZlZCAmJiB0b3BpYyA9PT0gY2hhbm5lbC50b3BpYykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluayA9ICQoXCI8YSAvPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhyZWYgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJodHRwOi8vXCIgKyBjaGF0Y29kZXNTZXJ2ZXIgKyBcIi9cIiArIGNoYW5uZWwuY2hhbm5lbE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsuYXR0cih7XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbGluay50ZXh0KFwiIFwiICsgY2hhbm5lbC5jaGFubmVsTmFtZSArIFwiKFwiICsgaSArIFwiKSBcIik7XG4gICAgICAgICAgICAgICAgICAgICQoY2hhbm5lbHMpLmFwcGVuZChsaW5rKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAkKGNoYW5uZWxzKS50ZXh0KFwiKG5vIGFjdGl2ZSBjb252ZXJzdGF0aW9ucyBvbiB0aGlzIHByb2JsZW0pXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkb2Muc3Vic2NyaWJlKHVwZGF0ZUNoYXRDb2Rlc0NoYW5uZWxzKTtcbiAgICAgICAgZG9jLm9uKFwib3BcIiwgdXBkYXRlQ2hhdENvZGVzQ2hhbm5lbHMpO1xuICAgIH1cblxuICAgIGVuYWJsZVNhdmVMb2FkKCkge1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KCQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NhdmVfcnVuXCIpKTtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmVjb2RlIC0tIElmIHRoZSBjb2RlIGhhcyBub3QgY2hhbmdlZCB3cnQgdGhlIHNjcnViYmVyIHBvc2l0aW9uIHZhbHVlIHRoZW4gZG9uJ3Qgc2F2ZSB0aGUgY29kZSBvciByZXBvc2l0aW9uIHRoZSBzY3J1YmJlclxuICAgIC8vICAtLSBzdGlsbCBjYWxsIHJ1bmxvZywgYnV0IGFkZCBhIHBhcmFtZXRlciB0byBub3Qgc2F2ZSB0aGUgY29kZVxuICAgIC8vIGFkZCBhbiBpbml0aWFsIGxvYWQgaGlzdG9yeSBidXR0b25cbiAgICAvLyBpZiB0aGVyZSBpcyBubyBlZGl0IHRoZW4gdGhlcmUgaXMgbm8gYXBwZW5kICAgdG9fc2F2ZSAoVHJ1ZS9GYWxzZSlcbiAgICBhc3luYyBhZGRIaXN0b3J5U2NydWJiZXIocG9zX2xhc3QpIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB2YXIgcmVxRGF0YSA9IHtcbiAgICAgICAgICAgIGFjaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnNpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXFEYXRhW1wic2lkXCJdID0gdGhpcy5zaWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXCJiZWZvcmUgZ2V0IGhpc3RcIik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByYWN0aWNlX21vZGUgfHxcbiAgICAgICAgICAgICh0aGlzLmlzVGltZWQgJiYgIXRoaXMuYXNzZXNzbWVudFRha2VuKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGltZWQgYW5kIGFscmVhZHkgdGFrZW4gd2Ugc2hvdWxkIHJlc3RvcmUgaGlzdG9yeSBpbmZvXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNjcnViYmVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGVCb29rQ29uZmlnLmFqYXhVUkwgKyBcImdldGhpc3QuanNvblwiLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcURhdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2gocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGlzdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeS5jb25jYXQoZGF0YS5oaXN0b3J5KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCBpbiBkYXRhLnRpbWVzdGFtcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGRhdGEudGltZXN0YW1wc1t0XSkudG9Mb2NhbGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBmZXRjaCBoaXN0b3J5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJTY3J1YmJlcihwb3NfbGFzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwic3VjY2Vzc1wiO1xuICAgIH1cblxuICAgIHJlbmRlclNjcnViYmVyKHBvc19sYXN0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwibWFraW5nIGEgbmV3IHNjcnViYmVyXCIpO1xuICAgICAgICB2YXIgc2NydWJiZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJkaXNwbGF5XCIsIFwiaW5saW5lLWJsb2NrXCIpO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5jc3MoXCJtYXJnaW4tbGVmdFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyhcIm1hcmdpbi1yaWdodFwiLCBcIjEwcHhcIik7XG4gICAgICAgICQoc2NydWJiZXJEaXYpLmNzcyh7XG4gICAgICAgICAgICBcIm1pbi13aWR0aFwiOiBcIjIwMHB4XCIsXG4gICAgICAgICAgICBcIm1heC13aWR0aFwiOiBcIjMwMHB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgc2NydWJiZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnRpbWVzdGFtcFAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgdGhpcy5zbGlkZWl0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5WyQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXSk7XG4gICAgICAgICAgICB2YXIgY3VyVmFsID0gdGhpcy50aW1lc3RhbXBzWyQoc2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXTtcbiAgICAgICAgICAgIGxldCBwb3MgPSAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgIGxldCBvdXRPZiA9IHRoaXMuaGlzdG9yeS5sZW5ndGg7XG4gICAgICAgICAgICAkKHRoaXMudGltZXN0YW1wUCkudGV4dChgJHtjdXJWYWx9IC0gJHtwb3MgKyAxfSBvZiAke291dE9mfWApO1xuICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBcImFjdGl2ZWNvZGVcIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwic2xpZGU6XCIgKyBjdXJWYWwsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLmRpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgICQoc2NydWJiZXIpLnNsaWRlcih7XG4gICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICB9KTtcbiAgICAgICAgJChzY3J1YmJlcikuY3NzKFwibWFyZ2luXCIsIFwiMTBweFwiKTtcbiAgICAgICAgJChzY3J1YmJlcikub24oXCJzbGlkZVwiLCB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSk7XG4gICAgICAgICQoc2NydWJiZXIpLm9uKFwic2xpZGVjaGFuZ2VcIiwgdGhpcy5zbGlkZWl0LmJpbmQodGhpcykpO1xuICAgICAgICBzY3J1YmJlckRpdi5hcHBlbmRDaGlsZChzY3J1YmJlcik7XG4gICAgICAgIHNjcnViYmVyRGl2LmFwcGVuZENoaWxkKHRoaXMudGltZXN0YW1wUCk7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGVhZGxpbmUgc2V0IHRoZW4gcG9zaXRpb24gdGhlIHNjcnViYmVyIGF0IHRoZSBsYXN0IHN1Ym1pc3Npb25cbiAgICAgICAgLy8gcHJpb3IgdG8gdGhlIGRlYWRsaW5lXG4gICAgICAgIGlmICh0aGlzLmRlYWRsaW5lKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCB0aGlzLmhpc3RvcnkubGVuZ3RoICYmICFkb25lKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKHRoaXMudGltZXN0YW1wc1tpXSkgPiB0aGlzLmRlYWRsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpID0gaSAtIDE7XG4gICAgICAgICAgICBzY3J1YmJlci52YWx1ZSA9IE1hdGgubWF4KGksIDApO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodGhpcy5oaXN0b3J5W3NjcnViYmVyLnZhbHVlXSk7XG4gICAgICAgICAgICAkKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiLCBzY3J1YmJlci52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9zX2xhc3QpIHtcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmhpc3Rvcnlbc2NydWJiZXIudmFsdWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjcnViYmVyLnZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zID0gJChzY3J1YmJlcikuc2xpZGVyKFwidmFsdWVcIik7XG4gICAgICAgIGxldCBvdXRPZiA9IHRoaXMuaGlzdG9yeS5sZW5ndGg7XG4gICAgICAgIGxldCB0cyA9IHRoaXMudGltZXN0YW1wc1skKHNjcnViYmVyKS5zbGlkZXIoXCJ2YWx1ZVwiKV07XG4gICAgICAgICQodGhpcy50aW1lc3RhbXBQKS50ZXh0KGAke3RzfSAtICR7cG9zICsgMX0gb2YgJHtvdXRPZn1gKTtcbiAgICAgICAgJCh0aGlzLmhpc3RCdXR0b24pLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmhpc3RCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciA9IHNjcnViYmVyO1xuICAgICAgICAkKHNjcnViYmVyRGl2KS5pbnNlcnRBZnRlcih0aGlzLnJ1bkJ1dHRvbik7XG4gICAgfSAvLyBlbmQgZGVmaW5pdGlvbiBvZiBoZWxwZXJcblxuICAgIGNyZWF0ZU91dHB1dCgpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgcGFyZW50IGRpdiB3aXRoIHR3byBlbGVtZW50czogIHByZSBmb3Igc3RhbmRhcmQgb3V0cHV0IGFuZCBhIGRpdlxuICAgICAgICAvLyB0byBob2xkIHR1cnRsZSBncmFwaGljcyBvdXRwdXQuICBXZSB1c2UgYSBkaXYgaW4gY2FzZSB0aGUgdHVydGxlIGNoYW5nZXMgZnJvbVxuICAgICAgICAvLyB1c2luZyBhIGNhbnZhcyB0byB1c2luZyBzb21lIG90aGVyIGVsZW1lbnQgbGlrZSBzdmcgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgdmFyIG91dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImFjX291dHB1dCBjb2wtbWQtMTJcIik7XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgIHRoaXMub3V0cHV0LmlkID0gdGhpcy5kaXZpZCArIFwiX3N0ZG91dFwiO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB0aGlzLmdyYXBoaWNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5ncmFwaGljcy5pZCA9IHRoaXMuZGl2aWQgKyBcIl9ncmFwaGljc1wiO1xuICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLmFkZENsYXNzKFwiYWMtY2FudmFzXCIpO1xuICAgICAgICAvLyBUaGlzIGJpdCBvZiBtYWdpYyBhZGRzIGFuIGV2ZW50IHdoaWNoIHdhaXRzIGZvciBhIGNhbnZhcyBjaGlsZCB0byBiZSBjcmVhdGVkIG9uIG91clxuICAgICAgICAvLyBuZXdseSBjcmVhdGVkIGRpdi4gIFdoZW4gYSBjYW52YXMgY2hpbGQgaXMgYWRkZWQgd2UgYWRkIGEgbmV3IGNsYXNzIHNvIHRoYXQgdGhlIHZpc2libGVcbiAgICAgICAgLy8gY2FudmFzIGNhbiBiZSBzdHlsZWQgaW4gQ1NTLiAgV2hpY2ggYSB0aGUgbW9tZW50IG1lYW5zIGp1c3QgYWRkaW5nIGEgYm9yZGVyLlxuICAgICAgICAkKHRoaXMuZ3JhcGhpY3MpLm9uKFxuICAgICAgICAgICAgXCJET01Ob2RlSW5zZXJ0ZWRcIixcbiAgICAgICAgICAgIFwiY2FudmFzXCIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzLmdyYXBoaWNzKS5hZGRDbGFzcyhcInZpc2libGUtYWMtY2FudmFzXCIpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLmdyYXBoaWNzKTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgbGVuc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGxlbnNEaXYuaWQgPSBgJHt0aGlzLmRpdmlkfV9jb2RlbGVuc2A7XG4gICAgICAgICQobGVuc0RpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgICQobGVuc0RpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIHRoaXMuY29kZWxlbnMgPSBsZW5zRGl2O1xuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGxlbnNEaXYpO1xuICAgICAgICB2YXIgY29hY2hEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNvYWNoRGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgJChjb2FjaERpdikuY3NzKFwiZGlzcGxheVwiLCBcIm5vbmVcIik7XG4gICAgICAgIHRoaXMuY29kZWNvYWNoID0gY29hY2hEaXY7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29hY2hEaXYpO1xuICAgICAgICBjbGVhckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICQoY2xlYXJEaXYpLmNzcyhcImNsZWFyXCIsIFwiYm90aFwiKTsgLy8gbmVlZGVkIHRvIG1ha2UgcGFyZW50IGRpdiByZXNpemUgcHJvcGVybHlcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChjbGVhckRpdik7XG4gICAgfVxuXG4gICAgZGlzYWJsZVNhdmVMb2FkKCkge1xuICAgICAgICAkKHRoaXMuc2F2ZUJ1dHRvbikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnNhdmVCdXR0b24pLmF0dHIoXCJ0aXRsZVwiLCBcIkxvZ2luIHRvIHNhdmUgeW91ciBjb2RlXCIpO1xuICAgICAgICAkKHRoaXMubG9hZEJ1dHRvbikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLmxvYWRCdXR0b24pLmF0dHIoXCJ0aXRsZVwiLCBcIkxvZ2luIHRvIGxvYWQgeW91ciBjb2RlXCIpO1xuICAgIH1cblxuICAgIGRvd25sb2FkRmlsZShsYW5nKSB7XG4gICAgICAgIHZhciBmbmIgPSB0aGlzLmRpdmlkO1xuICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHZhciBmaWxlTmFtZSA9XG4gICAgICAgICAgICBmbmIgK1xuICAgICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgICAgZFxuICAgICAgICAgICAgICAgIC50b0pTT04oKVxuICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgMTApIC8vIHJldmVyc2UgZGF0ZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCItXCIpXG4gICAgICAgICAgICAgICAgLmpvaW4oXCJcIikgK1xuICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgbGFuZ3VhZ2VFeHRlbnNpb25zW2xhbmddO1xuICAgICAgICB2YXIgY29kZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgIGlmIChcIkJsb2JcIiBpbiB3aW5kb3cpIHtcbiAgICAgICAgICAgIHZhciB0ZXh0VG9Xcml0ZSA9IGNvZGUucmVwbGFjZSgvXFxuL2csIFwiXFxyXFxuXCIpO1xuICAgICAgICAgICAgdmFyIHRleHRGaWxlQXNCbG9iID0gbmV3IEJsb2IoW3RleHRUb1dyaXRlXSwge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dC9wbGFpblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoXCJtc1NhdmVPck9wZW5CbG9iXCIgaW4gbmF2aWdhdG9yKSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IodGV4dEZpbGVBc0Jsb2IsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGRvd25sb2FkTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5kb3dubG9hZCA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIGRvd25sb2FkTGluay5pbm5lckhUTUwgPSBcIkRvd25sb2FkIEZpbGVcIjtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuaHJlZiA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHRleHRGaWxlQXNCbG9iKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRMaW5rKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZExpbmsuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsZXJ0KFwiWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIEhUTUw1IEJsb2IuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDb2RlKCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmRpdmlkKTtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZUdyYWRlU3VtbWFyeSgpIHtcbiAgICAgICAgLy8gZ2V0IGdyYWRlIGFuZCBjb21tZW50cyBmb3IgdGhpcyBhc3NpZ25tZW50XG4gICAgICAgIC8vIGdldCBzdW1tYXJ5IG9mIGFsbCBncmFkZXMgZm9yIHRoaXMgc3R1ZGVudFxuICAgICAgICAvLyBkaXNwbGF5IGdyYWRlcyBpbiBtb2RhbCB3aW5kb3dcbiAgICAgICAgdmFyIGRhdGEgPSB7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoZUJvb2tDb25maWcuYWpheFVSTCArIFwiZ2V0YXNzaWdubWVudGdyYWRlXCIsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcbiAgICAgICAgbGV0IHJlcG9ydCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdmFyIGJvZHk7XG4gICAgICAgIC8vIGNoZWNrIGZvciByZXBvcnRbJ21lc3NhZ2UnXVxuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgICBpZiAocmVwb3J0W1widmVyc2lvblwiXSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gbmV3IHZlcnNpb247IHdvdWxkIGJlIGJldHRlciB0byBlbWJlZCB0aGlzIGluIEhUTUwgZm9yIHRoZSBhY3RpdmVjb2RlXG4gICAgICAgICAgICAgICAgYm9keSA9XG4gICAgICAgICAgICAgICAgICAgIFwiPGg0PkdyYWRlIFJlcG9ydDwvaDQ+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPlRoaXMgcXVlc3Rpb246IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl07XG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFtcInJlbGVhc2VkXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgKz0gXCIgb3V0IG9mIFwiICsgcmVwb3J0W1wibWF4XCJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib2R5ICs9IFwiPC9wPiA8cD5cIjtcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0W1wicmVsZWFzZWRcIl0gPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keSArPSBcIlByZWxpbWluYXJ5IENvbW1lbnRzOiBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9keSArPSByZXBvcnRbXCJjb21tZW50XCJdICsgXCI8L3A+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJvZHkgPVxuICAgICAgICAgICAgICAgICAgICBcIjxoND5HcmFkZSBSZXBvcnQ8L2g0PlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCI8cD5UaGlzIGFzc2lnbm1lbnQ6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiZ3JhZGVcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+XCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJjb21tZW50XCJdICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L3A+XCIgK1xuICAgICAgICAgICAgICAgICAgICBcIjxwPk51bWJlciBvZiBncmFkZWQgYXNzaWdubWVudHM6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0W1wiY291bnRcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiPHA+QXZlcmFnZSBzY29yZTogXCIgK1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRbXCJhdmdcIl0gK1xuICAgICAgICAgICAgICAgICAgICBcIjwvcD5cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJvZHkgPSBcIjxoND5UaGUgc2VydmVyIGRpZCBub3QgcmV0dXJuIGFueSBncmFkZSBpbmZvcm1hdGlvbjwvaDQ+XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGh0bWwgPSBgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgY29tcGFyZS1tb2RhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+QXNzaWdubWVudCBGZWVkYmFjazwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7Ym9keX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB2YXIgZWwgPSAkKGh0bWwpO1xuICAgICAgICBlbC5tb2RhbCgpO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBhc3luYyBzaG93Q29kZWxlbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvZGVsZW5zLnN0eWxlLmRpc3BsYXkgPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaGlkZV9jb2RlbGVuc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zaG93X2luX2NvZGVsZW5zXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjbCA9IHRoaXMuY29kZWxlbnMuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKGNsKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVsZW5zLnJlbW92ZUNoaWxkKGNsKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29kZSA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKGZhbHNlKTtcbiAgICAgICAgdmFyIG15VmFycyA9IHt9O1xuICAgICAgICBteVZhcnMuY29kZSA9IGNvZGU7XG4gICAgICAgIG15VmFycy5vcmlnaW4gPSBcIm9wdC1mcm9udGVuZC5qc1wiO1xuICAgICAgICBteVZhcnMuY3VtdWxhdGl2ZSA9IGZhbHNlO1xuICAgICAgICBteVZhcnMuaGVhcFByaW1pdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLmRyYXdQYXJlbnRQb2ludGVycyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMudGV4dFJlZmVyZW5jZXMgPSBmYWxzZTtcbiAgICAgICAgbXlWYXJzLnNob3dPbmx5T3V0cHV0cyA9IGZhbHNlO1xuICAgICAgICBteVZhcnMucmF3SW5wdXRMc3RKU09OID0gSlNPTi5zdHJpbmdpZnkoW10pO1xuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PSBcInB5dGhvblwiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5weXRob24zKSB7XG4gICAgICAgICAgICAgICAgbXlWYXJzLnB5ID0gMztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbXlWYXJzLnB5ID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhbmdhdWdlID09IFwiamF2YXNjcmlwdFwiKSB7XG4gICAgICAgICAgICBteVZhcnMucHkgPSBcImpzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBteVZhcnMucHkgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICB9XG4gICAgICAgIG15VmFycy5jdXJJbnN0ciA9IDA7XG4gICAgICAgIG15VmFycy5jb2RlRGl2V2lkdGggPSAzNTA7XG4gICAgICAgIG15VmFycy5jb2RlRGl2SGVpZ2h0ID0gNDAwO1xuICAgICAgICB2YXIgc3JjVVJMID0gXCJodHRwczovL3B5dGhvbnR1dG9yLmNvbS9pZnJhbWUtZW1iZWQuaHRtbFwiO1xuICAgICAgICB2YXIgc3JjVmFycyA9ICQucGFyYW0obXlWYXJzKTtcbiAgICAgICAgdmFyIGVtYmVkVXJsU3RyID0gYCR7c3JjVVJMfSMke3NyY1ZhcnN9YDtcbiAgICAgICAgdmFyIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5kaXZpZCArIFwiX2NvZGVsZW5zXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBcIjgwMFwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIFwiNTAwXCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLmJhY2tncm91bmQgPSBcIiNmZmZcIjtcbiAgICAgICAgLy9teUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIixzcmNVUkwpXG4gICAgICAgIG15SWZyYW1lLnNyYyA9IGVtYmVkVXJsU3RyO1xuICAgICAgICB0aGlzLmNvZGVsZW5zLmFwcGVuZENoaWxkKG15SWZyYW1lKTtcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiY29kZWxlbnNcIixcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyA8aWZyYW1lIGlkPVwiJShkaXZpZClzX2NvZGVsZW5zXCIgd2lkdGg9XCI4MDBcIiBoZWlnaHQ9XCI1MDBcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2tcInNyYz1cIiNcIj5cbiAgICAvLyA8L2lmcmFtZT5cbiAgICBzaG93Q29kZUNvYWNoKCkge1xuICAgICAgICB2YXIgbXlJZnJhbWU7XG4gICAgICAgIHZhciBzcmNVUkw7XG4gICAgICAgIHZhciBjbDtcbiAgICAgICAgdmFyIGRpdl9pZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIGlmICh0aGlzLmNvZGVjb2FjaCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2guc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgfVxuICAgICAgICBjbCA9IHRoaXMuY29kZWNvYWNoLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjbCkge1xuICAgICAgICAgICAgdGhpcy5jb2RlY29hY2gucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICB9XG4gICAgICAgIHNyY1VSTCA9IGVCb29rQ29uZmlnLmFwcCArIFwiL2FkbWluL2RpZmZ2aWV3ZXI/ZGl2aWQ9XCIgKyBkaXZfaWQ7XG4gICAgICAgIG15SWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgICAgbXlJZnJhbWUuc2V0QXR0cmlidXRlKFwiaWRcIiwgZGl2X2lkICsgXCJfY29hY2hcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiODAwcHhcIik7XG4gICAgICAgIG15SWZyYW1lLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBcIjUwMHB4XCIpO1xuICAgICAgICBteUlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6YmxvY2tcIik7XG4gICAgICAgIG15SWZyYW1lLnN0eWxlLmJhY2tncm91bmQgPSBcIiNmZmZcIjtcbiAgICAgICAgbXlJZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgICAgbXlJZnJhbWUuc3JjID0gc3JjVVJMO1xuICAgICAgICB0aGlzLmNvZGVjb2FjaC5hcHBlbmRDaGlsZChteUlmcmFtZSk7XG4gICAgICAgICQodGhpcy5jb2RlY29hY2gpLnNob3coKTtcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiY29hY2hcIixcbiAgICAgICAgICAgIGFjdDogXCJ2aWV3XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvZ2dsZUVkaXRvclZpc2liaWxpdHkoKSB7fVxuXG4gICAgYWRkRXJyb3JNZXNzYWdlKGVycikge1xuICAgICAgICAvLyBBZGQgdGhlIGVycm9yIG1lc3NhZ2VcbiAgICAgICAgdGhpcy5lcnJMYXN0UnVuID0gdHJ1ZTtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lciA9IHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5jbGFzc05hbWUgPSBcImVycm9yIGFsZXJ0IGFsZXJ0LWRhbmdlclwiO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZXJySGVhZFswXSk7XG4gICAgICAgIHZhciBlcnJUZXh0ID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKVxuICAgICAgICApO1xuICAgICAgICAvLyBCdXQsIGFkanVzdCB0aGUgbGluZSBudW1iZXJzLiAgSWYgdGhlIGxpbmUgbnVtYmVyIGlzIDw9IHByZXRleHRMaW5lcyB0aGVuIGl0IGlzIGluIGluY2x1ZGVkIGNvZGVcbiAgICAgICAgLy8gaWYgaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgaW5jbHVkZWQgbGluZXMgYnV0IGxlc3MgdGhhbiB0aGUgcHJldGV4dCArIGN1cnJlbnQgZWRpdG9yIHRoZW4gaXQgaXMgaW4gdGhlIHN0dWRlbnQgY29kZS5cbiAgICAgICAgLy8gYWRqdXN0IHRoZSBsaW5lIG51bWJlciB3ZSBkaXNwbGF5IGJ5IGVsaW1pbmF0aW5nIHRoZSBwcmUtaW5jbHVkZWQgY29kZS5cbiAgICAgICAgaWYgKGVyci50cmFjZWJhY2subGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIHZhciBlcnJvckxpbmUgPSBlcnIudHJhY2ViYWNrWzBdLmxpbmVubztcbiAgICAgICAgICAgIGlmIChlcnJvckxpbmUgPD0gdGhpcy5wcmV0ZXh0TGluZXMpIHtcbiAgICAgICAgICAgICAgICBlcnJUZXh0LmlubmVySFRNTCA9XG4gICAgICAgICAgICAgICAgICAgIFwiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIGhpZGRlbiwgaW5jbHVkZWQgY29kZS4gU29ycnkgd2UgY2FuJ3QgZ2l2ZSB5b3UgYSBtb3JlIGhlbHBmdWwgZXJyb3IgbWVzc2FnZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3JMaW5lID4gdGhpcy5wcm9nTGluZXMgKyB0aGlzLnByZXRleHRMaW5lcykge1xuICAgICAgICAgICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gYEFuIGVycm9yIG9jY3VycmVkIGFmdGVyIHRoZSBlbmQgb2YgeW91ciBjb2RlLlxuT25lIHBvc3NpYmxlIHJlYXNvbiBpcyB0aGF0IHlvdSBoYXZlIGFuIHVuY2xvc2VkIHBhcmVudGhlc2lzIG9yIHN0cmluZy5cbkFub3RoZXIgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgaGlkZGVuIHRlc3QgY29kZS5cbllldCBhbm90aGVyIGlzIHRoYXQgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IuICBUaGUgaW50ZXJuYWwgZXJyb3IgbWVzc2FnZSBpczogJHtlcnIubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldGV4dExpbmVzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnIudHJhY2ViYWNrWzBdLmxpbmVubyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIudHJhY2ViYWNrWzBdLmxpbmVubyAtIHRoaXMucHJldGV4dExpbmVzICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVyclN0cmluZyA9IGVyci50b1N0cmluZygpO1xuICAgICAgICB2YXIgdG8gPSBlcnJTdHJpbmcuaW5kZXhPZihcIjpcIik7XG4gICAgICAgIHZhciBlcnJOYW1lID0gZXJyU3RyaW5nLnN1YnN0cmluZygwLCB0byk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyU3RyaW5nO1xuICAgICAgICAkKHRoaXMuZUNvbnRhaW5lcikuYXBwZW5kKFwiPGgzPkRlc2NyaXB0aW9uPC9oMz5cIik7XG4gICAgICAgIHZhciBlcnJEZXNjID0gdGhpcy5lQ29udGFpbmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpKTtcbiAgICAgICAgZXJyRGVzYy5pbm5lckhUTUwgPSBlcnJvclRleHRbZXJyTmFtZV07XG4gICAgICAgICQodGhpcy5lQ29udGFpbmVyKS5hcHBlbmQoXCI8aDM+VG8gRml4PC9oMz5cIik7XG4gICAgICAgIHZhciBlcnJGaXggPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIikpO1xuICAgICAgICBlcnJGaXguaW5uZXJIVE1MID0gZXJyb3JUZXh0W2Vyck5hbWUgKyBcIkZpeFwiXTtcbiAgICAgICAgdmFyIG1vcmVJbmZvID0gXCIuLi9FcnJvckhlbHAvXCIgKyBlcnJOYW1lLnRvTG93ZXJDYXNlKCkgKyBcIi5odG1sXCI7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJSdW50aW1lIEVycm9yOiBcIiArIGVyci50b1N0cmluZygpKTtcbiAgICB9XG4gICAgc2V0VGltZUxpbWl0KHRpbWVyKSB7XG4gICAgICAgIHZhciB0aW1lbGltaXQgPSB0aGlzLnRpbWVsaW1pdDtcbiAgICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRpbWVsaW1pdCA9IHRpbWVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBleGVjTGltaXQgaW4gbWlsbGlzZWNvbmRzICAtLSBmb3Igc3R1ZGVudCBwcm9qZWN0cyBzZXQgdGhpcyB0b1xuICAgICAgICAvLyAyNSBzZWNvbmRzIC0tIGp1c3QgbGVzcyB0aGFuIENocm9tZSdzIG93biB0aW1lci5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5jb2RlLmluZGV4T2YoXCJvbnRpbWVyXCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwib25jbGlja1wiKSA+IC0xIHx8XG4gICAgICAgICAgICB0aGlzLmNvZGUuaW5kZXhPZihcIm9ua2V5XCIpID4gLTEgfHxcbiAgICAgICAgICAgIHRoaXMuY29kZS5pbmRleE9mKFwic2V0RGVsYXlcIikgPiAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIFNrLmV4ZWNMaW1pdCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGltZWxpbWl0ID09PSBcIm9mZlwiKSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZWxpbWl0KSB7XG4gICAgICAgICAgICAgICAgU2suZXhlY0xpbWl0ID0gdGltZWxpbWl0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBTay5leGVjTGltaXQgPSAyNTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBidWlsdGluUmVhZCh4KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFNrLmJ1aWx0aW5GaWxlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBTay5idWlsdGluRmlsZXNbXCJmaWxlc1wiXVt4XSA9PT0gdW5kZWZpbmVkXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ZpbGVfbm90X2ZvdW5kXCIsIHgpO1xuICAgICAgICByZXR1cm4gU2suYnVpbHRpbkZpbGVzW1wiZmlsZXNcIl1beF07XG4gICAgfVxuICAgIGZpbGVSZWFkZXIoZGl2aWQpIHtcbiAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGxldCBkYXRhID0gXCJcIjtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChlbGVtID09IG51bGwgJiYgU2suYnVpbHRpbkZpbGVzLmZpbGVzLmhhc093blByb3BlcnR5KGRpdmlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIFNrLmJ1aWx0aW5GaWxlc1tcImZpbGVzXCJdW2RpdmlkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRyeSByZW1vdGUgZmlsZSB1bmxlc3MgaXQgZW5kcyB3aXRoIC5qcyBvciAucHkgLS0gb3RoZXJ3aXNlIHdlJ2xsIGFzayB0aGUgc2VydmVyIGZvciBhbGxcbiAgICAgICAgICAgIC8vIGtpbmRzIG9mIG1vZHVsZXMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGltcG9ydFxuICAgICAgICAgICAgaWYgKCEoZGl2aWQuZW5kc1dpdGgoXCIuanNcIikgfHwgZGl2aWQuZW5kc1dpdGgoXCIucHlcIikpKSB7XG4gICAgICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGAvcnVuZXN0b25lL2FqYXgvZ2V0X2RhdGFmaWxlP2NvdXJzZV9pZD0ke2VCb29rQ29uZmlnLmNvdXJzZX0mYWNpZD0ke2RpdmlkfWAsXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGRhdGEpLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCAmJiByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbm9fZmlsZV9vcl9kaXJcIiwgZGl2aWQpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZWxlbS52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGVsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIG91dHB1dGZ1bih0ZXh0KSB7XG4gICAgICAgIC8vIGJubSBweXRob24gM1xuICAgICAgICB2YXIgcHlTdHIgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIltcIiArIHguam9pbihcIiwgXCIpICsgXCJdXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgeCA9IHRleHQ7XG4gICAgICAgIGlmICghdGhpcy5weXRob24zKSB7XG4gICAgICAgICAgICBpZiAoeC5jaGFyQXQoMCkgPT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB4ID0geC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgeCA9IFwiW1wiICsgeCArIFwiXVwiO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4bCA9IGV2YWwoeCk7XG4gICAgICAgICAgICAgICAgICAgIHhsID0geGwubWFwKHB5U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgeCA9IHhsLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwidmlzaWJsZVwiKTtcbiAgICAgICAgdGV4dCA9IHg7XG4gICAgICAgIHRleHQgPSB0ZXh0XG4gICAgICAgICAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5hcHBlbmQodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmaWxld3JpdGVyKGZvYmosIGJ5dGVzKSB7XG4gICAgICAgIGxldCBmaWxlY29tcG9uZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9iai5uYW1lKTtcbiAgICAgICAgaWYgKCFmaWxlY29tcG9uZW50KSB7XG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgICQoY29udGFpbmVyKS5hZGRDbGFzcyhcInJ1bmVzdG9uZVwiKTtcbiAgICAgICAgICAgIGxldCB0YWIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgJCh0YWIpLmFkZENsYXNzKFwiZGF0YWZpbGVfY2FwdGlvblwiKTtcbiAgICAgICAgICAgIHRhYi5pbm5lckhUTUwgPSBgRGF0YSBmaWxlOiA8Y29kZT4ke2ZvYmoubmFtZX08L2NvZGU+YDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gICAgICAgICAgICBmaWxlY29tcG9uZW50LnJvd3MgPSAxMDtcbiAgICAgICAgICAgIGZpbGVjb21wb25lbnQuY29scyA9IDUwO1xuICAgICAgICAgICAgZmlsZWNvbXBvbmVudC5pZCA9IGZvYmoubmFtZTtcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuY3NzKFwibWFyZ2luLWJvdHRvbVwiLCBcIjVweFwiKTtcbiAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGFiKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChmaWxlY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb2JqLnBvcyQgPT0gMCkge1xuICAgICAgICAgICAgICAgICQoZmlsZWNvbXBvbmVudCkudmFsKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjdXJyZW50ID0gJChmaWxlY29tcG9uZW50KS52YWwoKTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQgKyBieXRlcy52O1xuICAgICAgICAkKGZpbGVjb21wb25lbnQpLnZhbChjdXJyZW50KTtcbiAgICAgICAgJChmaWxlY29tcG9uZW50KS5jc3MoXCJkaXNwbGF5XCIsIFwiYmxvY2tcIik7XG4gICAgICAgIGZvYmoucG9zJCA9IGN1cnJlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gY3VycmVudC5sZW5ndGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0SW5jbHVkZWRDb2RlKGRpdmlkKSB7XG4gICAgICAgIGlmICh3aW5kb3cuZWRMaXN0W2RpdmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5lZExpc3RbZGl2aWRdLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICBgL3J1bmVzdG9uZS9hamF4L2dldF9kYXRhZmlsZT9jb3Vyc2VfaWQ9JHtlQm9va0NvbmZpZy5jb3Vyc2V9JmFjaWQ9JHtkaXZpZH1gLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgd3Jlc3VsdCA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IG9iaiA9IGF3YWl0IHdyZXN1bHQuanNvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG9iai5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgYnVpbGRQcm9nKHVzZVN1ZmZpeCkge1xuICAgICAgICAvLyBhc3NlbWJsZSBjb2RlIGZyb20gcHJlZml4LCBzdWZmaXgsIGFuZCBlZGl0b3IgZm9yIHJ1bm5pbmcuXG4gICAgICAgIHZhciBwcmV0ZXh0O1xuICAgICAgICB2YXIgcHJvZyA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCkgKyBcIlxcblwiO1xuICAgICAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgIHByb2cgPSB0aGlzLnByZWZpeCArIHByb2c7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV0ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5wcmV0ZXh0TGluZXMgPSAwO1xuICAgICAgICB0aGlzLnByb2dMaW5lcyA9IHByb2cubWF0Y2goL1xcbi9nKS5sZW5ndGggKyAxO1xuICAgICAgICBpZiAodGhpcy5pbmNsdWRlcykge1xuICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBpbmNsdWRlcywgaW4tb3JkZXIgcHJlcGVuZGluZyB0byBwcm9nXG4gICAgICAgICAgICBwcmV0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGhpcy5pbmNsdWRlcy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGxldCBpQ29kZSA9IGF3YWl0IHRoaXMuZ2V0SW5jbHVkZWRDb2RlKHRoaXMuaW5jbHVkZXNbeF0pO1xuICAgICAgICAgICAgICAgIHByZXRleHQgPSBwcmV0ZXh0ICsgaUNvZGUgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmV0ZXh0ID0gcHJldGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXRleHRMaW5lcyA9ICh0aGlzLnByZXRleHQubWF0Y2goL1xcbi9nKSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9nID0gcHJldGV4dCArIHByb2c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZVN1ZmZpeCAmJiB0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgcHJvZyA9IHByb2cgKyB0aGlzLnN1ZmZpeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2cpO1xuICAgIH1cblxuICAgIGFzeW5jIG1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSkge1xuICAgICAgICBpZiAodGhpcy5oaXN0b3J5U2NydWJiZXIgPT09IG51bGwgJiYgIXRoaXMuYXV0b3J1bikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRIaXN0b3J5U2NydWJiZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlTY3J1YmJlciAmJlxuICAgICAgICAgICAgdGhpcy5oaXN0b3J5WyQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcInZhbHVlXCIpXSAhPVxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmdldFZhbHVlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godGhpcy5lZGl0b3IuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMucHVzaChuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCkpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFxuICAgICAgICAgICAgICAgIFwib3B0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJtYXhcIixcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIixcbiAgICAgICAgICAgICAgICB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVpdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2F2ZUNvZGUgPSBcIkZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeVNjcnViYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHNhdmVDb2RlID0gXCJGYWxzZVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYXZlQ29kZTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1blByb2coKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYGVycm9yIHJ1bm5pbmcgY29kZSAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dDdXJyZW50QW5zd2VyKCkge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgICAgIGNvZGU6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG4gICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgZXJyaW5mbzogdGhpcy5lcnJpbmZvLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsIGRhdGFbJ2NvZGUnXSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmxvZ1J1bkV2ZW50KGRhdGEpOyAvLyBMb2cgdGhlIHJ1biBldmVudFxuICAgICAgICAvLyBJZiB1bml0IHRlc3RzIHdlcmUgcnVuIHRoZXJlIHdpbGwgYmUgYSB1bml0X3Jlc3VsdHNcbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIC8vIFRoZSBweXRob24gdW5pdCB0ZXN0IGNvZGUgYnVpbGRzIHRoZSB0YWJsZSBhcyBpdCBpcyBydW5uaW5nIHRoZSB0ZXN0c1xuICAgICAgICAvLyBJbiBcIm5vcm1hbFwiIHVzYWdlIHRoaXMgaXMgZGlzcGxheWVkIGltbWVkaWF0ZWx5LlxuICAgICAgICAvLyBIb3dldmVyIGluIGV4YW0gbW9kZSB3ZSBtYWtlIGEgZGl2IHdoaWNoIGlzIG9mZnNjcmVlblxuICAgICAgICBpZiAodGhpcy51bml0X3Jlc3VsdHNfZGl2aWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXRfcmVzdWx0c19kaXZpZC5pbmRleE9mKFwiX29mZnNjcmVlbl9cIikgPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSBgJHt0aGlzLmRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYDtcbiAgICAgICAgICAgICAgICBsZXQgdW5pdEZlZWRiYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XG4gICAgICAgICAgICAgICAgbGV0IHRtcCA9IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodW5pdEZlZWRiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wID0gJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfWApWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodG1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCh0bXApLnNob3coKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHVyRGl2aWQgPSB0aGlzLmRpdmlkICsgXCJfdW5pdF9yZXN1bHRzXCI7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKHRoaXMub3V0ZXJEaXYpLmZpbmQoYCMke3VyRGl2aWR9YCkubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm91dGVyRGl2KS5maW5kKGAjJHt1ckRpdmlkfV9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodXJEaXZpZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQodXJSZXN1bHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBydW5Qcm9nIGhhcyBzZXZlcmFsIGFzeW5jIGVsZW1lbnRzIHRvIGl0LlxuICAgICAqIDEuIFNrdWxwdCBydW5zIHRoZSBweXRob24gcHJvZ3JhbSBhc3luY2hyb25vdXNseVxuICAgICAqIDIuIFRoZSBoaXN0b3J5IGlzIHJlc3RvcmVkIGFzeW5jaHJvbm91c2x5XG4gICAgICogMy4gTG9nZ2luZyBpcyBhc3luY2hyb25vdXNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNrdWxwdCBQcm9taXNlIGFuZCBzbyB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBza3VscHQgaXMgZmluaXNoZWQuXG4gICAgICogd2hlbiBmaW5pc2hlZCB0aGlzLnVuaXRfcmVzdWx0cyB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdHMgb2YgYW55IHVuaXQgdGVzdHMgdGhhdCBoYXZlIGJlZW4gcnVuLlxuICAgICAqIFRoZSB0YWJsZSBvZiByZXN1bHRzIGlzIGNvbnN0cnVjdGVkIGFuZCBhZGRlZCB0byB0aGUgRE9NIGJ5IHRoZSBweXRob24gdW5pdHRlc3QuZ3VpIG1vZHVsZSBpbiBza3VscHQuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJzdGFydGluZyBydW5Qcm9nXCIpO1xuICAgICAgICBpZiAodHlwZW9mIGxvZ1Jlc3VsdHMgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMubG9nUmVzdWx0cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygbm9VSSAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIG5vVUkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvZyA9IGF3YWl0IHRoaXMuYnVpbGRQcm9nKHRydWUpO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIHdoaWxlICgkKGAjJHt0aGlzLmRpdmlkfV9lcnJpbmZvYCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fZXJyaW5mb2ApLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5jb2RlbGVucykge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuY2xCdXR0b24uaW5uZXJUZXh0ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfc2hvd19pbl9jb2RlbGVuc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBTay5jb25maWd1cmUoe1xuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLm91dHB1dGZ1bi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgcmVhZDogdGhpcy5maWxlUmVhZGVyLFxuICAgICAgICAgICAgZmlsZXdyaXRlOiB0aGlzLmZpbGV3cml0ZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIF9fZnV0dXJlX186IFNrLnB5dGhvbjMsXG4gICAgICAgICAgICBub25yZWFkb3BlbjogdHJ1ZSxcbiAgICAgICAgICAgIC8vICAgICAgICBweXRob24zOiB0aGlzLnB5dGhvbjMsXG4gICAgICAgICAgICBpbWFnZVByb3h5OiBcImh0dHA6Ly9pbWFnZS5ydW5lc3RvbmUuYWNhZGVteTo4MDgwLzMyMHhcIixcbiAgICAgICAgICAgIGlucHV0ZnVuVGFrZXNQcm9tcHQ6IHRydWUsXG4gICAgICAgICAgICBqc29ucFNpdGVzOiBbXCJodHRwczovL2l0dW5lcy5hcHBsZS5jb21cIl0sXG4gICAgICAgIH0pO1xuICAgICAgICBTay5kaXZpZCA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIFNrLmxvZ1Jlc3VsdHMgPSBsb2dSZXN1bHRzO1xuXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZGl2aWQsdGhpcy5jb2RlKTtcblxuICAgICAgICBpZiAodGhpcy5ncmFkZXJhY3RpdmUgJiYgdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikpIHtcbiAgICAgICAgICAgIFNrLmdyYWRlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5jbG9zZXN0KFwiLmxvYWRpbmdcIikuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTay5ncmFkZUNvbnRhaW5lciA9IHRoaXMuZGl2aWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUaW1lTGltaXQoKTtcbiAgICAgICAgKFNrLlR1cnRsZUdyYXBoaWNzIHx8IChTay5UdXJ0bGVHcmFwaGljcyA9IHt9KSkudGFyZ2V0ID0gdGhpcy5ncmFwaGljcztcbiAgICAgICAgU2suY2FudmFzID0gdGhpcy5ncmFwaGljcy5pZDsgLy90b2RvOiBnZXQgcmlkIG9mIHRoaXMgaGVyZSBhbmQgaW4gaW1hZ2VcbiAgICAgICAgaWYgKCFub1VJKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIodGhpcy5zYXZlQ29kZSk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9mZihcInNsaWRlY2hhbmdlXCIpO1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKFwiZGlzYWJsZVwiKTtcbiAgICAgICAgICAgICQodGhpcy5vdXREaXYpLnNob3coe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA3MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2suaW1wb3J0TWFpbldpdGhCb2R5KFwiPHN0ZGluPlwiLCBmYWxzZSwgcHJvZywgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikub24oXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJlbmFibGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghbm9VSSkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuaGlzdG9yeVNjcnViYmVyKS5zbGlkZXIoXCJlbmFibGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVycmluZm8gPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXJyb3JNZXNzYWdlKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5hbGxWaXN1YWxpemVycyAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgJC5lYWNoKHdpbmRvdy5hbGxWaXN1YWxpemVycywgZnVuY3Rpb24gKGksIGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5yZWRyYXdDb25uZWN0b3JzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNhYmxlSW50ZXJhY3Rpb24oKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmhpZGUoKTtcbiAgICAgICAgJCh0aGlzLmNvZGVEaXYpLmFkZENsYXNzKFwiYWMtZGlzYWJsZWRcIik7XG4gICAgfVxufVxuXG52YXIgbGFuZ3VhZ2VFeHRlbnNpb25zID0ge1xuICAgIHB5dGhvbjogXCJweVwiLFxuICAgIGh0bWw6IFwiaHRtbFwiLFxuICAgIGphdmFzY3JpcHQ6IFwianNcIixcbiAgICBqYXZhOiBcImphdmFcIixcbiAgICBweXRob24yOiBcInB5XCIsXG4gICAgcHl0aG9uMzogXCJweVwiLFxuICAgIGNwcDogXCJjcHBcIixcbiAgICBjOiBcImNcIixcbiAgICBzcWw6IFwic3FsXCIsXG4gICAgb2N0YXZlOiBcIm1cIixcbn07XG5cbnZhciBlcnJvclRleHQgPSB7fTtcblxuZXJyb3JUZXh0LlBhcnNlRXJyb3IgPSAkLmkxOG4oXCJtc2dfc2N0aXZlY29kZV9wYXJzZV9lcnJvclwiKTtcbmVycm9yVGV4dC5QYXJzZUVycm9yRml4ID0gJC5pMThuKFwibXNnX3NjdGl2ZWNvZGVfcGFyc2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlR5cGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3R5cGVfZXJyb3JcIik7XG5lcnJvclRleHQuVHlwZUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdHlwZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuTmFtZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbmFtZV9lcnJvclwiKTtcbmVycm9yVGV4dC5OYW1lRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9uYW1lX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5WYWx1ZUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdmFsdWVfZXJyb3JcIik7XG5lcnJvclRleHQuVmFsdWVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3ZhbHVlX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvclwiKTtcbmVycm9yVGV4dC5BdHRyaWJ1dGVFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2F0dHJpYnV0ZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVG9rZW5FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Rva2VuX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlRva2VuRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90b2tlbl9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuVGltZUxpbWl0RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2Vycm9yXCIpO1xuZXJyb3JUZXh0LlRpbWVMaW1pdEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdGltZV9saW1pdF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9nZW5lcmFsX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfZ2VuZXJhbF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuU3ludGF4RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JcIik7XG5lcnJvclRleHQuU3ludGF4RXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zeW50YXhfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LkluZGV4RXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRleF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbmRleEVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5kZXhfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0LlVSSUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlVSSUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfdXJpX2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5JbXBvcnRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvclwiKTtcbmVycm9yVGV4dC5JbXBvcnRFcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ltcG9ydF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuUmVmZXJlbmNlRXJyb3IgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JcIik7XG5lcnJvclRleHQuUmVmZXJlbmNlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZWZlcmVuY2VfZXJyb3JfZml4XCIpO1xuZXJyb3JUZXh0Llplcm9EaXZpc2lvbkVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfemVyb19kaXZpc2lvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5aZXJvRGl2aXNpb25FcnJvckZpeCA9ICQuaTE4bihcbiAgICBcIm1zZ19hY3RpdmVjb2RlX3plcm9fZGl2aXNpb25fZXJyb3JfZml4XCJcbik7XG5lcnJvclRleHQuUmFuZ2VFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3JhbmdlX2Vycm9yXCIpO1xuZXJyb3JUZXh0LlJhbmdlRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yYW5nZV9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW50ZXJuYWxFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2ludGVybmFsX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkludGVybmFsRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbnRlcm5hbF9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuSW5kZW50YXRpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2luZGVudGF0aW9uX2Vycm9yXCIpO1xuZXJyb3JUZXh0LkluZGVudGF0aW9uRXJyb3JGaXggPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9pbmRlbnRhdGlvbl9lcnJvcl9maXhcIik7XG5lcnJvclRleHQuTm90SW1wbGVtZW50ZWRFcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX25vdF9pbXBsZW1lbnRlZF9lcnJvclwiKTtcbmVycm9yVGV4dC5Ob3RJbXBsZW1lbnRlZEVycm9yRml4ID0gJC5pMThuKFxuICAgIFwibXNnX2FjdGl2ZWNvZGVfbm90X2ltcGxlbWVudGVkX2Vycm9yX2ZpeFwiXG4pO1xuZXJyb3JUZXh0LktleUVycm9yID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yXCIpO1xuZXJyb3JUZXh0LktleUVycm9yRml4ID0gJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfa2V5X2Vycm9yX2ZpeFwiKTtcbmVycm9yVGV4dC5Bc3NlcnRpb25FcnJvciA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvclwiKTtcbmVycm9yVGV4dC5Bc3NlcnRpb25FcnJvckZpeCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX2Fzc2VydGlvbl9lcnJvcl9maXhcIik7XG5cblN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uICh0YXJnZXQsIHJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaXQodGFyZ2V0KS5qb2luKHJlcGxhY2VtZW50KTtcbn07XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcnl0aG9uQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMucHl0aG9uM19pbnRlcnByZXRlciA9ICQob3JpZykuZGF0YShcInB5dGhvbjNfaW50ZXJwcmV0ZXJcIik7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoXCJSZW5kZXJcIik7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgbGV0IHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBhd2FpdCB0aGlzLm1hbmFnZV9zY3J1YmJlcihzYXZlQ29kZSk7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQoXCJcIik7XG4gICAgICAgIGlmICghdGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKHRoaXMuY29kZURpdikuc3dpdGNoQ2xhc3MoXCJjb2wtbWQtMTJcIiwgXCJjb2wtbWQtNlwiLCB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgICAgICBxdWV1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICBwcm9nID0gYFxuICAgICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2JyeXRob25AMy45LjUvYnJ5dGhvbi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vYnJ5dGhvbkAzLjkuNS9icnl0aG9uX3N0ZGxpYi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaGlnaGxpZ2h0LmpzLzExLjAuMS9zdHlsZXMvZGVmYXVsdC5taW4uY3NzXCI+XG4gICAgICAgICAgICA8c2NyaXB0IHNyYz1cIi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2hpZ2hsaWdodC5qcy8xMS4wLjEvaGlnaGxpZ2h0Lm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgICAgPHN0eWxlPlxuICAgICAgICAgICAgICAgIGh0bWwsIGJvZHl7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogbWF4LWNvbnRlbnQ7IHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAuY29udGFpbmVyLXByZXtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuNDI4NTcxNDM7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDsgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7IGJvdHRvbTogMHB4OyB3aWR0aDogOTQlOyBtYXgtd2lkdGg6IDk2JTsgbWF4LWhlaWdodDogMjAwcHg7IG92ZXJmbG93OiBhdXRvOyBjbGVhcjogYm90aDsgcmVzaXplOiBib3RoOyB0cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJlIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0aWNreTsgcGFkZGluZzogMTJweDsgdHJhbnNmb3JtOiBzY2FsZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGV7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3N0eWxlPlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5IG9ubG9hZD0nYnJ5dGhvbigpJz5cbiAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0ndGV4dC9weXRob24nPlxuaW1wb3J0IHN5c1xuZnJvbSBicm93c2VyIGltcG9ydCBkb2N1bWVudCwgaHRtbFxuaW1wb3J0IHRyYWNlYmFja1xucHJlRWxlbSA9IGh0bWwuUFJFKClcbmxvZ2dlciA9IGh0bWwuQ09ERSgpXG5jb250YWluZXIgPSBodG1sLkRJVigpXG5jb250YWluZXIuY2xhc3NMaXN0LmFkZChcImNvbnRhaW5lci1wcmVcIilcbnByZUVsZW0gPD0gbG9nZ2VyXG5jb250YWluZXIgPD0gcHJlRWxlbVxuY2xhc3MgTmV3T3V0OlxuICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKTpcbiAgICAgICAgbG9nZ2VyLmlubmVySFRNTCArPSBzdHIoZGF0YSlcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIlxuc3lzLnN0ZGVyciA9IHN5cy5zdGRvdXQgPSBOZXdPdXQoKVxuZGVmIG15X2V4ZWMoY29kZSk6XG4gICAgdHJ5OlxuICAgICAgICBleGVjKGNvZGUsIGxvY2FscygpKVxuICAgICAgICBvdXRfaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRcIilcbiAgICAgICAgb3V0X2hlYWRlci5pbm5lckhUTUwgPSBcIk91dHB1dFwiXG4gICAgICAgIG91dF9oZWFkZXIuc3R5bGUuZm9udCA9IFwiMjRweCAnQXJpYWwnXCJcbiAgICAgICAgbG9nZ2VyLmNsYXNzTGlzdC5hZGQoXCJwbGFpbnRleHRcIilcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSlcbiAgICAgICAgcHJlRWxlbS5wcmVwZW5kKG91dF9oZWFkZXIpXG4gICAgICAgIGRvY3VtZW50IDw9IGNvbnRhaW5lclxuICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlcnI6XG4gICAgICAgIGVycm9yX2NsYXNzID0gZXJyLl9fY2xhc3NfXy5fX25hbWVfX1xuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxuICAgICAgICBsaW5lX251bWJlciA9IGZcImF0IGxpbmUge2Vyci5saW5lbm99XCJcbiAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlcnI6XG4gICAgICAgIGVycm9yX2NsYXNzID0gZXJyLl9fY2xhc3NfXy5fX25hbWVfX1xuICAgICAgICBkZXRhaWwgPSBlcnIuYXJnc1swXVxuICAgICAgICBjbCwgZXhjLCB0YiA9IHN5cy5leGNfaW5mbygpXG4gICAgICAgICMgV2hlbiBlcnJvcnMgZG9uJ3Qgc3BlY2lmeSBhIGxpbmVcbiAgICAgICAgdHJ5OlxuICAgICAgICAgICAgbGluZV9udW1iZXIgPSBmXCJhdCBsaW5lIHt0cmFjZWJhY2suZXh0cmFjdF90Yih0YilbLTFdWzFdfVwiXG4gICAgICAgIGV4Y2VwdDpcbiAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gXCJcIlxuICAgIGVsc2U6XG4gICAgICAgIHJldHVyblxuICAgIFxuICAgICMgVGhpcyBpcyBvbmx5IGRvbmUgaWYgYW4gRXhjZXB0aW9uIHdhcyBjYXRjaGVkXG4gICAgcmVzdWx0ID0gZlwiJ3tlcnJvcl9jbGFzc30nOiB7ZGV0YWlsfSB7bGluZV9udW1iZXJ9XCJcbiAgICBwcmludChyZXN1bHQpXG4gICAgIyBTdHlsaW5nIHRoZSBwcmUgZWxlbWVudCBmb3IgZXJyb3JcbiAgICBlcnJvcl9oZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDNcIilcbiAgICBlcnJvcl9oZWFkZXIuaW5uZXJIVE1MID0gXCJFcnJvclwiXG4gICAgZXJyb3JfaGVhZGVyLnN0eWxlLmZvbnQgPSBcIjI0cHggJ0FyaWFsJ1wiXG4gICAgcHJlRWxlbS5wcmVwZW5kKGVycm9yX2hlYWRlcilcbiAgICBjb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjZjJkZWRlXCJcbiAgICBjb250YWluZXIuc3R5bGUuYm9yZGVyID0gXCIxcHggc29saWQgI2ViY2NkMVwiXG4gICAgbG9nZ2VyLmNsYXNzTGlzdC5hZGQoXCJwbGFpbnRleHRcIilcbiAgICBkb2N1bWVudCA8PSBjb250YWluZXJcbm15X3Byb2cgPSAke0pTT04uc3RyaW5naWZ5KHByb2cpfVxubXlfZXhlYyhteV9wcm9nKVxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJobGpzLmhpZ2hsaWdodEFsbCgpO1wiKVxuZG9jdW1lbnQgPD0gaHRtbC5TQ1JJUFQoXCJsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRhaW5lci1wcmUnKTsgbGV0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7IGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFN0cmluZyhoZWlnaHQpKydweCc7XCIpXG4gICAgICAgICAgICA8L3NjcmlwdD5cbiAgICAgICAgPC9ib2R5PlxuICAgICAgICA8L2h0bWw+XG4gICAgICAgIGA7XG4gICAgICAgIHRoaXMub3V0cHV0LnNyY2RvYyA9IHByb2c7XG4gICAgfVxuXG4gICAgY3JlYXRlT3V0cHV0KCkge1xuICAgICAgICB0aGlzLmFsaWduVmVydGljYWwgPSB0cnVlO1xuICAgICAgICB2YXIgb3V0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChvdXREaXYpLmFkZENsYXNzKFwiYWNfb3V0cHV0XCIpO1xuICAgICAgICBpZiAodGhpcy5hbGlnblZlcnRpY2FsKSB7XG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtMTJcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJjb2wtbWQtNVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm91dERpdiA9IG91dERpdjtcbiAgICAgICAgdGhpcy5vdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJiYWNrZ3JvdW5kLWNvbG9yXCIsIFwid2hpdGVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImhlaWdodFwiLCBcIjQwMHB4XCIpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ3aWR0aFwiLCBcIjEwMCVcIik7XG4gICAgICAgIG91dERpdi5hcHBlbmRDaGlsZCh0aGlzLm91dHB1dCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQob3V0RGl2KTtcbiAgICAgICAgdmFyIGNsZWFyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgJChjbGVhckRpdikuY3NzKFwiY2xlYXJcIiwgXCJib3RoXCIpOyAvLyBuZWVkZWQgdG8gbWFrZSBwYXJlbnQgZGl2IHJlc2l6ZSBwcm9wZXJseVxuICAgICAgICB0aGlzLm91dGVyRGl2LmFwcGVuZENoaWxkKGNsZWFyRGl2KTtcbiAgICB9XG4gICAgZW5hYmxlU2F2ZUxvYWQoKSB7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcmVuZGVyXCIpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIG9wdHMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29kZSA9ICQoXCI8dGV4dGFyZWEgLz5cIikuaHRtbCh0aGlzLm9yaWdFbGVtLmlubmVySFRNTCkudGV4dCgpO1xuICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS50ZXh0KFwiUmVuZGVyXCIpO1xuICAgICAgICB0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmNvZGUpO1xuICAgIH1cblxuICAgIGFzeW5jIHJ1blByb2coKSB7XG4gICAgICAgIHZhciBwcm9nID0gYXdhaXQgdGhpcy5idWlsZFByb2codHJ1ZSk7XG4gICAgICAgIGxldCBzYXZlQ29kZSA9IFwiVHJ1ZVwiO1xuICAgICAgICB0aGlzLnNhdmVDb2RlID0gYXdhaXQgdGhpcy5tYW5hZ2Vfc2NydWJiZXIoc2F2ZUNvZGUpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICBpZiAoIXRoaXMuYWxpZ25WZXJ0aWNhbCkge1xuICAgICAgICAgICAgJCh0aGlzLmNvZGVEaXYpLnN3aXRjaENsYXNzKFwiY29sLW1kLTEyXCIsIFwiY29sLW1kLTZcIiwge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dERpdikuc2hvdyh7IGR1cmF0aW9uOiA3MDAsIHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgcHJvZyA9XG4gICAgICAgICAgICBcIjxzY3JpcHQgdHlwZT10ZXh0L2phdmFzY3JpcHQ+d2luZG93Lm9uZXJyb3IgPSBmdW5jdGlvbihtc2csdXJsLGxpbmUpIHthbGVydChtc2crJyBvbiBsaW5lOiAnK2xpbmUpO307PC9zY3JpcHQ+XCIgK1xuICAgICAgICAgICAgcHJvZztcbiAgICAgICAgdGhpcy5vdXRwdXQuc3JjZG9jID0gcHJvZztcbiAgICB9XG5cbiAgICBjcmVhdGVPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuYWxpZ25WZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgIHZhciBvdXREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKG91dERpdikuYWRkQ2xhc3MoXCJhY19vdXRwdXRcIik7XG4gICAgICAgIGlmICh0aGlzLmFsaWduVmVydGljYWwpIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC0xMlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQob3V0RGl2KS5hZGRDbGFzcyhcImNvbC1tZC01XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0RGl2ID0gb3V0RGl2O1xuICAgICAgICB0aGlzLm91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcImJhY2tncm91bmQtY29sb3JcIiwgXCJ3aGl0ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwicG9zaXRpb25cIiwgXCJyZWxhdGl2ZVwiKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwiaGVpZ2h0XCIsIFwiNDAwcHhcIik7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgb3V0RGl2LmFwcGVuZENoaWxkKHRoaXMub3V0cHV0KTtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChvdXREaXYpO1xuICAgICAgICB2YXIgY2xlYXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAkKGNsZWFyRGl2KS5jc3MoXCJjbGVhclwiLCBcImJvdGhcIik7IC8vIG5lZWRlZCB0byBtYWtlIHBhcmVudCBkaXYgcmVzaXplIHByb3Blcmx5XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoY2xlYXJEaXYpO1xuICAgIH1cbiAgICBlbmFibGVTYXZlTG9hZCgpIHtcbiAgICAgICAgJCh0aGlzLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9yZW5kZXJcIikpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEFjdGl2ZUNvZGUgfSBmcm9tIFwiLi9hY3RpdmVjb2RlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTQWN0aXZlQ29kZSBleHRlbmRzIEFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgfVxuICAgIG91dHB1dGZ1bihhKSB7XG4gICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB2YXIgc3RyID0gXCJbXCI7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PSBcIm9iamVjdFwiICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhW2ldID09IFwib2JqZWN0XCIgJiYgYVtpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IChpID09IDAgPyBcIlwiIDogXCIgXCIpICsgXCJbXCI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYVtpXS5sZW5ndGg7IGorKylcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbaV1bal0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqID09IGFbaV0ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiXVwiICsgKGkgPT0gYS5sZW5ndGggLSAxID8gXCJdXCIgOiBcIixcIikgKyBcIlxcblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCIsIFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Ugc3RyICs9IGFbaV0gKyAoaSA9PSBhLmxlbmd0aCAtIDEgPyBcIl1cIiA6IFwiLCBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHN0ciA9IGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb2cgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIF90aGlzLm91dHB1dC5pbm5lckhUTUwgKz0gX3RoaXMub3V0cHV0ZnVuKHN0cik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB3cml0ZWxuID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgaWYgKCFzdHIpIHN0ciA9IFwiXCI7XG4gICAgICAgICAgICBfdGhpcy5vdXRwdXQuaW5uZXJIVE1MICs9IF90aGlzLm91dHB1dGZ1bihzdHIpICsgXCI8YnIgLz5cIjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcbiAgICAgICAgJCh0aGlzLmVDb250YWluZXIpLnJlbW92ZSgpO1xuICAgICAgICAkKHRoaXMub3V0cHV0KS50ZXh0KFwiXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZhbChwcm9nKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IFwic3VjY2Vzc1wiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICAgIHRoaXMuZXJyaW5mbyA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFcnJvck1lc3NhZ2UoZXJyKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZXJyb3IgbWVzc2FnZVxuICAgICAgICB0aGlzLmVyckxhc3RSdW4gPSB0cnVlO1xuICAgICAgICB2YXIgZXJySGVhZCA9ICQoXCI8aDM+XCIpLmh0bWwoXCJFcnJvclwiKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5pZCA9IHRoaXMuZGl2aWQgKyBcIl9lcnJpbmZvXCI7XG4gICAgICAgIHRoaXMuZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlcnJIZWFkWzBdKTtcbiAgICAgICAgdmFyIGVyclRleHQgPSB0aGlzLmVDb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpXG4gICAgICAgICk7XG4gICAgICAgIHZhciBlcnJTdHJpbmcgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgZXJyVGV4dC5pbm5lckhUTUwgPSBlcnJTdHJpbmc7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiUnVudGltZSBFcnJvcjogXCIgKyBlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSBcImhhbmRzb250YWJsZVwiO1xuaW1wb3J0ICdoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MnO1xuaW1wb3J0IGluaXRTcWxKcyBmcm9tIFwic3FsLmpzL2Rpc3Qvc3FsLXdhc20uanNcIjtcblxudmFyIGFsbERidXJscyA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUUxBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgLy8gIGZucHJlZml4IHNldHMgdGhlIHBhdGggdG8gbG9hZCB0aGUgc3FsLXdhc20ud2FzbSBmaWxlXG4gICAgICAgIHZhciBib29rcHJlZml4O1xuICAgICAgICB2YXIgZm5wcmVmaXg7XG4gICAgICAgIGlmIChlQm9va0NvbmZpZy51c2VSdW5lc3RvbmVTZXJ2aWNlcykge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IGAke2VCb29rQ29uZmlnLmFwcH0vYm9va3MvcHVibGlzaGVkLyR7ZUJvb2tDb25maWcuYmFzZWNvdXJzZX1gO1xuICAgICAgICAgICAgZm5wcmVmaXggPSBib29rcHJlZml4ICsgXCIvX3N0YXRpY1wiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9va3ByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICBmbnByZWZpeCA9IFwiL19zdGF0aWNcIjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGxvY2F0ZUZpbGU6IChmaWxlbmFtZSkgPT4gYCR7Zm5wcmVmaXh9LyR7ZmlsZW5hbWV9YCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zaG93TGFzdCA9ICQodGhpcy5vcmlnRWxlbSkuZGF0YShcInNob3dsYXN0c3FsXCIpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIGluaXRTcWxKcyh0aGlzLmNvbmZpZykudGhlbihmdW5jdGlvbiAoU1FMKSB7XG4gICAgICAgICAgICAvLyBzZXQgdXAgY2FsbCB0byBsb2FkIGRhdGFiYXNlIGFzeW5jaHJvbm91c2x5IGlmIGdpdmVuXG4gICAgICAgICAgICBpZiAoc2VsZi5kYnVybCkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRidXJsLnN0YXJ0c1dpdGgoXCIvX3N0YXRpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRidXJsID0gYCR7Ym9va3ByZWZpeH0ke3NlbGYuZGJ1cmx9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgbGV0IGJ1dHRvblRleHQgPSAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikudGV4dCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9sb2FkX2RiXCIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIShzZWxmLmRidXJsIGluIGFsbERidXJscykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImxvYWRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHhXYWl0Rm9yOiBqUXVlcnkuRGVmZXJyZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnN0YXR1cyA9PSBcImxvYWRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLnhXYWl0Rm9yLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxEYnVybHNbc2VsZi5kYnVybF0uZGJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc2VsZi5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYiA9IG5ldyBTUUwuRGF0YWJhc2UoYWxsRGJ1cmxzW3NlbGYuZGJ1cmxdLmRiKTtcbiAgICAgICAgICAgICAgICAgICAgJChzZWxmLnJ1bkJ1dHRvbikucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2xlcm9jaGEvY2hpbm9vay1kYXRhYmFzZS9yYXcvbWFzdGVyL0NoaW5vb2tEYXRhYmFzZS9EYXRhU291cmNlcy9DaGlub29rX1NxbGl0ZS5zcWxpdGVcbiAgICAgICAgICAgICAgICB4aHIub3BlbihcIkdFVFwiLCBzZWxmLmRidXJsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiO1xuICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKHVJbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS50ZXh0KGJ1dHRvblRleHQpO1xuICAgICAgICAgICAgICAgICAgICAkKHNlbGYucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5kYiA9IHVJbnQ4QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS5zdGF0dXMgPSBcInJlYWR5XCI7XG4gICAgICAgICAgICAgICAgICAgIGFsbERidXJsc1tzZWxmLmRidXJsXS54V2FpdEZvci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIGlzIG5vdyBbe2NvbHVtbnM6Wydjb2wxJywnY29sMicsLi4uXSwgdmFsdWVzOltbZmlyc3Qgcm93XSwgW3NlY29uZCByb3ddLCAuLi5dfV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGYuZGIgPSBuZXcgU1FMLkRhdGFiYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBydW5Qcm9nKG5vVUksIGxvZ1Jlc3VsdHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2dSZXN1bHRzID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ1Jlc3VsdHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dSZXN1bHRzID0gbG9nUmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5vVUkgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICBub1VJID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXIgYW55IG9sZCByZXN1bHRzXG4gICAgICAgIHRoaXMuc2F2ZUNvZGUgPSBcIlRydWVcIjtcbiAgICAgICAgbGV0IGRpdmlkID0gdGhpcy5kaXZpZCArIFwiX3NxbF9vdXRcIjtcbiAgICAgICAgbGV0IHJlc3BEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZpZCk7XG4gICAgICAgIGlmIChyZXNwRGl2KSB7XG4gICAgICAgICAgICByZXNwRGl2LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVzcERpdik7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcIlwiKTtcbiAgICAgICAgLy8gUnVuIHRoaXMgcXVlcnlcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpOyAvLyBmYWxzZSAtLT4gRG8gbm90IGluY2x1ZGUgc3VmZml4XG4gICAgICAgIGlmICghdGhpcy5kYikge1xuICAgICAgICAgICAgJCh0aGlzLm91dHB1dCkudGV4dChcbiAgICAgICAgICAgICAgICBgRXJyb3I6IERhdGFiYXNlIG5vdCBpbml0aWFsaXplZCEgREJVUkw6ICR7dGhpcy5kYnVybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ID0gdGhpcy5kYi5pdGVyYXRlU3RhdGVtZW50cyhxdWVyeSk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uTmFtZXMoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRhdGEhIHByb2JhYmx5IGEgU0VMRUNUXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGF0ZW1lbnQuc3RlcCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goc3RhdGVtZW50LmdldCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd2NvdW50OiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5zcWwgPSBzdGF0ZW1lbnQuZ2V0Tm9ybWFsaXplZFNRTCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gbnNxbC5zdWJzdHIoMCwgNikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnN0ZXAoKTsgLy8gZXhlY3V0ZSB0aGUgcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVjdCBJTlNFUlQvVVBEQVRFL0RFTEVURSB0byBnaXZlIGZyaWVuZGx5IGZlZWRiYWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHJvd3MgbW9kaWZpZWQgLSB1bmZvcnR1bmF0ZWx5LCB0aGlzIHdvbid0IGNhdGNoIHN1Y2ggcXVlcmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IHVzZSBDVEVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gcmVsaWFibGUgd2F5IG9mIGtub3dpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhIFNRTGl0ZSBxdWVyeSBhY3R1YWxseSBtb2RpZmllZCBkYXRhLlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPT09IFwiaW5zZXJ0XCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9PT0gXCJ1cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09PSBcImRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Y291bnQ6IHRoaXMuZGIuZ2V0Um93c01vZGlmaWVkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHsgc3RhdHVzOiBcInN1Y2Nlc3NcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJmYWlsdXJlXCIsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIHNxbDogaXQuZ2V0UmVtYWluaW5nU1FMKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk5vIHF1ZXJpZXMgc3VibWl0dGVkLlwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHRoaXMuc2F2ZUNvZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVpdCkge1xuICAgICAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLm9uKFxuICAgICAgICAgICAgICAgICAgICBcInNsaWRlY2hhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVpdC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQodGhpcy5oaXN0b3J5U2NydWJiZXIpLnNsaWRlcihcImVuYWJsZVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byB1cGRhdGUgc2NydWJiZXIgJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHJlc3BEaXYuaWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5vdXREaXYuYXBwZW5kQ2hpbGQocmVzcERpdik7XG4gICAgICAgICQodGhpcy5vdXREaXYpLnNob3coKTtcbiAgICAgICAgLy8gU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gc2hvdyBhIGJ1bmNoIG9mIGludGVybWVkaWF0ZSByZXN1bHRzXG4gICAgICAgIC8vIGxpa2Ugd2hlbiB3ZSBhcmUgaW5jbHVkaW5nIGEgYnVuY2ggb2YgcHJldmlvdXMgc3RhdGVtZW50cyBmcm9tXG4gICAgICAgIC8vIG90aGVyIGFjdGl2ZWNvZGVzIEluIHRoYXQgY2FzZSB0aGUgc2hvd2xhc3RzcWwgZmxhZyBjYW4gYmUgc2V0XG4gICAgICAgIC8vIHNvIHdlIG9ubHkgc2hvdyB0aGUgbGFzdCByZXN1bHRcbiAgICAgICAgbGV0IHJlc3VsdEFycmF5ID0gdGhpcy5yZXN1bHRzO1xuICAgICAgICBpZiAodGhpcy5zaG93TGFzdCkge1xuICAgICAgICAgICAgcmVzdWx0QXJyYXkgPSB0aGlzLnJlc3VsdHMuc2xpY2UoLTEpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHIgb2YgcmVzdWx0QXJyYXkpIHtcbiAgICAgICAgICAgIGxldCBzZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICAgIHNlY3Rpb24uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0XCIpO1xuICAgICAgICAgICAgcmVzcERpdi5hcHBlbmRDaGlsZChzZWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyLnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoci5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWJsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQodGFibGVEaXYpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gMzUwO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0QXJyYXkubGVuZ3RoID4gMSkgbWF4SGVpZ2h0ID0gMjAwOyAvLyBtYXggaGVpZ2h0IHNtYWxsZXIgaWYgbG90cyBvZiByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYmxlKHIsIHRhYmxlRGl2LCBtYXhIZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZUJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBybXNnID0gci5yb3djb3VudCAhPT0gMSA/IFwiIHJvd3MgXCIgOiBcIiByb3cgXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBcIlwiICsgci5yb3djb3VudCArIHJtc2cgKyBcInJldHVybmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLnJvd2NvdW50ID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtc2cgKyBcIiAob25seSBmaXJzdCAxMDAgcm93cyBkaXNwbGF5ZWQpXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgXCIuXCI7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnJvd2NvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wID0gci5vcGVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgIG9wID0gb3AgKyAob3AuY2hhckF0KG9wLmxlbmd0aCAtIDEpID09PSBcImVcIiA/IFwiZC5cIiA6IFwiZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm1zZyA9IHIucm93Y291bnQgIT09IDEgPyBcIiByb3dzIFwiIDogXCIgcm93IFwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJcIiArIHIucm93Y291bnQgKyBybXNnICsgb3A7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3guc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJhY19zcWxfcmVzdWx0X3N1Y2Nlc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQobWVzc2FnZUJveCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnRleHRDb250ZW50ID0gXCJPcGVyYXRpb24gc3VjY2VlZGVkLlwiO1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm94LnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIFwiYWNfc3FsX3Jlc3VsdF9zdWNjZXNzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicHJlXCIpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCb3gudGV4dENvbnRlbnQgPSByLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJveC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBcImFjX3NxbF9yZXN1bHRfZmFpbHVyZVwiKTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKG1lc3NhZ2VCb3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGhhbmRsZSBhdXRvZ3JhZGluZ1xuICAgICAgICBpZiAodGhpcy5zdWZmaXgpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdCA9IHRoaXMuYXV0b2dyYWRlKFxuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHRoaXMub3V0cHV0KS5jc3MoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcImRvbmVcIik7XG4gICAgfVxuXG4gICAgbG9nQ3VycmVudEFuc3dlcigpIHtcbiAgICAgICAgdGhpcy5sb2dSdW5FdmVudCh7XG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICBjb2RlOiB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgICAgIGVycmluZm86IHRoaXMucmVzdWx0c1t0aGlzLnJlc3VsdHMubGVuZ3RoIC0gMV0uc3RhdHVzLFxuICAgICAgICAgICAgdG9fc2F2ZTogdGhpcy5zYXZlQ29kZSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5wcmV0ZXh0LFxuICAgICAgICAgICAgc3VmZml4OiB0aGlzLnN1ZmZpeCxcbiAgICAgICAgICAgIHBhcnRuZXI6IHRoaXMucGFydG5lcixcbiAgICAgICAgfSk7IC8vIExvZyB0aGUgcnVuIGV2ZW50XG5cbiAgICAgICAgaWYgKHRoaXMudW5pdF9yZXN1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwidW5pdHRlc3RcIixcbiAgICAgICAgICAgICAgICBkaXZfaWQ6IHRoaXMuZGl2aWQsXG4gICAgICAgICAgICAgICAgY291cnNlOiBlQm9va0NvbmZpZy5jb3Vyc2UsXG4gICAgICAgICAgICAgICAgYWN0OiB0aGlzLnVuaXRfcmVzdWx0cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRmVlZGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLnRleHQodGhpcy50ZXN0UmVzdWx0KTtcbiAgICAgICAgICAgICQodGhpcy5vdXRwdXQpLmNzcyhcInZpc2liaWxpdHlcIiwgXCJ2aXNpYmxlXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXV0b2dyYWRlKHJlc3VsdF90YWJsZSkge1xuICAgICAgICB2YXIgdGVzdHMgPSB0aGlzLnN1ZmZpeC5zcGxpdCgvXFxuLyk7XG4gICAgICAgIHRoaXMucGFzc2VkID0gMDtcbiAgICAgICAgdGhpcy5mYWlsZWQgPSAwO1xuICAgICAgICAvLyBUZXN0cyBzaG91bGQgYmUgb2YgdGhlIGZvcm1cbiAgICAgICAgLy8gYXNzZXJ0IHJvdyxjb2wgb3BlciB2YWx1ZSBmb3IgZXhhbXBsZVxuICAgICAgICAvLyBhc3NlcnQgNCw0ID09IDNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIHRlc3RzID0gdGVzdHMuZmlsdGVyKGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gcy5pbmRleE9mKFwiYXNzZXJ0XCIpID4gLTE7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCB0ZXN0IG9mIHRlc3RzKSB7XG4gICAgICAgICAgICBsZXQgd2xpc3QgPSB0ZXN0LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICB3bGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgbGV0IGxvYyA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgb3BlciA9IHdsaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgZXhwZWN0ZWQgPSB3bGlzdC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBbcm93LCBjb2xdID0gbG9jLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLnRlc3RPbmVBc3NlcnQoXG4gICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgIGNvbCxcbiAgICAgICAgICAgICAgICBvcGVyLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkLFxuICAgICAgICAgICAgICAgIHJlc3VsdF90YWJsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwY3QgPSAoMTAwICogdGhpcy5wYXNzZWQpIC8gKHRoaXMucGFzc2VkICsgdGhpcy5mYWlsZWQpO1xuICAgICAgICBwY3QgPSBwY3QudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgICAgICAgcmVzdWx0ICs9IGBZb3UgcGFzc2VkICR7dGhpcy5wYXNzZWR9IG91dCBvZiAke1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgKyB0aGlzLmZhaWxlZFxuICAgICAgICB9IHRlc3RzIGZvciAke3BjdH0lYDtcbiAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3BjdH06cGFzc2VkOiR7dGhpcy5wYXNzZWR9OmZhaWxlZDoke3RoaXMuZmFpbGVkfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHRlc3RPbmVBc3NlcnQocm93LCBjb2wsIG9wZXIsIGV4cGVjdGVkLCByZXN1bHRfdGFibGUpIHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIHJvdyBhbmQgY29sIGFyZSBpbiBib3VuZHNcbiAgICAgICAgbGV0IGFjdHVhbDtcbiAgICAgICAgbGV0IG91dHB1dCA9IFwiXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhY3R1YWwgPSByZXN1bHRfdGFibGUudmFsdWVzW3Jvd11bY29sXTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCBOb3QgZW5vdWdoIGRhdGEgdG8gY2hlY2sgcm93ICR7cm93fSBvciBjb2x1bW4gJHtjb2x9YDtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0b3JzID0ge1xuICAgICAgICAgICAgXCI9PVwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID09IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiIT1cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSAhPSBvcGVyYW5kMjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIj5cIjogZnVuY3Rpb24gKG9wZXJhbmQxLCBvcGVyYW5kMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYW5kMSA+IG9wZXJhbmQyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiPFwiOiBmdW5jdGlvbiAob3BlcmFuZDEsIG9wZXJhbmQyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQxID4gb3BlcmFuZDI7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmVzID0gb3BlcmF0b3JzW29wZXJdKGFjdHVhbCwgZXhwZWN0ZWQpO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBgUGFzczogJHthY3R1YWx9ICR7b3Blcn0gJHtleHBlY3RlZH0gaW4gcm93ICR7cm93fSBjb2x1bW4gJHtyZXN1bHRfdGFibGUuY29sdW1uc1tjb2xdfWA7XG4gICAgICAgICAgICB0aGlzLnBhc3NlZCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0ID0gYEZhaWxlZCAke2FjdHVhbH0gJHtvcGVyfSAke2V4cGVjdGVkfSBpbiByb3cgJHtyb3d9IGNvbHVtbiAke3Jlc3VsdF90YWJsZS5jb2x1bW5zW2NvbF19YDtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKHRhYmxlRGF0YSwgY29udGFpbmVyLCBtYXhIZWlnaHQpIHtcbiAgICBsZXQgZGF0YSA9IHRhYmxlRGF0YS52YWx1ZXM7XG4gICAgbGV0IHRyaW1Sb3dzID0gdW5kZWZpbmVkO1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBrbHVkZ2U6IG5vIGNvbHVtbiBoZWFkZXJzIHdpbGwgc2hvdyB1cCB1bmxlc3Mgd2UgZG8gdGhpc1xuICAgICAgICBkYXRhID0gW3RhYmxlRGF0YS5jb2x1bW5zLm1hcCgoZSkgPT4gbnVsbCldO1xuICAgICAgICB0cmltUm93cyA9IFswXTtcbiAgICB9XG5cbiAgICB2YXIgaG90ID0gbmV3IEhhbmRzb250YWJsZShjb250YWluZXIsIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgdHJpbVJvd3M6IHRyaW1Sb3dzLFxuICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgIGhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICBhdXRvUm93U2l6ZTogdHJ1ZSxcbiAgICAgICAgYXV0b0NvbHVtblNpemU6IHsgdXNlSGVhZGVyczogdHJ1ZSB9LFxuICAgICAgICByb3dIZWFkZXJzOiBmYWxzZSxcbiAgICAgICAgY29sSGVhZGVyczogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgIGVkaXRvcjogZmFsc2UsXG4gICAgICAgIG1heFJvd3M6IDEwMCxcbiAgICAgICAgZmlsdGVyczogZmFsc2UsXG4gICAgICAgIGRyb3Bkb3duTWVudTogZmFsc2UsXG4gICAgICAgIGxpY2Vuc2VLZXk6IFwibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb25cIixcbiAgICB9KTtcblxuICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgaGVpZ2h0IGFuZCByZXNpemVcbiAgICBsZXQgYWN0dWFsSGVpZ2h0ID0gNDA7IC8vIGhlYWRlciBoZWlnaHQgKyBzbWFsbCBtYXJnaW5cbiAgICBpZiAodGFibGVEYXRhLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID0gYWN0dWFsSGVpZ2h0ICsgaG90LmdldFJvd0hlaWdodChpKTtcbiAgICAgICAgICAgIGlmIChhY3R1YWxIZWlnaHQgPiBtYXhIZWlnaHQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG90LnVwZGF0ZVNldHRpbmdzKHsgaGVpZ2h0OiBhY3R1YWxIZWlnaHQgfSk7XG5cbiAgICByZXR1cm4gaG90O1xufVxuIiwiaW1wb3J0IFJ1bmVzdG9uZUJhc2UgZnJvbSBcIi4uLy4uL2NvbW1vbi9qcy9ydW5lc3RvbmViYXNlLmpzXCI7XG5cbi8vIGZ1bmN0aW9uIHRvIGRpc3BsYXkgdGhlIGF1ZGlvIHRvdXJzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdWRpb1RvdXIgZXh0ZW5kcyBSdW5lc3RvbmVCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihkaXZpZCwgY29kZSwgYm51bSwgYXVkaW9fdGV4dCkge1xuICAgICAgICAvLyBCdWcgRml4OiBJZiBhIGNsYXNzIGV4dGVuZHMgYW5vdGhlciBjbGFzcywgdGhpcyBpcyB1bmRlZmluZWQgVU5USUwgc3VwZXIgaXMgY2FsbGVkXG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYXVkaW9fdG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9fY29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBudWxsO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy50b3VyQnV0dG9ucyA9IFtdO1xuICAgICAgICB0aGlzLmVsZW0gPSBudWxsOyAvLyBjdXJyZW50IGF1ZGlvIGVsZW1lbnQgcGxheWluZ1xuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IG51bGw7IC8vIGN1cnJlbnQgaW5kZXhcbiAgICAgICAgdGhpcy5sZW4gPSBudWxsOyAvLyBjdXJyZW50IGxlbmd0aCBvZiBhdWRpbyBmaWxlcyBmb3IgdG91clxuICAgICAgICB0aGlzLmJ1dHRvbkNvdW50ID0gbnVsbDsgLy8gbnVtYmVyIG9mIGF1ZGlvIHRvdXIgYnV0dG9uc1xuICAgICAgICB0aGlzLmFuYW1lID0gbnVsbDsgLy8gdGhlIGF1ZGlvIGZpbGUgbmFtZVxuICAgICAgICB0aGlzLmFoYXNoID0gbnVsbDsgLy8gaGFzaCBvZiB0aGUgYXVkaW8gZmlsZSBuYW1lIHRvIHRoZSBsaW5lcyB0byBoaWdobGlnaHRcbiAgICAgICAgdGhpcy50aGVEaXZpZCA9IG51bGw7IC8vIGRpdiBpZFxuICAgICAgICB0aGlzLmFmaWxlID0gbnVsbDsgLy8gZmlsZSBuYW1lIGZvciBhdWRpb1xuICAgICAgICB0aGlzLnBsYXlpbmcgPSBmYWxzZTsgLy8gZmxhZyB0byBzYXkgaWYgcGxheWluZyBvciBub3RcbiAgICAgICAgdGhpcy50b3VyTmFtZSA9IFwiXCI7XG4gICAgICAgIC8vIFJlcGxhY2luZyBoYXMgYmVlbiBkb25lIGhlcmUgdG8gbWFrZSBzdXJlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgY29kZSBhcmUgZGlzcGxheWVkIGNvcnJlY3RseVxuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKmRvdWJsZXEqXCIsICdcIicpO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlQWxsKFwiKnNpbmdsZXEqXCIsIFwiJ1wiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipvcGVuKlwiLCBcIihcIik7XG4gICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2VBbGwoXCIqY2xvc2UqXCIsIFwiKVwiKTtcbiAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZUFsbChcIipubGluZSpcIiwgXCI8YnIvPlwiKTtcbiAgICAgICAgdmFyIGNvZGVBcnJheSA9IGNvZGUuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIHZhciBhdWRpb19oYXNoID0gW107XG4gICAgICAgIHZhciBidmFsID0gW107XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3RleHQucmVwbGFjZUFsbChcIipkb3VibGVxKlwiLCAnXCInKTtcbiAgICAgICAgdmFyIGF1ZGlvX3R5cGUgPSBhdHlwZS5zcGxpdChcIiphdHlwZSpcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXVkaW9fdHlwZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGF1ZGlvX2hhc2hbaV0gPSBhdWRpb190eXBlW2ldO1xuICAgICAgICAgICAgdmFyIGF3b3JkID0gYXVkaW9fdHlwZVtpXS5zcGxpdChcIjtcIik7XG4gICAgICAgICAgICBidmFsLnB1c2goYXdvcmRbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmaXJzdCA9XG4gICAgICAgICAgICBcIjxwcmU+PGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgXCJfbDEnPlwiICtcbiAgICAgICAgICAgIFwiMS4gICBcIiArXG4gICAgICAgICAgICBjb2RlQXJyYXlbMF0gK1xuICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgdmFyIG51bV9saW5lcyA9IGNvZGVBcnJheS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnVtX2xpbmVzOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIDwgOSkge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiAgIFwiICtcbiAgICAgICAgICAgICAgICAgICAgY29kZUFycmF5W2ldICtcbiAgICAgICAgICAgICAgICAgICAgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA8IDk5KSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPVxuICAgICAgICAgICAgICAgICAgICBmaXJzdCArXG4gICAgICAgICAgICAgICAgICAgIFwiPGRpdiBpZD0nXCIgK1xuICAgICAgICAgICAgICAgICAgICBkaXZpZCArXG4gICAgICAgICAgICAgICAgICAgIFwiX2xcIiArXG4gICAgICAgICAgICAgICAgICAgIChpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICBcIic+XCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCIuICBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgK1xuICAgICAgICAgICAgICAgICAgICBcIjxkaXYgaWQ9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgZGl2aWQgK1xuICAgICAgICAgICAgICAgICAgICBcIl9sXCIgK1xuICAgICAgICAgICAgICAgICAgICAoaSArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgXCInPlwiICtcbiAgICAgICAgICAgICAgICAgICAgKGkgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwiLiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGNvZGVBcnJheVtpXSArXG4gICAgICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmlyc3QgPSBmaXJzdCArIFwiPC9wcmU+XCI7XG4gICAgICAgIC8vbGF5aW5nIG91dCB0aGUgSFRNTCBjb250ZW50XG4gICAgICAgIHZhciBiY291bnQgPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF1ZGlvX3R5cGUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbmV3QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIG5ld0J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tc3VjY2Vzc1wiO1xuICAgICAgICAgICAgbmV3QnV0dG9uLmlubmVySFRNTCA9IGJ2YWxbaV0ucmVwbGFjZSgvXFxcIi9nLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMudG91ckJ1dHRvbnMucHVzaChuZXdCdXR0b24pO1xuICAgICAgICAgICAgYmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdWRpb190b3VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgdGhpcy5hdWRpb190b3VyLmFsaWduID0gXCJjZW50ZXJcIjtcbiAgICAgICAgdGhpcy5hdWRpb19jb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMud2luZG93Y29kZS5hbGlnbiA9IFwibGVmdFwiO1xuICAgICAgICAkKHRoaXMud2luZG93Y29kZSkuaHRtbChmaXJzdCk7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnByZXZfYXVkaW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5jbGFzc05hbWUgPVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLWZhc3QtYmFja3dhcmRcIjtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tc3RlcC1iYWNrd2FyZFwiO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9IFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1wYXVzZVwiO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uY2xhc3NOYW1lID1cbiAgICAgICAgICAgIFwiYnRuLWRlZmF1bHQgZ2x5cGhpY29uIGdseXBoaWNvbi1zdGVwLWZvcndhcmRcIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tZmFzdC1mb3J3YXJkXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJoZWlnaHQ6IDIycHg7IHdpZHRoOiAyNXB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi1yaWdodDoycHg7XCJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwic3R5bGVcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0OiAyMnB4OyB3aWR0aDogMjVweDsgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tcmlnaHQ6MnB4O1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubGFzdF9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBcInN0eWxlXCIsXG4gICAgICAgICAgICBcImhlaWdodDogMjJweDsgd2lkdGg6IDI1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXJpZ2h0OjJweDtcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLm5hbWUgPSBcImZpcnN0X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5uYW1lID0gXCJwcmV2X2F1ZGlvXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8ubmFtZSA9IFwicGF1c2VfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLm5hbWUgPSBcIm5leHRfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLm5hbWUgPSBcImxhc3RfYXVkaW9cIjtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby50aXRsZSA9IFwiUGxheSBmaXJzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby50aXRsZSA9IFwiUGxheSBwcmV2aW91cyBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSBcIlBhdXNlIGN1cnJlbnQgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnRpdGxlID0gXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8udGl0bGUgPSBcIlBsYXkgbGFzdCBhdWRpbyBpbiB0b3VyXCI7XG4gICAgICAgIHRoaXMuZmlyc3RfYXVkaW8uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIlBsYXkgZmlyc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgXCJQbGF5IHByZXZpb3VzIGF1ZGlvIGluIHRvdXJcIlxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQYXVzZSBhdWRpb1wiKTtcbiAgICAgICAgdGhpcy5uZXh0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IG5leHQgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5sYXN0X2F1ZGlvLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJQbGF5IGxhc3QgYXVkaW8gaW4gdG91clwiKTtcbiAgICAgICAgdGhpcy5maXJzdF9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHJldl9hdWRpby5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGF1c2VfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm5leHRfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RfYXVkaW8uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuc3RhdHVzLmNsYXNzTmFtZSA9IFwiYWxlcnQgYWxlcnQtaW5mb1wiO1xuICAgICAgICB0aGlzLnN0YXR1cy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImRpc3BsYXk6IG5vbmU7XCIpO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5zdG9wX2J1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tZGVmYXVsdFwiO1xuICAgICAgICB0aGlzLnN0b3BfYnV0dG9uLmlubmVySFRNTCA9IFwiU3RvcCB0b3VyXCI7XG4gICAgICAgICQodGhpcy5hdWRpb190b3VyKS5hcHBlbmQoXG4gICAgICAgICAgICB0aGlzLmF1ZGlvX2NvZGUsXG4gICAgICAgICAgICB0aGlzLndpbmRvd2NvZGUsXG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnJcIiksXG4gICAgICAgICAgICB0aGlzLmZpcnN0X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wcmV2X2F1ZGlvLFxuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubmV4dF9hdWRpbyxcbiAgICAgICAgICAgIHRoaXMubGFzdF9hdWRpbyxcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKSxcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLFxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJyXCIpLFxuICAgICAgICAgICAgdGhpcy50b3VyQnV0dG9ucyxcbiAgICAgICAgICAgIHRoaXMuc3RvcF9idXR0b25cbiAgICAgICAgKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX2NvZGVfZGl2XCIpLmFwcGVuZCh0aGlzLmF1ZGlvX3RvdXIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuYWNfY29kZV9kaXZcIikuY3NzKFwid2lkdGhcIiwgXCIxMDAlXCIpO1xuICAgICAgICAkKFwiI1wiICsgZGl2aWQgKyBcIiAuQ29kZU1pcnJvci5jbS1zLWRlZmF1bHQudWktcmVzaXphYmxlXCIpLmhpZGUoKTtcbiAgICAgICAgJChcIiNcIiArIGRpdmlkICsgXCIgLmFjX29wdC5idG4uYnRuLWRlZmF1bHQ6bGFzdC1jaGlsZFwiKS5oaWRlKCk7XG4gICAgICAgICQodGhpcy5zdG9wX2J1dHRvbikuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgICAgICBhY3Q6IFwiY2xvc2VXaW5kb3dcIixcbiAgICAgICAgICAgICAgICAgICAgZGl2X2lkOiBkaXZpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkKHRoaXMuYXVkaW9fdG91cikucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgXCIjXCIgKyBkaXZpZCArIFwiIC5Db2RlTWlycm9yLmNtLXMtZGVmYXVsdC51aS1yZXNpemFibGVcIlxuICAgICAgICAgICAgICAgICkuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19vcHQuYnRuLmJ0bi1kZWZhdWx0Omxhc3QtY2hpbGRcIikuc2hvdygpO1xuICAgICAgICAgICAgICAgICQoXCIjXCIgKyBkaXZpZCArIFwiIC5hY19jb2RlX2RpdlwiKS5jc3MoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFswXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMV0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsxXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbMl0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFsyXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbM10pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFszXSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAkKHRoaXMudG91ckJ1dHRvbnNbNF0pLmNsaWNrKFxuICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91cihkaXZpZCwgYXVkaW9faGFzaFs0XSwgYmNvdW50KTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEF1ZGlvKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIHBhdXNlIG9yIHBsYXkgdGhlIGF1ZGlvXG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZUFuZFBsYXlBdWRpbyhkaXZpZCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjbGljayB0byBnbyB0byB0aGUgbmV4dCBhdWRpb1xuICAgICAgICAkKHRoaXMubmV4dF9hdWRpbykuY2xpY2soXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW8oKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICApO1xuICAgICAgICAvLyBoYW5kbGUgdGhlIGNsaWNrIHRvIGdvIHRvIHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jbGljayhcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RBdWRpbygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIC8vIG1ha2UgdGhlIGltYWdlIGJ1dHRvbnMgbG9vayBkaXNhYmxlZFxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICB9XG4gICAgdG91cihkaXZpZCwgYXVkaW9fdHlwZSwgYmNvdW50KSB7XG4gICAgICAgIC8vIHNldCBnbG9iYWxzXG4gICAgICAgIHRoaXMuYnV0dG9uQ291bnQgPSBiY291bnQ7XG4gICAgICAgIHRoaXMudGhlRGl2aWQgPSBkaXZpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDdweDsgbWFyZ2luLWJvdHRvbTogM3B4O1wiXG4gICAgICAgICk7XG4gICAgICAgIC8vIGVuYWJsZSBwcmV2LCBwYXVzZS9wbGF5IGFuZCBuZXh0IGJ1dHRvbnMgYW5kIG1ha2UgdmlzaWJsZVxuICAgICAgICAkKHRoaXMuZmlyc3RfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5uZXh0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucHJldl9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAxLjApO1xuICAgICAgICAkKHRoaXMucGF1c2VfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgJCh0aGlzLmxhc3RfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMS4wKTtcbiAgICAgICAgLy8gZGlzYWJsZSB0b3VyIGJ1dHRvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiY291bnQ7IGkrKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tpXSkuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgIHZhciBhdHlwZSA9IGF1ZGlvX3R5cGUuc3BsaXQoXCI7XCIpO1xuICAgICAgICB2YXIgbmFtZSA9IGF0eXBlWzBdLnJlcGxhY2VBbGwoJ1wiJywgXCIgXCIpO1xuICAgICAgICB0aGlzLnRvdXJOYW1lID0gbmFtZTtcbiAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zdGFydGluZ1wiLCBuYW1lKSk7XG4gICAgICAgIC8vbG9nIHRvdXIgdHlwZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7IGV2ZW50OiBcIkF1ZGlvXCIsIGFjdDogbmFtZSwgZGl2X2lkOiBkaXZpZCB9KTtcbiAgICAgICAgdmFyIG1heCA9IGF0eXBlLmxlbmd0aDtcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgICAgIHRoaXMuYWhhc2ggPSBbXTtcbiAgICAgICAgdGhpcy5hbmFtZSA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWF4IC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGVtcCA9IGF0eXBlW2ldLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIHZhciB0ZW1wX2xpbmUgPSB0ZW1wWzBdO1xuICAgICAgICAgICAgdmFyIHRlbXBfYW5hbWUgPSB0ZW1wWzFdO1xuICAgICAgICAgICAgdmFyIGFrZXkgPSB0ZW1wX2FuYW1lLnN1YnN0cmluZygxLCB0ZW1wX2FuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgbG51bXMgPSB0ZW1wX2xpbmUuc3Vic3RyaW5nKDEsIHRlbXBfbGluZS5sZW5ndGgpO1xuICAgICAgICAgICAgLy9hbGVydChcImFrZXk6XCIrYWtleStcImxudW06XCIrbG51bXMpO1xuICAgICAgICAgICAgLy8gc3RyKz1cIjxhdWRpbyBpZD1cIitha2V5K1wiIHByZWxvYWQ9J2F1dG8nPjxzb3VyY2Ugc3JjPSdodHRwOi8vaWNlLXdlYi5jYy5nYXRlY2guZWR1L2NlMjEvYXVkaW8vXCIrXG4gICAgICAgICAgICAvLyBha2V5K1wiLm1wMycgdHlwZT0nYXVkaW8vbXBlZyc+PHNvdXJjZSBzcmM9J2h0dHA6Ly9pY2Utd2ViLmNjLmdhdGVjaC5lZHUvY2UyMS9hdWRpby9cIitha2V5K1xuICAgICAgICAgICAgLy8gXCIub2dnJyB0eXBlPSdhdWRpby9vZ2cnPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBhdWRpbyB0YWc8L2F1ZGlvPlwiO1xuICAgICAgICAgICAgLy92YXIgZGlyID1cbiAgICAgICAgICAgIC8vICAgIFwiaHR0cDovL21lZGlhLmludGVyYWN0aXZlcHl0aG9uLm9yZy9cIiArXG4gICAgICAgICAgICAvLyAgICBlQm9va0NvbmZpZy5iYXNlY291cnNlLnRvTG93ZXJDYXNlKCkgK1xuICAgICAgICAgICAgLy8gICAgXCIvYXVkaW8vXCI7XG4gICAgICAgICAgICB2YXIgZGlyID0gXCIuLi9fc3RhdGljL2F1ZGlvL1wiXG4gICAgICAgICAgICBzdHIgKz0gXCI8YXVkaW8gaWQ9XCIgKyBha2V5ICsgXCIgcHJlbG9hZD0nYXV0bycgPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPHNvdXJjZSBzcmM9J1wiICsgZGlyICsgYWtleSArIFwiLndhdicgdHlwZT0nYXVkaW8vd2F2Jz5cIjtcbiAgICAgICAgICAgIHN0ciArPSBcIjxzb3VyY2Ugc3JjPSdcIiArIGRpciArIGFrZXkgKyBcIi5tcDMnIHR5cGU9J2F1ZGlvL21wZWcnPlwiO1xuICAgICAgICAgICAgc3RyICs9IFwiPGJyIC8+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIGF1ZGlvIHRhZzwvYXVkaW8+XCI7XG4gICAgICAgICAgICB0aGlzLmFoYXNoW2FrZXldID0gbG51bXM7XG4gICAgICAgICAgICB0aGlzLmFuYW1lLnB1c2goYWtleSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzLmF1ZGlvX2NvZGUpLmh0bWwoc3RyKTtcbiAgICAgICAgdGhpcy5sZW4gPSB0aGlzLmFuYW1lLmxlbmd0aDsgLy8gc2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZmlsZSBpbiB0aGUgdG91clxuICAgICAgICB0aGlzLmN1cnJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgfVxuICAgIGhhbmRsZVBsYXlpbmcoKSB7XG4gICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpO1xuICAgICAgICAvLyB1bmJpbmQgY3VycmVudCBlbmRlZFxuICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkudW5iaW5kKFwiZW5kZWRcIik7XG4gICAgICAgIC8vIHVuaGlnaGxpZ2h0IHRoZSBwcmV2IGxpbmVzXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgIH1cbiAgICBmaXJzdEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJmaXJzdFwiLFxuICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gbW92ZSB0byB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSAwO1xuICAgICAgICAvLyBzdGFydCBhdCB0aGUgZmlyc3QgYXVkaW9cbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgcHJldkF1ZGlvKCkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIGF1ZGlvXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAgICAgLy9sb2cgY2hhbmdlIHRvIGRiXG4gICAgICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgICAgICBhY3Q6IFwicHJldlwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbW92ZSB0byBwcmV2aW91cyB0byB0aGUgY3VycmVudCAoYnV0IHRoZSBjdXJyZW50IGluZGV4IGhhcyBtb3ZlZCB0byB0aGUgbmV4dClcbiAgICAgICAgICAgIHRoaXMuY3VyckluZGV4ID0gdGhpcy5jdXJySW5kZXggLSAxO1xuICAgICAgICAgICAgLy8gc3RhcnQgYXQgdGhlIHByZXYgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmV4dEF1ZGlvKCkge1xuICAgICAgICAvLyBpZiBhdWRpbyBpcyB0aGlzLnBsYXlpbmcgaGFuZGxlIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlUGxheWluZygpO1xuICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgdGhpcy5sb2dCb29rRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnQ6IFwiQXVkaW9cIixcbiAgICAgICAgICAgIGFjdDogXCJuZXh0XCIsXG4gICAgICAgICAgICBkaXZfaWQ6IHRoaXMudGhlRGl2aWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBpZiBub3QgYXQgdGhlIGVuZFxuICAgICAgICBpZiAodGhpcy5jdXJySW5kZXggPCB0aGlzLmxlbiAtIDEpIHtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGF0IHRoZSBuZXh0IGF1ZGlvXG4gICAgICAgICAgICB0aGlzLmN1cnJJbmRleCA9IHRoaXMuY3VyckluZGV4ICsgMTtcbiAgICAgICAgICAgIHRoaXMucGxheUN1cnJJbmRleEF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJySW5kZXggPT0gdGhpcy5sZW4gLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRvdXJFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsYXN0QXVkaW8oKSB7XG4gICAgICAgIC8vIGlmIGF1ZGlvIGlzIHRoaXMucGxheWluZyBoYW5kbGUgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVQbGF5aW5nKCk7XG4gICAgICAgIC8vbG9nIGNoYW5nZSB0byBkYlxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgYWN0OiBcImxhc3RcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG1vdmUgdG8gdGhlIGxhc3QgYXVkaW9cbiAgICAgICAgdGhpcy5jdXJySW5kZXggPSB0aGlzLmxlbiAtIDE7XG4gICAgICAgIC8vIHN0YXJ0IGF0IGxhc3RcbiAgICAgICAgdGhpcy5wbGF5Q3VyckluZGV4QXVkaW8oKTtcbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIGN1cnJlbnQgaW5kZXhcbiAgICBwbGF5Q3VyckluZGV4QXVkaW8oKSB7XG4gICAgICAgIC8vIHNldCB0aGlzLnBsYXlpbmcgdG8gZmFsc2VcbiAgICAgICAgdGhpcy5wbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHBsYXkgdGhlIGN1cnJlbnQgYXVkaW8gYW5kIGhpZ2hsaWdodCB0aGUgbGluZXNcbiAgICAgICAgdGhpcy5wbGF5YXVkaW8odGhpcy5jdXJySW5kZXgsIHRoaXMuYW5hbWUsIHRoaXMudGhlRGl2aWQsIHRoaXMuYWhhc2gpO1xuICAgIH1cbiAgICAvLyBoYW5kbGUgdGhlIGVuZCBvZiB0aGUgdG91clxuICAgIGhhbmRsZVRvdXJFbmQoKSB7XG4gICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoXCJUaGUgXCIgKyB0aGlzLnRvdXJOYW1lICsgXCIgaGFzIGVuZGVkLlwiKTtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5jbGFzc05hbWUgPSBcImJ0bi1kZWZhdWx0IGdseXBoaWNvbiBnbHlwaGljb24tcGF1c2VcIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby50aXRsZSA9IFwiUGF1c2UgYXVkaW9cIjtcbiAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiUGF1c2UgYXVkaW9cIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5wcmV2X2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLnBhdXNlX2F1ZGlvKS5hdHRyKFwiZGlzYWJsZWRcIiwgXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMubGFzdF9hdWRpbykuYXR0cihcImRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICQodGhpcy5maXJzdF9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLnByZXZfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5wYXVzZV9hdWRpbykuY3NzKFwib3BhY2l0eVwiLCAwLjI1KTtcbiAgICAgICAgJCh0aGlzLm5leHRfYXVkaW8pLmNzcyhcIm9wYWNpdHlcIiwgMC4yNSk7XG4gICAgICAgICQodGhpcy5sYXN0X2F1ZGlvKS5jc3MoXCJvcGFjaXR5XCIsIDAuMjUpO1xuICAgICAgICAvLyBlbmFibGUgdGhlIHRvdXIgYnV0dG9uc1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuYnV0dG9uQ291bnQ7IGorKylcbiAgICAgICAgICAgICQodGhpcy50b3VyQnV0dG9uc1tqXSkucmVtb3ZlQXR0cihcImRpc2FibGVkXCIpO1xuICAgIH1cbiAgICAvLyBvbmx5IGNhbGwgdGhpcyBvbmUgYWZ0ZXIgdGhlIGZpcnN0IHRpbWVcbiAgICBvdXRlckF1ZGlvKCkge1xuICAgICAgICAvLyB1bmJpbmQgZW5kZWRcbiAgICAgICAgJChcIiNcIiArIHRoaXMuYWZpbGUpLnVuYmluZChcImVuZGVkXCIpO1xuICAgICAgICAvLyBzZXQgdGhpcy5wbGF5aW5nIHRvIGZhbHNlXG4gICAgICAgIHRoaXMucGxheWluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1bmhpZ2hsaWdodCBwcmV2aW91cyBsaW5lcyBmcm9tIHRoZSBsYXN0IGF1ZGlvXG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRMaW5lcyhcbiAgICAgICAgICAgIHRoaXMudGhlRGl2aWQsXG4gICAgICAgICAgICB0aGlzLmFoYXNoW3RoaXMuYW5hbWVbdGhpcy5jdXJySW5kZXhdXVxuICAgICAgICApO1xuICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRoaXMuY3VyckluZGV4IHRvIHBvaW50IHRvIHRoZSBuZXh0IG9uZVxuICAgICAgICB0aGlzLmN1cnJJbmRleCsrO1xuICAgICAgICAvLyBpZiB0aGUgZW5kIG9mIHRoZSB0b3VyIHJlc2V0IHRoZSBidXR0b25zXG4gICAgICAgIGlmICh0aGlzLmN1cnJJbmRleCA9PSB0aGlzLmxlbikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUb3VyRW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBub3QgZG9uZSB5ZXQgc28gcGxheSB0aGUgbmV4dCBhdWRpb1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBsYXkgdGhlIGF1ZGlvIGF0IHRoZSBjdXJyZW50IGluZGV4XG4gICAgICAgICAgICB0aGlzLnBsYXlDdXJySW5kZXhBdWRpbygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBsYXkgdGhlIGF1ZGlvIG5vdyB0aGF0IGl0IGlzIHJlYWR5XG4gICAgcGxheVdoZW5SZWFkeShhZmlsZSwgZGl2aWQsIGFoYXNoKSB7XG4gICAgICAgIC8vIHVuYmluZCBjdXJyZW50XG4gICAgICAgICQoXCIjXCIgKyBhZmlsZSkudW5iaW5kKFwiY2FucGxheXRocm91Z2hcIik7XG4gICAgICAgIHRoaXMuZWxlbS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIHRoaXMucGxheWluZyA9IHRydWU7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJpbiBwbGF5V2hlblJlYWR5IFwiICsgZWxlbS5kdXJhdGlvbik7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGFoYXNoW2FmaWxlXSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID09PVxuICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKFwiI1wiICsgYWZpbGUpLmJpbmQoXG4gICAgICAgICAgICAgICAgXCJlbmRlZFwiLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlckF1ZGlvKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQoXCIjXCIgKyBhZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImVuZGVkXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGVyQXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGxheSB0aGUgYXVkaW8gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpIGFuZCBzZXQgdGhlIGR1cmF0aW9uIGFuZCBoaWdobGlnaHQgdGhlIGxpbmVzXG4gICAgcGxheWF1ZGlvKGksIGFuYW1lLCBkaXZpZCwgYWhhc2gpIHtcbiAgICAgICAgdGhpcy5hZmlsZSA9IGFuYW1lW2ldO1xuICAgICAgICB0aGlzLmVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFmaWxlKTtcbiAgICAgICAgLy8gaWYgdGhpcyBpc24ndCByZWFkeSB0byBwbGF5IHlldCAtIG5vIGR1cmF0aW9uIHlldCB0aGVuIHdhaXRcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImluIHBsYXlhdWRpbyBcIiArIGVsZW0uZHVyYXRpb24pO1xuICAgICAgICBpZiAoaXNOYU4odGhpcy5lbGVtLmR1cmF0aW9uKSB8fCB0aGlzLmVsZW0uZHVyYXRpb24gPT0gMCkge1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBzdGF0dXNcbiAgICAgICAgICAgICQodGhpcy5zdGF0dXMpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfbG9hZGluZ19hdWRpb1wiKSk7XG4gICAgICAgICAgICAkKFwiI1wiICsgdGhpcy5hZmlsZSkuYmluZChcbiAgICAgICAgICAgICAgICBcImNhbnBsYXl0aHJvdWdoXCIsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIHJlYWR5IHNvIHBsYXkgaXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBsYXlXaGVuUmVhZHkodGhpcy5hZmlsZSwgZGl2aWQsIGFoYXNoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYXVzZSBpZiB0aGlzLnBsYXlpbmcgYW5kIHBsYXkgaWYgcGF1c2VkXG4gICAgcGF1c2VBbmRQbGF5QXVkaW8oZGl2aWQpIHtcbiAgICAgICAgdmFyIGJ0biA9IHRoaXMucGF1c2VfYXVkaW87XG4gICAgICAgIC8vIGlmIHBhdXNlZCBhbmQgY2xpY2tlZCB0aGVuIGNvbnRpbnVlIGZyb20gY3VycmVudFxuICAgICAgICBpZiAodGhpcy5lbGVtLnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gY2FsY3VhbHRlIHRoZSB0aW1lIGxlZnQgdG8gcGxheSBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gKHRoaXMuZWxlbS5kdXJhdGlvbiAtIHRoaXMuZWxlbS5jdXJyZW50VGltZSkgKiAxMDAwO1xuICAgICAgICAgICAgdGhpcy5lbGVtLnBsYXkoKTsgLy8gc3RhcnQgdGhlIGF1ZGlvIGZyb20gY3VycmVudCBzcG90XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLmNsYXNzTmFtZSA9XG4gICAgICAgICAgICAgICAgXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBhdXNlXCI7XG4gICAgICAgICAgICB0aGlzLnBhdXNlX2F1ZGlvLnRpdGxlID0gJC5pMThuKFxuICAgICAgICAgICAgICAgIFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfY3VycmVudF9hdWRpb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wYXVzZV9hdWRpby5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgICAgJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfcGF1c2VfYXVkaW9cIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMuc3RhdHVzKS5odG1sKFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlpbmdcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwbGF5XCIsXG4gICAgICAgICAgICAgICAgZGl2X2lkOiB0aGlzLnRoZURpdmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYXVkaW8gd2FzIHRoaXMucGxheWluZyBwYXVzZSBpdFxuICAgICAgICBlbHNlIGlmICh0aGlzLnBsYXlpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbS5wYXVzZSgpOyAvLyBwYXVzZSB0aGUgYXVkaW9cbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uY2xhc3NOYW1lID0gXCJidG4tZGVmYXVsdCBnbHlwaGljb24gZ2x5cGhpY29uLXBsYXlcIjtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8udGl0bGUgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9wbGF5X3BhdXNlZF9hdWRpb1wiKTtcbiAgICAgICAgICAgIHRoaXMucGF1c2VfYXVkaW8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbFwiLFxuICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3BsYXlfcGF1c2VkX2F1ZGlvXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgJCh0aGlzLnN0YXR1cykuaHRtbChcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9hdWRpb19wYXVzZWRcIiwgdGhpcy50b3VyTmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL2xvZyBjaGFuZ2UgdG8gZGJcbiAgICAgICAgICAgIHRoaXMubG9nQm9va0V2ZW50KHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJBdWRpb1wiLFxuICAgICAgICAgICAgICAgIGFjdDogXCJwYXVzZVwiLFxuICAgICAgICAgICAgICAgIGRpdl9pZDogdGhpcy50aGVEaXZpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHByb2Nlc3MgdGhlIGxpbmVzXG4gICAgcHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcikge1xuICAgICAgICB2YXIgY29tbWEgPSBsbnVtLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgaWYgKGNvbW1hLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJhY2tncm91bmRGb3JMaW5lcyhkaXZpZCwgY29tbWFbaV0sIGNvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZEZvckxpbmVzKGRpdmlkLCBsbnVtLCBjb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdW5oaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIGJhY2sgdG8gdHJhbnNwYXJlbnRcbiAgICB1bmhpZ2hsaWdodExpbmVzKGRpdmlkLCBsbnVtKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpbmVzKGRpdmlkLCBsbnVtLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIH1cbiAgICAvLyBoaWdobGlnaHQgdGhlIGxpbmVzIC0gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIGEgeWVsbG93IGNvbG9yXG4gICAgaGlnaGxpZ2h0TGluZXMoZGl2aWQsIGxudW0pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZXMoZGl2aWQsIGxudW0sIFwiI2ZmZmY5OVwiKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoZSBiYWNrZ3JvdW5kIHRvIHRoZSBwYXNzZWQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kRm9yTGluZXMoZGl2aWQsIGxudW0sIGNvbG9yKSB7XG4gICAgICAgIHZhciBoeXBoZW4gPSBsbnVtLnNwbGl0KFwiLVwiKTtcbiAgICAgICAgdmFyIHN0cjtcbiAgICAgICAgLy8gaWYgYSByYW5nZSBvZiBsaW5lc1xuICAgICAgICBpZiAoaHlwaGVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlSW50KGh5cGhlblswXSk7XG4gICAgICAgICAgICB2YXIgZW5kID0gcGFyc2VJbnQoaHlwaGVuWzFdKSArIDE7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gc3RhcnQ7IGsgPCBlbmQ7IGsrKykge1xuICAgICAgICAgICAgICAgIC8vYWxlcnQoayk7XG4gICAgICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGs7XG4gICAgICAgICAgICAgICAgaWYgKCQoc3RyKS50ZXh0KCkgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vJChzdHIpLmVmZmVjdChcImhpZ2hsaWdodFwiLHt9LChkdXIqMTAwMCkrNDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2FsZXJ0KGxudW0pO1xuICAgICAgICAgICAgc3RyID0gXCIjXCIgKyBkaXZpZCArIFwiX2xcIiArIGxudW07XG4gICAgICAgICAgICAkKHN0cikuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLCBjb2xvcik7XG4gICAgICAgICAgICAvLyQoc3RyKS5lZmZlY3QoXCJoaWdobGlnaHRcIix7fSwoZHVyKjEwMDApKzQ1MDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwidmFyIHRlc3RTdHJpbmcgPSBgU3RhcnRpbmcgVGVzdHNcbkV4cGVjdGVkOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBBbnN3ZXIgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWV0aG9kIHByaW50QW5zd2VyKCkgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiA2IGxpbmUocykgb2YgdGV4dCAgICAgICAgQWN0dWFsOiAwIGxpbmUocykgb2YgdGV4dCAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgbWFpbiBtZXRob2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IGZhbHNlXG5IZWxsbyBXb3JsZFxuRXhwZWN0ZWQ6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBBY3R1YWw6IFN0cmluZyBTdHJpbmcgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBJbnN0YW5jZSBWYXJpYWJsZSBUeXBlKHMpICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRXhwZWN0ZWQ6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBBY3R1YWw6IFF1ZXN0aW9uICAgICAgICAgICAgICAgICBNZXNzYWdlOiBDaGVja2luZyBtZXRob2QgcHJpbnRRdWVzdGlvbigpICAgICAgICAgICAgICAgICAgIFBhc3NlZDogdHJ1ZVxuRGVidWdnaW5nIG91dHB1dFxuTW9yZSBkZWJ1ZyBvdXRwdXRcbkV4cGVjdGVkOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgQWN0dWFsOiAyIFByaXZhdGUgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgUHJpdmF0ZSBJbnN0YW5jZSBWYXJpYWJsZShzKSAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBwYXNzICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBwYXNzICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkV4cGVjdGVkOiBmYWlsICAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiBmYWlsICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogQ2hlY2tpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICBQYXNzZWQ6IHRydWVcbkVuZGluZyBUZXN0c1xuWW91IGdvdCA2IG91dCBvZiA3IGNvcnJlY3QuIDg1LjcxJWA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpVbml0VGVzdFBhcnNlciB7XG4gICAgY29uc3RydWN0b3Iob3V0cHV0LCBwYXJlbnRJZCkge1xuICAgICAgICBsZXQgcGF0dCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBcIkV4cGVjdGVkOlxcXFxzKyguKj8pQWN0dWFsOlxcXFxzKyguKj8pTWVzc2FnZTpcXFxccysoLio/KVBhc3NlZDpcXFxccysodHJ1ZXxmYWxzZSlcIixcbiAgICAgICAgICAgIFwiZ1wiXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudGV4dFJlc3VsdHMgPSBcIlwiO1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IG91dHB1dC5tYXRjaEFsbChwYXR0KTtcbiAgICAgICAgbGV0IHBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKFwidW5pdHRlc3QtcmVzdWx0c1wiKTtcbiAgICAgICAgbGV0IHRibCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiKTtcbiAgICAgICAgdGJsLmNsYXNzTGlzdC5hZGQoXCJhYy1mZWVkYmFja1wiKTtcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRibCk7XG4gICAgICAgIHBhcmVudC5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBgJHtwYXJlbnRJZH1fdW5pdF9yZXN1bHRzYCk7XG4gICAgICAgIGxldCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0clwiKTtcbiAgICAgICAgdHIuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8dGggY2xhc3M9XCJhYy1mZWVkYmFja1wiPlJlc3VsdDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5FeHBlY3RlZDwvdGg+PHRoIGNsYXNzPVwiYWMtZmVlZGJhY2tcIj5BY3R1YWw8L3RoPjx0aCBjbGFzcz1cImFjLWZlZWRiYWNrXCI+Tm90ZXM8L3RoPic7XG4gICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRkXCIpO1xuICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdID09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gXCJQYXNzXCI7XG4gICAgICAgICAgICAgICAgdGQuc3R5bGUgPVxuICAgICAgICAgICAgICAgICAgICBcImJhY2tncm91bmQtY29sb3I6IHJnYigxMzEsIDIxMSwgMTMwKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZC5pbm5lckhUTUwgPSBcIkZhaWxcIjtcbiAgICAgICAgICAgICAgICB0ZC5zdHlsZSA9XG4gICAgICAgICAgICAgICAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyMiwgMTQyLCAxNTApOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZCk7XG4gICAgICAgICAgICB0YmwuYXBwZW5kQ2hpbGQodHIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGQuaW5uZXJIVE1MID0gbWF0Y2hbaV07XG4gICAgICAgICAgICAgICAgdGQuY2xhc3NMaXN0LmFkZChcImFjLWZlZWRiYWNrXCIpO1xuICAgICAgICAgICAgICAgIHRyLmFwcGVuZENoaWxkKHRkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRibC5hcHBlbmRDaGlsZCh0cik7XG4gICAgICAgICAgICB0aGlzLnRhYmxlID0gcGFyZW50O1xuICAgICAgICAgICAgdGhpcy50ZXh0UmVzdWx0cyArPSBtYXRjaFswXSArIFwiXFxuXCI7XG4gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShtYXRjaFswXSwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hdGNoID0gb3V0cHV0Lm1hdGNoKFxuICAgICAgICAgICAgL1lvdSBnb3RcXHMrKFxcZCspIG91dCBvZiAoXFxkKykgY29ycmVjdC5cXHMrKFxcZCtcXC5cXGQrKSUvXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UobWF0Y2hbMF0sIFwiXCIpO1xuICAgICAgICAgICAgbGV0IHBjdFN0cmluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgcGN0U3RyaW5nLmlubmVySFRNTCA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgdGhpcy5wY3RTdHJpbmcgPSBwY3RTdHJpbmc7XG4gICAgICAgICAgICB0aGlzLnBjdCA9IG1hdGNoWzNdO1xuICAgICAgICAgICAgdGhpcy5wYXNzZWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkID0gbWF0Y2hbMl0gLSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIlN0YXJ0aW5nIFRlc3RzXCIsIFwiXCIpO1xuICAgICAgICBvdXRwdXQgPSBvdXRwdXQucmVwbGFjZShcIkVuZGluZyBUZXN0c1wiLCBcIlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIik7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKC8oPGJyPikrL2csIFwiPGJyPlwiKTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2VBbGwoXCImbHQ7aW1nXCIsIFwiPGltZ1wiKTtcbiAgICAgICAgdGhpcy5zdGRvdXQgPSBvdXRwdXQ7XG4gICAgfVxufVxuXG4vLyBsZXQgeCA9IG5ldyBSZXN1bHRzVG9UYWJsZSh0ZXN0U3RyaW5nKTtcbi8vIGNvbnNvbGUubG9nKHguc3Rkb3V0KTtcbi8vIGNvbnNvbGUubG9nKHgudGFibGUpO1xuIiwiaW1wb3J0IHsgQWN0aXZlQ29kZSB9IGZyb20gXCIuL2FjdGl2ZWNvZGUuanNcIjtcbmltcG9ydCBNRDUgZnJvbSBcIi4vbWQ1LmpzXCI7XG5pbXBvcnQgSlVuaXRUZXN0UGFyc2VyIGZyb20gXCIuL2V4dHJhY3RVbml0UmVzdWx0cy5qc1wiO1xuaW1wb3J0IFwiLi4vLi4vY29kZWxlbnMvanMvcHl0dXRvci1lbWJlZC5idW5kbGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZUNvZGUgZXh0ZW5kcyBBY3RpdmVDb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHZhciBvcmlnID0gJChvcHRzLm9yaWcpLmZpbmQoXCJ0ZXh0YXJlYVwiKVswXTtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuc3RkaW4gPSAkKG9yaWcpLmRhdGEoXCJzdGRpblwiKTtcbiAgICAgICAgdGhpcy5kYXRhZmlsZSA9ICQob3JpZykuZGF0YShcImRhdGFmaWxlXCIpO1xuICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSAkKG9yaWcpLmRhdGEoXCJzb3VyY2VmaWxlXCIpO1xuICAgICAgICB0aGlzLmNvbXBpbGVhcmdzID0gdW5lc2NhcGVIdG1sKCQob3JpZykuZGF0YShcImNvbXBpbGVhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5saW5rYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJsaW5rYXJnc1wiKSk7XG4gICAgICAgIHRoaXMucnVuYXJncyA9IHVuZXNjYXBlSHRtbCgkKG9yaWcpLmRhdGEoXCJydW5hcmdzXCIpKTtcbiAgICAgICAgdGhpcy5pbnRlcnByZXRlcmFyZ3MgPSB1bmVzY2FwZUh0bWwoJChvcmlnKS5kYXRhKFwiaW50ZXJwcmV0ZXJhcmdzXCIpKTtcbiAgICAgICAgdGhpcy5BUElfS0VZID0gXCI2NzAzM3BWN2VVVXZxbzA3T0pESVY4VVowNDlhTEVLMVwiO1xuICAgICAgICB0aGlzLlVTRV9BUElfS0VZID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5KT0JFX1NFUlZFUiA9IGVCb29rQ29uZmlnLmpvYmVob3N0IHx8IGVCb29rQ29uZmlnLmhvc3Q7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBlQm9va0NvbmZpZy5wcm94eXVyaV9ydW5zIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUnVuXCI7XG4gICAgICAgIHRoaXMuam9iZVB1dEZpbGVzID1cbiAgICAgICAgICAgIGVCb29rQ29uZmlnLnByb3h5dXJpX2ZpbGVzIHx8IFwiL3J1bmVzdG9uZS9wcm94eS9qb2JlUHVzaEZpbGUvXCI7XG4gICAgICAgIHRoaXMuam9iZUNoZWNrRmlsZXMgPVxuICAgICAgICAgICAgZUJvb2tDb25maWcucHJveHl1cmlfZmlsZXMgfHwgXCIvcnVuZXN0b25lL3Byb3h5L2pvYmVDaGVja0ZpbGUvXCI7XG4gICAgICAgIC8vIFRPRE86ICBzaG91bGQgYWRkIGEgcHJvcGVyIHB1dC9jaGVjayBpbiBwYXZlbWVudC50bXBsIGFzIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgd2lsbCBicmVhayBvbiBydW5lc3RvbmVcbiAgICAgICAgdGhpcy5kaXYyaWQgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5wdXRFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvck91dHB1dCgpO1xuICAgIH1cbiAgICBvdXRwdXRmdW4oYSkge31cbiAgICBjcmVhdGVJbnB1dEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgICAgICAgbGFiZWwuZm9yID0gdGhpcy5kaXZpZCArIFwiX3N0ZGluXCI7XG4gICAgICAgICQobGFiZWwpLnRleHQoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfaW5wdXRfcHJnXCIpKTtcbiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICBpbnB1dC5pZCA9IHRoaXMuZGl2aWQgKyBcIl9zdGRpblwiO1xuICAgICAgICBpbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlucHV0LnNpemUgPSBcIjM1XCI7XG4gICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zdGRpbjtcbiAgICAgICAgdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChsYWJlbCk7XG4gICAgICAgIHRoaXMub3V0ZXJEaXYuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgICAgICB0aGlzLnN0ZGluX2VsID0gaW5wdXQ7XG4gICAgfVxuICAgIGNyZWF0ZUVycm9yT3V0cHV0KCkge31cblxuICAgIC8qICBNYWluIHJ1blByb2cgbWV0aG9kIGZvciBsaXZlY29kZVxuICAgICAqXG4gICAgICovXG4gICAgYXN5bmMgcnVuUHJvZygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5TZXR1cCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHRoaXMuc3VibWl0VG9Kb2JlKCk7XG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgJC5pMThuKGBTZXJ2ZXIgRXJyb3I6ICR7cmVzLnN0YXR1c1RleHR9YClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmYWlsXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcnVuUmVzdWx0cyA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NKb2JlUmVzcG9uc2UocnVuUmVzdWx0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9zZXJ2ZXJfY29tbV9lcnJcIikgKyBlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHRoaXMucnVuQnV0dG9uKS5yZW1vdmVBdHRyKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gYGZhaWw6ICR7ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTm90ZTpcbiAgICAgKiBJbiBvcmRlciB0byBjaGVjayBmb3Igc3VwcGxlbWVudGFsIGZpbGVzIGluIGphdmEgYW5kIGRlYWwgd2l0aCBhc3luY2hyb25pY2l0eVxuICAgICAqIEkgc3BsaXQgdGhlIG9yaWdpbmFsIHJ1blByb2cgaW50byB0d28gZnVuY3Rpb25zOiBydW5Qcm9nIGFuZCBydW5Qcm9nX2NhbGxiYWNrXG4gICAgICovXG4gICAgYXN5bmMgcnVuU2V0dXAoKSB7XG4gICAgICAgIHZhciBzdGRpbjtcbiAgICAgICAgdmFyIHNvdXJjZTtcbiAgICAgICAgdmFyIHNhdmVDb2RlID0gXCJUcnVlXCI7XG4gICAgICAgIHZhciBzZmlsZW1hcCA9IHtcbiAgICAgICAgICAgIGphdmE6IFwiXCIsXG4gICAgICAgICAgICBjcHA6IFwidGVzdC5jcHBcIixcbiAgICAgICAgICAgIGM6IFwidGVzdC5jXCIsXG4gICAgICAgICAgICBweXRob24zOiBcInRlc3QucHlcIixcbiAgICAgICAgICAgIHB5dGhvbjI6IFwidGVzdC5weVwiLFxuICAgICAgICAgICAgb2N0YXZlOiBcIm9jdGF0ZXN0Lm1cIixcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNvdXJjZWZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIHRlc3Rkcml2ZXJuYW1lID0gXCJcIjtcbiAgICAgICAgdmFyIGZpbGVfY2hlY2twO1xuXG4gICAgICAgIC8vIGV4dHJhY3QgdGhlIGNsYXNzIG5hbWVzIHNvIGZpbGVzIGNhbiBiZSBuYW1lZCBwcm9wZXJseVxuICAgICAgICBpZiAodGhpcy5zdWZmaXggJiYgdGhpcy5sYW5ndWFnZSA9PSBcImphdmFcIikge1xuICAgICAgICAgICAgbGV0IGNsYXNzTWF0Y2ggPSBuZXcgUmVnRXhwKC9wdWJsaWMgY2xhc3NcXHMrKFxcdyspW1xccyt7XS8pO1xuICAgICAgICAgICAgc291cmNlID0gYXdhaXQgdGhpcy5idWlsZFByb2coZmFsc2UpO1xuICAgICAgICAgICAgbGV0IG0gPSBzb3VyY2UubWF0Y2goY2xhc3NNYXRjaCk7XG4gICAgICAgICAgICBpZiAobSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVuYW1lID0gbVsxXSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBiZSB1bml0IHRlc3QgY29kZVxuICAgICAgICAgICAgbSA9IHRoaXMuc3VmZml4Lm1hdGNoKGNsYXNzTWF0Y2gpO1xuICAgICAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICAgICAgICB0ZXN0ZHJpdmVybmFtZSA9IG1bMV0gKyBcIi5qYXZhXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YSBpcyBjb252ZXJ0aWJsZSB0byBCYXNlNjQuIElmIG5vdCB0aGVuIGVycm9yIG91dCBub3dcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ0b2Eoc291cmNlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYWxlcnQoXG4gICAgICAgICAgICAgICAgXCJFcnJvcjogQmFkIENoYXJhY3RlcnMgaW4gdGhlIGFjdGl2ZWNvZGUgd2luZG93LiBMaWtlbHkgYSBxdW90ZSBjaGFyYWN0ZXIgdGhhdCBoYXMgYmVlbiBjb3B5L3Bhc3RlZC4g8J+ZgVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlQ29kZSA9IGF3YWl0IHRoaXMubWFuYWdlX3NjcnViYmVyKHNhdmVDb2RlKTtcblxuICAgICAgICAvLyBhc3NlbWJsZSBwYXJhbWV0ZXJzIGZvciBKT0JFXG4gICAgICAgIHZhciBwYXJhbWxpc3QgPSBbXG4gICAgICAgICAgICBcImNvbXBpbGVhcmdzXCIsXG4gICAgICAgICAgICBcImxpbmthcmdzXCIsXG4gICAgICAgICAgICBcInJ1bmFyZ3NcIixcbiAgICAgICAgICAgIFwiaW50ZXJwcmV0ZXJhcmdzXCIsXG4gICAgICAgICAgICBcIm1lbW9yeWxpbWl0XCIsXG4gICAgICAgIF07XG4gICAgICAgIHZhciBwYXJhbW9iaiA9IHt9O1xuICAgICAgICBmb3IgKGxldCBwYXJhbSBvZiBwYXJhbWxpc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW3BhcmFtXSkge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqW3BhcmFtXSA9IGV2YWwodGhpc1twYXJhbV0pOyAvLyBuZWVkcyBhIGxpc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSA9PT0gXCJvY3RhdmVcIikge1xuICAgICAgICAgICAgcGFyYW1vYmoubWVtb3J5bGltaXQgPSAyMDAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGRpbikge1xuICAgICAgICAgICAgc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zb3VyY2VmaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZWZpbGUgPSBzZmlsZW1hcFt0aGlzLmxhbmd1YWdlXTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5vdXRwdXQpLmh0bWwoJC5pMThuKFwibXNnX2FjdGl2ZWNvZGVfY29tcGlsaW5nX3J1bm5pbmdcIikpO1xuICAgICAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbnRlbnQsIGJhc2U2NDtcbiAgICAgICAgaWYgKHRoaXMuZGF0YWZpbGUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgaWRzID0gdGhpcy5kYXRhZmlsZS5zcGxpdChcIixcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGlkc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZS5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLmxhc3RJbmRleE9mKFwiLlwiKSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlID09PSBudWxsIHx8IGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5vIGZpbGUgd2l0aCBnaXZlbiBpZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGZpbGUgaXMgaW4gZGJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRoaXMuZmlsZVJlYWRlcihmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGZpbGUudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCBpZiBmaWxlIGlzIGFuIGltYWdlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uID09PSBcImphclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0gZmlsZXMuY29uY2F0KHRoaXMucGFyc2VKYXZhQ2xhc3Nlcyhjb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbXCJqcGdcIiwgXCJwbmdcIiwgXCJnaWZcIl0uaW5kZXhPZihmaWxlRXh0ZW5zaW9uKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS50b0RhdGFVUkwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgPSBmaWxlLnRvRGF0YVVSTChcImltYWdlL1wiICsgZmlsZUV4dGVuc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gYmFzZTY0LnN1YnN0cmluZyhiYXNlNjQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gZmlsZS5zcmMuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNyYy5pbmRleE9mKFwiLFwiKSArIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgbmFtZTogZmlsZU5hbWUsIGNvbnRlbnQ6IGJhc2U2NCB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBjbGFzc05hbWUgb3IgdW4gcmVjb2duaXplZCBjbGFzc05hbWUgaXQgaXMgdHJlYXRlZCBhcyBhbiBpbmRpdmlkdWFsIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgdHlwZSBvZiBmaWxlLCAudHh0LCAuamF2YSwgLmNzdiwgZXRjXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBmaWxlTmFtZSwgY29udGVudDogY29udGVudCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgdW5pdCB0ZXN0cyB3ZSBuZWVkIHRvIHN1YnN0aXR1dGUgdGhlIHRlc3QgZHJpdmVyIGZvciB0aGUgc3R1ZGVudFxuICAgICAgICAvLyBjb2RlIGFuZCBzZW5kIHRoZSBzdHVkZW50IGNvZGUgYXMgYSBmaWxlLiAgV2UnbGwgZG8gdGhhdCBoZXJlLlxuICAgICAgICB0aGlzLmp1bml0RHJpdmVyQ29kZSA9IGBcbiAgICAgICAgaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuSlVuaXRDb3JlO1xuICAgICAgICBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SZXN1bHQ7XG4gICAgICAgIGltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5GYWlsdXJlO1xuXG4gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UnVubmVyIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBDb2RlVGVzdEhlbHBlci5yZXNldEZpbmFsUmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBKVW5pdENvcmUucnVuQ2xhc3Nlcygke3Rlc3Rkcml2ZXJuYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIFwiLmphdmFcIixcbiAgICAgICAgICAgICAgICAgICAgXCIuY2xhc3NcIlxuICAgICAgICAgICAgICAgICl9KTtcbiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZVRlc3RIZWxwZXIuZ2V0RmluYWxSZXN1bHRzKCkpO1xuXG4gICAgICAgICAgICAgICAgaW50IHRvdGFsID0gcmVzdWx0LmdldFJ1bkNvdW50KCk7XG4gICAgICAgICAgICAgICAgaW50IGZhaWxzID0gcmVzdWx0LmdldEZhaWx1cmVDb3VudCgpO1xuICAgICAgICAgICAgICAgIGludCBjb3JyICA9IHRvdGFsIC0gZmFpbHM7XG4gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFwiWW91IGdvdCBcIiArIGNvcnIgKyBcIiBvdXQgb2YgXCIgKyB0b3RhbCArIFwiIGNvcnJlY3QuIFwiICsgU3RyaW5nLmZvcm1hdChcIiUuMmZcIiwgKDEwMC4wICogY29yciAvIHRvdGFsKSkgKyBcIiVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgaWYgKHRoaXMuc3VmZml4ICYmIHRoaXMubGFuZ3VhZ2UgPT0gXCJqYXZhXCIpIHtcbiAgICAgICAgICAgIGZpbGVzLnB1c2goeyBuYW1lOiBzb3VyY2VmaWxlbmFtZSwgY29udGVudDogc291cmNlIH0pO1xuICAgICAgICAgICAgZmlsZXMucHVzaCh7IG5hbWU6IHRlc3Rkcml2ZXJuYW1lLCBjb250ZW50OiB0aGlzLnN1ZmZpeCB9KTtcbiAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMuanVuaXREcml2ZXJDb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmFtb2JqLmNvbXBpbGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1vYmouY29tcGlsZWFyZ3MucHVzaChzb3VyY2VmaWxlbmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtb2JqLmNvbXBpbGVhcmdzID0gW3NvdXJjZWZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcnVuc3BlYyA9IHtcbiAgICAgICAgICAgIGxhbmd1YWdlX2lkOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlY29kZTogc291cmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1vYmosXG4gICAgICAgICAgICBzb3VyY2VmaWxlbmFtZTogdGhpcy5zb3VyY2VmaWxlLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzdGRpbikge1xuICAgICAgICAgICAgcnVuc3BlYy5pbnB1dCA9IHN0ZGluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuanNvbl9ydW5zcGVjID0gSlNPTi5zdHJpbmdpZnkoeyBydW5fc3BlYzogcnVuc3BlYyB9KTtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5yZXNvbHZlKFwicmVhZHlcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW5zcGVjW1wiZmlsZV9saXN0XCJdID0gW107XG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBmaWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlQ29udGVudCA9IGZpbGVzW2ldLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSA9XG4gICAgICAgICAgICAgICAgICAgIFwicnVuZXN0b25lXCIgKyBNRDUoZmlsZU5hbWUgKyBmaWxlQ29udGVudCk7XG4gICAgICAgICAgICAgICAgcnVuc3BlY1tcImZpbGVfbGlzdFwiXS5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZGl2MmlkW2ZpbGVOYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY2hlY2tGaWxlKGZpbGVzW2ldLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmpzb25fcnVuc3BlYyA9IEpTT04uc3RyaW5naWZ5KHsgcnVuX3NwZWM6IHJ1bnNwZWMgfSk7XG4gICAgICAgICAgICB0aGlzLmRpdjJpZCA9IGluc3RhbmNlLmRpdjJpZDtcbiAgICAgICAgICAgIGZpbGVfY2hlY2twID0gUHJvbWlzZS5hbGwocHJvbWlzZXMpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yOiBcIiArIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsZV9jaGVja3A7XG4gICAgfVxuXG4gICAgLyogU3VibWl0IHRoZSBhc3NlbWJsZWQgam9iIHRvIHRoZSBKT0JFIHNlcnZlciBhbmQgYXdhaXQgdGhlIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKi9cbiAgICBhc3luYyBzdWJtaXRUb0pvYmUoKSB7XG4gICAgICAgIHZhciBkYXRhID0gdGhpcy5qc29uX3J1bnNwZWM7XG4gICAgICAgIGxldCBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHRoaXMucmVzb3VyY2U7XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLmF0dHIoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAkKHRoaXMub3V0RGl2KS5zaG93KHsgZHVyYXRpb246IDcwMCwgcXVldWU6IGZhbHNlIH0pO1xuICAgICAgICAkKHRoaXMuZXJyRGl2KS5yZW1vdmUoKTtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcInZpc2libGVcIik7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICBcIlgtQVBJLUtFWVwiOiB0aGlzLkFQSV9LRVksXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGhvc3QsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcblxuICAgICAgICAvLy8kKFwiI1wiICsgZGl2aWQgKyBcIl9lcnJpbmZvXCIpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHByb2Nlc3NKb2JlUmVzcG9uc2UocmVzdWx0KSB7XG4gICAgICAgIHZhciBsb2dyZXN1bHQ7XG4gICAgICAgIHZhciBvZGl2ID0gdGhpcy5vdXRwdXQ7XG4gICAgICAgIHRoaXMucGFyc2VkT3V0cHV0ID0ge307XG4gICAgICAgICQodGhpcy5ydW5CdXR0b24pLnJlbW92ZUF0dHIoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgaWYgKHJlc3VsdC5vdXRjb21lID09PSAxNSkge1xuICAgICAgICAgICAgbG9ncmVzdWx0ID0gXCJzdWNjZXNzXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dyZXN1bHQgPSByZXN1bHQub3V0Y29tZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVycmluZm8gPSBsb2dyZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgICAgICAgIGNhc2UgMTU6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZE91dHB1dCA9IG5ldyBKVW5pdFRlc3RQYXJzZXIoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGl2aWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCh0aGlzLnBhcnNlZE91dHB1dC5zdGRvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1ZmZpeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRPdXRwdXQucGN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkT3V0cHV0LnBjdCA9IHRoaXMucGFyc2VkT3V0cHV0LnBhc3NlZCA9IHRoaXMucGFyc2VkT3V0cHV0LmZhaWxlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bml0X3Jlc3VsdHMgPSBgcGVyY2VudDoke3RoaXMucGFyc2VkT3V0cHV0LnBjdH06cGFzc2VkOiR7dGhpcy5wYXJzZWRPdXRwdXQucGFzc2VkfTpmYWlsZWQ6JHt0aGlzLnBhcnNlZE91dHB1dC5mYWlsZWR9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDExOiAvLyBjb21waWxlciBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbCgkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV93ZXJlX2NvbXBpbGluZ19lcnJcIikpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuY21waW5mbyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEyOiAvLyBydW4gdGltZSBlcnJvclxuICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3Rkb3V0LnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShyZXN1bHQuc3RkZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDEzOiAvLyB0aW1lIGxpbWl0XG4gICAgICAgICAgICAgICAgJChvZGl2KS5odG1sKHJlc3VsdC5zdGRvdXQucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRKb2JlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV90aW1lX2xpbWl0X2V4Y1wiKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICQob2RpdikuaHRtbChyZXN1bHQuc3RkZXJyLnJlcGxhY2UoL1xcbi9nLCBcIjxicj5cIikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSm9iZUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3NlcnZlcl9lcnJcIilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9kbzogaGFuZGxlIHNlcnZlciBidXN5IGFuZCB0aW1lb3V0IGVycm9ycyB0b29cbiAgICB9XG5cbiAgICByZW5kZXJGZWVkYmFjaygpIHtcbiAgICAgICAgbGV0IHJkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHt0aGlzLmRpdmlkfV91bml0X3Jlc3VsdHNgKTtcbiAgICAgICAgaWYgKHJkaXYpIHtcbiAgICAgICAgICAgIHJkaXYucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkT3V0cHV0ICYmIHRoaXMucGFyc2VkT3V0cHV0LnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm91dERpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3RoaXMuZGl2aWR9X3VuaXRfcmVzdWx0c2ApO1xuICAgICAgICBpZiAocmRpdikge1xuICAgICAgICAgICAgcmRpdi5hcHBlbmRDaGlsZCh0aGlzLnBhcnNlZE91dHB1dC5wY3RTdHJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSm9iZUVycm9yTWVzc2FnZShlcnIpIHtcbiAgICAgICAgdmFyIGVyckhlYWQgPSAkKFwiPGgzPlwiKS5odG1sKFwiRXJyb3JcIik7XG4gICAgICAgIHZhciBlQ29udGFpbmVyID0gdGhpcy5vdXRlckRpdi5hcHBlbmRDaGlsZChcbiAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lcnJEaXYgPSBlQ29udGFpbmVyO1xuICAgICAgICBlQ29udGFpbmVyLmNsYXNzTmFtZSA9IFwiZXJyb3IgYWxlcnQgYWxlcnQtZGFuZ2VyXCI7XG4gICAgICAgIGVDb250YWluZXIuaWQgPSB0aGlzLmRpdmlkICsgXCJfZXJyaW5mb1wiO1xuICAgICAgICBlQ29udGFpbmVyLmFwcGVuZENoaWxkKGVyckhlYWRbMF0pO1xuICAgICAgICB2YXIgZXJyVGV4dCA9IGVDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInByZVwiKSk7XG4gICAgICAgIGVyclRleHQuaW5uZXJIVE1MID0gZXJyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdG8gc2VlIGlmIGZpbGUgaXMgb24gc2VydmVyXG4gICAgICogUGxhY2VzIGl0IG9uIHNlcnZlciBpZiBpdCBpcyBub3Qgb24gc2VydmVyXG4gICAgICogQHBhcmFtICB7b2JqZWN0e25hbWUsIGNvbnRlbnRzfX0gZmlsZSAgICBGaWxlIHRvIHBsYWNlIG9uIHNlcnZlclxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZXNvbHZlIHByb21pc2UgcmVzb2x2ZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSAge2Z1bmN0aW9ufSByZWplY3QgIHByb21pc2UgcmVqZWN0IGZ1bmN0aW9uXG4gICAgICovXG4gICAgY2hlY2tGaWxlKGZpbGUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZmlsZV9pZCA9IHRoaXMuZGl2MmlkW2ZpbGUubmFtZV07XG4gICAgICAgIHZhciByZXNvdXJjZSA9IHRoaXMuam9iZUNoZWNrRmlsZXMgKyBmaWxlX2lkO1xuICAgICAgICB2YXIgaG9zdCA9IHRoaXMuSk9CRV9TRVJWRVIgKyByZXNvdXJjZTtcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbihcIkhFQURcIiwgaG9zdCwgdHJ1ZSk7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIiwgXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQVBJLUtFWVwiLCB0aGlzLkFQSV9LRVkpO1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXJyb3Igc2VuZGluZyBmaWxlXCIgKyB4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgMjA4OlxuICAgICAgICAgICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZpbGUgbm90IG9uIFNlcnZlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoRGF0YUZpbGUoZmlsZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiQmFkIFJlcXVlc3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGaWxlIGFscmVhZHkgb24gU2VydmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxhY2VzIGEgZmlsZSBvbiBhIHNlcnZlclxuICAgICAqL1xuICAgIHB1c2hEYXRhRmlsZShmaWxlLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGZpbGVOYW1lID0gZmlsZS5uYW1lO1xuICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoXCIuXCIpICsgMSk7XG4gICAgICAgIHZhciBmaWxlX2lkID0gdGhpcy5kaXYyaWRbZmlsZU5hbWVdO1xuICAgICAgICB2YXIgY29udGVudHMgPSBmaWxlLmNvbnRlbnQ7XG4gICAgICAgIC8vIEZpbGUgdHlwZXMgYmVpbmcgdXBsb2FkZWQgdGhhdCBjb21lIGluIGFscmVhZHkgaW4gYmFzZTY0IGZvcm1hdFxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IFtcImphclwiLCBcInppcFwiLCBcInBuZ1wiLCBcImpwZ1wiLCBcImpwZWdcIl07XG4gICAgICAgIHZhciBjb250ZW50c2I2NDtcbiAgICAgICAgaWYgKGV4dGVuc2lvbnMuaW5kZXhPZihleHRlbnNpb24pID09PSAtMSkge1xuICAgICAgICAgICAgY29udGVudHNiNjQgPSBidG9hKGNvbnRlbnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRzYjY0ID0gY29udGVudHM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7IGZpbGVfY29udGVudHM6IGNvbnRlbnRzYjY0IH0pO1xuICAgICAgICB2YXIgcmVzb3VyY2UgPSB0aGlzLmpvYmVQdXRGaWxlcyArIGZpbGVfaWQ7XG4gICAgICAgIHZhciBob3N0ID0gdGhpcy5KT0JFX1NFUlZFUiArIHJlc291cmNlO1xuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKFwiUFVUXCIsIGhvc3QsIHRydWUpO1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUFQSS1LRVlcIiwgdGhpcy5BUElfS0VZKTtcbiAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoeGhyLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkZvcmJpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDAwOlxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkJhZCBSZXF1ZXN0XCIpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzdWNjZXNzZnVsbHkgc2VudCBmaWxlIFwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJGaWxlIFwiICsgZmlsZU5hbWUgK1wiLCBcIiArIGZpbGVfaWQgK1wiIHBsYWNlZCBvbiBzZXJ2ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGlzIGNhc2Ugc2hvdWxkIG5ldmVyIGhhcHBlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVycm9yIHNlbmRpbmcgZmlsZVwiICsgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfTtcbiAgICAgICAgeGhyLnNlbmQoZGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvZGVsZW5zKCkge1xuICAgICAgICBsZXQgY2xNZXNzID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuY29kZWxlbnMuc3R5bGUuZGlzcGxheSA9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgY2xNZXNzID0gXCJCdWlsZGluZyB5b3VyIHZpc3VhbGl6YXRpb25cIjtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMuaW5uZXJIVE1MID0gY2xNZXNzO1xuICAgICAgICAgICAgdGhpcy5jbEJ1dHRvbi5pbm5lclRleHQgPSAkLmkxOG4oXCJtc2dfYWN0aXZlY29kZV9oaWRlX2NvZGVsZW5zXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICB0aGlzLmNsQnV0dG9uLmlubmVyVGV4dCA9ICQuaTE4bihcIm1zZ19hY3RpdmVjb2RlX3Nob3dfaW5fY29kZWxlbnNcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsID0gdGhpcy5jb2RlbGVucy5maXJzdENoaWxkO1xuICAgICAgICBpZiAoY2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZWxlbnMucmVtb3ZlQ2hpbGQoY2wpO1xuICAgICAgICAgICAgdGhpcy5jb2RlbGVucy5pbm5lckhUTUwgPSBjbE1lc3M7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvZGUgPSBhd2FpdCB0aGlzLmJ1aWxkUHJvZyhmYWxzZSk7XG4gICAgICAgIGlmIChjb2RlLm1hdGNoKC9TeXN0ZW0uZXhpdC8pKSB7XG4gICAgICAgICAgICBhbGVydChcbiAgICAgICAgICAgICAgICBcIlNvcnJ5Li4uIFN5c3RlbS5leGl0IGJyZWFrcyB0aGUgdmlzdWFsaXplciB0ZW1wb3JhcmlseSByZW1vdmluZ1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29kZSA9IGNvZGUucmVwbGFjZSgvU3lzdGVtLmV4aXRcXChcXGQrXFwpOy8sIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBteVZhcnMgPSB7fTtcbiAgICAgICAgbXlWYXJzLmNvZGUgPSBjb2RlO1xuICAgICAgICBteVZhcnMubGFuZyA9IHRoaXMubGFuZ3VhZ2U7XG4gICAgICAgIGlmICh0aGlzLnN0ZGluKSB7XG4gICAgICAgICAgICBteVZhcnMuc3RkaW4gPSAkKHRoaXMuc3RkaW5fZWwpLnZhbCgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YXJnZXREaXYgPSB0aGlzLmNvZGVsZW5zLmlkO1xuXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoXCIvcnVuZXN0b25lL3Byb3h5L3B5dHV0b3JfdHJhY2VcIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG15VmFycyksXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmpzb25IZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHJlcXVlc3QpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICBsZXQgdmlzID0gYWRkVmlzdWFsaXplclRvUGFnZShkYXRhLCB0YXJnZXREaXYsIHtcbiAgICAgICAgICAgICAgICBzdGFydGluZ0luc3RydWN0aW9uOiAwLFxuICAgICAgICAgICAgICAgIGVkaXRDb2RlQmFzZVVSTDogbnVsbCxcbiAgICAgICAgICAgICAgICBoaWRlQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFuZzogbXlWYXJzLmxhbmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCB0YXJnZXREaXZFcnJvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldERpdik7XG4gICAgICAgICAgICB0YXJnZXREaXZFcnJvci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgICAgIFwiU29ycnksIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHlvdXIgdmlzdWFsaXphdGlvbi5cIjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiR2V0IFRyYWNlIEZhaWxlZCAtLSBcIik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ0Jvb2tFdmVudCh7XG4gICAgICAgICAgICBldmVudDogXCJjb2RlbGVuc1wiLFxuICAgICAgICAgICAgYWN0OiBcInZpZXdcIixcbiAgICAgICAgICAgIGRpdl9pZDogdGhpcy5kaXZpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VwZXJhdGVzIHRleHQgaW50byBtdWx0aXBsZSAuamF2YSBmaWxlc1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gdGV4dCBTdHJpbmcgd2l0aCBtdWxpcGxlIGphdmEgY2xhc3NlcyBuZWVkZWQgdG8gYmUgc2VwZXJhdGVkXG4gICAgICogQHJldHVybiB7YXJyYXkgb2Ygb2JqZWN0c30gIC5uYW1lIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBqYXZhIGZpbGUgd2l0aCAuamF2YSBleHRlbnNpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAuY29udGVudCBnaXZlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVcbiAgICAgKi9cbiAgICBwYXJzZUphdmFDbGFzc2VzKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YWNrID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICB2YXIgaW1wb3J0SW5kZXggPSAwO1xuICAgICAgICB2YXIgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hhciA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09IFwiL1wiKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09IFwiXFxuXCIgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dC5jaGFyQXQoaSkgPT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dC5jaGFyQXQoaSkgIT09IFwiKlwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoaSArIDEpICE9PSBcIi9cIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxIDwgdGV4dC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB3aGlsZSAodGV4dC5jaGFyQXQoaSkgIT09ICdcIicgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRleHQuY2hhckF0KGkpICE9PSBcIidcIiAmJiBpIDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcENvdW50ID0gMTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBDb3VudCA+IDAgJiYgaSA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCIoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuY2hhckF0KGkpID09PSBcIilcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZm91bmQgJiYgdGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaSkgPT09IFwie1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PT0gXCJ9XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2stLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmQgJiYgc3RhY2sgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBpICsgMTtcbiAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoZW5kT2ZMYXN0Q29tbWVudEJlZm9yZUNsYXNzQmVnaW5zLCBzdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB3b3Jkcy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB3b3Jkc1t3XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRzW3ddID09PSBcImV4dGVuZHNcIiB8fCB3b3Jkc1t3XSA9PT0gXCJpbXBsZW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdvcmRzW3cgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB3b3Jkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRyaW0oKSArIFwiLmphdmFcIjtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQuc3Vic3RyaW5nKGltcG9ydEluZGV4LCBlbmRJbmRleCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbXBvcnRJbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgIGVuZE9mTGFzdENvbW1lbnRCZWZvcmVDbGFzc0JlZ2lucyA9IGVuZEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVuZXNjYXBlSHRtbChzYWZlKSB7XG4gICAgaWYgKHNhZmUpIHtcbiAgICAgICAgcmV0dXJuIHNhZmVcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mYW1wOy9nLCBcIiZcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC8mbHQ7L2csIFwiPFwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyZndDsvZywgXCI+XCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvJnF1b3Q7L2csICdcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvJiN4Mjc7L2csIFwiJ1wiKTtcbiAgICB9XG59XG4iLCIvKipcbiAqXG4gKiAgTUQ1IChNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0pXG4gKiAgaHR0cDovL3d3dy53ZWJ0b29sa2l0LmluZm8vXG4gKlxuICoqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNRDUoc3RyaW5nKSB7XG4gICAgZnVuY3Rpb24gUm90YXRlTGVmdChsVmFsdWUsIGlTaGlmdEJpdHMpIHtcbiAgICAgICAgcmV0dXJuIChsVmFsdWUgPDwgaVNoaWZ0Qml0cykgfCAobFZhbHVlID4+PiAoMzIgLSBpU2hpZnRCaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQWRkVW5zaWduZWQobFgsIGxZKSB7XG4gICAgICAgIHZhciBsWDQsIGxZNCwgbFg4LCBsWTgsIGxSZXN1bHQ7XG4gICAgICAgIGxYOCA9IGxYICYgMHg4MDAwMDAwMDtcbiAgICAgICAgbFk4ID0gbFkgJiAweDgwMDAwMDAwO1xuICAgICAgICBsWDQgPSBsWCAmIDB4NDAwMDAwMDA7XG4gICAgICAgIGxZNCA9IGxZICYgMHg0MDAwMDAwMDtcbiAgICAgICAgbFJlc3VsdCA9IChsWCAmIDB4M2ZmZmZmZmYpICsgKGxZICYgMHgzZmZmZmZmZik7XG4gICAgICAgIGlmIChsWDQgJiBsWTQpIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg4MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgfVxuICAgICAgICBpZiAobFg0IHwgbFk0KSB7XG4gICAgICAgICAgICBpZiAobFJlc3VsdCAmIDB4NDAwMDAwMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbFJlc3VsdCBeIDB4YzAwMDAwMDAgXiBsWDggXiBsWTg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gMHg0MDAwMDAwMCBeIGxYOCBeIGxZODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsUmVzdWx0IF4gbFg4IF4gbFk4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRih4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRyh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSCh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSSh4LCB5LCB6KSB7XG4gICAgICAgIHJldHVybiB5IF4gKHggfCB+eik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRkYoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEYoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gR0coYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEcoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSEgoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEgoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gSUkoYSwgYiwgYywgZCwgeCwgcywgYWMpIHtcbiAgICAgICAgYSA9IEFkZFVuc2lnbmVkKGEsIEFkZFVuc2lnbmVkKEFkZFVuc2lnbmVkKEkoYiwgYywgZCksIHgpLCBhYykpO1xuICAgICAgICByZXR1cm4gQWRkVW5zaWduZWQoUm90YXRlTGVmdChhLCBzKSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29udmVydFRvV29yZEFycmF5KHN0cmluZykge1xuICAgICAgICB2YXIgbFdvcmRDb3VudDtcbiAgICAgICAgdmFyIGxNZXNzYWdlTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgICAgdmFyIGxOdW1iZXJPZldvcmRzX3RlbXAxID0gbE1lc3NhZ2VMZW5ndGggKyA4O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHNfdGVtcDIgPVxuICAgICAgICAgICAgKGxOdW1iZXJPZldvcmRzX3RlbXAxIC0gKGxOdW1iZXJPZldvcmRzX3RlbXAxICUgNjQpKSAvIDY0O1xuICAgICAgICB2YXIgbE51bWJlck9mV29yZHMgPSAobE51bWJlck9mV29yZHNfdGVtcDIgKyAxKSAqIDE2O1xuICAgICAgICB2YXIgbFdvcmRBcnJheSA9IEFycmF5KGxOdW1iZXJPZldvcmRzIC0gMSk7XG4gICAgICAgIHZhciBsQnl0ZVBvc2l0aW9uID0gMDtcbiAgICAgICAgdmFyIGxCeXRlQ291bnQgPSAwO1xuICAgICAgICB3aGlsZSAobEJ5dGVDb3VudCA8IGxNZXNzYWdlTGVuZ3RoKSB7XG4gICAgICAgICAgICBsV29yZENvdW50ID0gKGxCeXRlQ291bnQgLSAobEJ5dGVDb3VudCAlIDQpKSAvIDQ7XG4gICAgICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdID1cbiAgICAgICAgICAgICAgICBsV29yZEFycmF5W2xXb3JkQ291bnRdIHxcbiAgICAgICAgICAgICAgICAoc3RyaW5nLmNoYXJDb2RlQXQobEJ5dGVDb3VudCkgPDwgbEJ5dGVQb3NpdGlvbik7XG4gICAgICAgICAgICBsQnl0ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbFdvcmRDb3VudCA9IChsQnl0ZUNvdW50IC0gKGxCeXRlQ291bnQgJSA0KSkgLyA0O1xuICAgICAgICBsQnl0ZVBvc2l0aW9uID0gKGxCeXRlQ291bnQgJSA0KSAqIDg7XG4gICAgICAgIGxXb3JkQXJyYXlbbFdvcmRDb3VudF0gPVxuICAgICAgICAgICAgbFdvcmRBcnJheVtsV29yZENvdW50XSB8ICgweDgwIDw8IGxCeXRlUG9zaXRpb24pO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMl0gPSBsTWVzc2FnZUxlbmd0aCA8PCAzO1xuICAgICAgICBsV29yZEFycmF5W2xOdW1iZXJPZldvcmRzIC0gMV0gPSBsTWVzc2FnZUxlbmd0aCA+Pj4gMjk7XG4gICAgICAgIHJldHVybiBsV29yZEFycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdvcmRUb0hleChsVmFsdWUpIHtcbiAgICAgICAgdmFyIFdvcmRUb0hleFZhbHVlID0gXCJcIixcbiAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAgPSBcIlwiLFxuICAgICAgICAgICAgbEJ5dGUsXG4gICAgICAgICAgICBsQ291bnQ7XG4gICAgICAgIGZvciAobENvdW50ID0gMDsgbENvdW50IDw9IDM7IGxDb3VudCsrKSB7XG4gICAgICAgICAgICBsQnl0ZSA9IChsVmFsdWUgPj4+IChsQ291bnQgKiA4KSkgJiAyNTU7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZV90ZW1wID0gXCIwXCIgKyBsQnl0ZS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBXb3JkVG9IZXhWYWx1ZSA9XG4gICAgICAgICAgICAgICAgV29yZFRvSGV4VmFsdWUgK1xuICAgICAgICAgICAgICAgIFdvcmRUb0hleFZhbHVlX3RlbXAuc3Vic3RyKFdvcmRUb0hleFZhbHVlX3RlbXAubGVuZ3RoIC0gMiwgMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFdvcmRUb0hleFZhbHVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFV0ZjhFbmNvZGUoc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC9cXHJcXG4vZywgXCJcXG5cIik7XG4gICAgICAgIHZhciB1dGZ0ZXh0ID0gXCJcIjtcblxuICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHN0cmluZy5sZW5ndGg7IG4rKykge1xuICAgICAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChuKTtcblxuICAgICAgICAgICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcgJiYgYyA8IDIwNDgpIHtcbiAgICAgICAgICAgICAgICB1dGZ0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGMgPj4gNikgfCAxOTIpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyA+PiAxMikgfCAyMjQpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgPj4gNikgJiA2MykgfCAxMjgpO1xuICAgICAgICAgICAgICAgIHV0ZnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoYyAmIDYzKSB8IDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRmdGV4dDtcbiAgICB9XG5cbiAgICB2YXIgeCA9IEFycmF5KCk7XG4gICAgdmFyIGssIEFBLCBCQiwgQ0MsIERELCBhLCBiLCBjLCBkO1xuICAgIHZhciBTMTEgPSA3LFxuICAgICAgICBTMTIgPSAxMixcbiAgICAgICAgUzEzID0gMTcsXG4gICAgICAgIFMxNCA9IDIyO1xuICAgIHZhciBTMjEgPSA1LFxuICAgICAgICBTMjIgPSA5LFxuICAgICAgICBTMjMgPSAxNCxcbiAgICAgICAgUzI0ID0gMjA7XG4gICAgdmFyIFMzMSA9IDQsXG4gICAgICAgIFMzMiA9IDExLFxuICAgICAgICBTMzMgPSAxNixcbiAgICAgICAgUzM0ID0gMjM7XG4gICAgdmFyIFM0MSA9IDYsXG4gICAgICAgIFM0MiA9IDEwLFxuICAgICAgICBTNDMgPSAxNSxcbiAgICAgICAgUzQ0ID0gMjE7XG5cbiAgICBzdHJpbmcgPSBVdGY4RW5jb2RlKHN0cmluZyk7XG5cbiAgICB4ID0gQ29udmVydFRvV29yZEFycmF5KHN0cmluZyk7XG5cbiAgICBhID0gMHg2NzQ1MjMwMTtcbiAgICBiID0gMHhlZmNkYWI4OTtcbiAgICBjID0gMHg5OGJhZGNmZTtcbiAgICBkID0gMHgxMDMyNTQ3NjtcblxuICAgIGZvciAoayA9IDA7IGsgPCB4Lmxlbmd0aDsgayArPSAxNikge1xuICAgICAgICBBQSA9IGE7XG4gICAgICAgIEJCID0gYjtcbiAgICAgICAgQ0MgPSBjO1xuICAgICAgICBERCA9IGQ7XG4gICAgICAgIGEgPSBGRihhLCBiLCBjLCBkLCB4W2sgKyAwXSwgUzExLCAweGQ3NmFhNDc4KTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDFdLCBTMTIsIDB4ZThjN2I3NTYpO1xuICAgICAgICBjID0gRkYoYywgZCwgYSwgYiwgeFtrICsgMl0sIFMxMywgMHgyNDIwNzBkYik7XG4gICAgICAgIGIgPSBGRihiLCBjLCBkLCBhLCB4W2sgKyAzXSwgUzE0LCAweGMxYmRjZWVlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDRdLCBTMTEsIDB4ZjU3YzBmYWYpO1xuICAgICAgICBkID0gRkYoZCwgYSwgYiwgYywgeFtrICsgNV0sIFMxMiwgMHg0Nzg3YzYyYSk7XG4gICAgICAgIGMgPSBGRihjLCBkLCBhLCBiLCB4W2sgKyA2XSwgUzEzLCAweGE4MzA0NjEzKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDddLCBTMTQsIDB4ZmQ0Njk1MDEpO1xuICAgICAgICBhID0gRkYoYSwgYiwgYywgZCwgeFtrICsgOF0sIFMxMSwgMHg2OTgwOThkOCk7XG4gICAgICAgIGQgPSBGRihkLCBhLCBiLCBjLCB4W2sgKyA5XSwgUzEyLCAweDhiNDRmN2FmKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDEwXSwgUzEzLCAweGZmZmY1YmIxKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDExXSwgUzE0LCAweDg5NWNkN2JlKTtcbiAgICAgICAgYSA9IEZGKGEsIGIsIGMsIGQsIHhbayArIDEyXSwgUzExLCAweDZiOTAxMTIyKTtcbiAgICAgICAgZCA9IEZGKGQsIGEsIGIsIGMsIHhbayArIDEzXSwgUzEyLCAweGZkOTg3MTkzKTtcbiAgICAgICAgYyA9IEZGKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzEzLCAweGE2Nzk0MzhlKTtcbiAgICAgICAgYiA9IEZGKGIsIGMsIGQsIGEsIHhbayArIDE1XSwgUzE0LCAweDQ5YjQwODIxKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDFdLCBTMjEsIDB4ZjYxZTI1NjIpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxMV0sIFMyMywgMHgyNjVlNWE1MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAwXSwgUzI0LCAweGU5YjZjN2FhKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDVdLCBTMjEsIDB4ZDYyZjEwNWQpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTBdLCBTMjIsIDB4MjQ0MTQ1Myk7XG4gICAgICAgIGMgPSBHRyhjLCBkLCBhLCBiLCB4W2sgKyAxNV0sIFMyMywgMHhkOGExZTY4MSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA0XSwgUzI0LCAweGU3ZDNmYmM4KTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDldLCBTMjEsIDB4MjFlMWNkZTYpO1xuICAgICAgICBkID0gR0coZCwgYSwgYiwgYywgeFtrICsgMTRdLCBTMjIsIDB4YzMzNzA3ZDYpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyA4XSwgUzI0LCAweDQ1NWExNGVkKTtcbiAgICAgICAgYSA9IEdHKGEsIGIsIGMsIGQsIHhbayArIDEzXSwgUzIxLCAweGE5ZTNlOTA1KTtcbiAgICAgICAgZCA9IEdHKGQsIGEsIGIsIGMsIHhbayArIDJdLCBTMjIsIDB4ZmNlZmEzZjgpO1xuICAgICAgICBjID0gR0coYywgZCwgYSwgYiwgeFtrICsgN10sIFMyMywgMHg2NzZmMDJkOSk7XG4gICAgICAgIGIgPSBHRyhiLCBjLCBkLCBhLCB4W2sgKyAxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA1XSwgUzMxLCAweGZmZmEzOTQyKTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDhdLCBTMzIsIDB4ODc3MWY2ODEpO1xuICAgICAgICBjID0gSEgoYywgZCwgYSwgYiwgeFtrICsgMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTRdLCBTMzQsIDB4ZmRlNTM4MGMpO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMV0sIFMzMSwgMHhhNGJlZWE0NCk7XG4gICAgICAgIGQgPSBISChkLCBhLCBiLCBjLCB4W2sgKyA0XSwgUzMyLCAweDRiZGVjZmE5KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDddLCBTMzMsIDB4ZjZiYjRiNjApO1xuICAgICAgICBiID0gSEgoYiwgYywgZCwgYSwgeFtrICsgMTBdLCBTMzQsIDB4YmViZmJjNzApO1xuICAgICAgICBhID0gSEgoYSwgYiwgYywgZCwgeFtrICsgMTNdLCBTMzEsIDB4Mjg5YjdlYzYpO1xuICAgICAgICBkID0gSEgoZCwgYSwgYiwgYywgeFtrICsgMF0sIFMzMiwgMHhlYWExMjdmYSk7XG4gICAgICAgIGMgPSBISChjLCBkLCBhLCBiLCB4W2sgKyAzXSwgUzMzLCAweGQ0ZWYzMDg1KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDZdLCBTMzQsIDB4NDg4MWQwNSk7XG4gICAgICAgIGEgPSBISChhLCBiLCBjLCBkLCB4W2sgKyA5XSwgUzMxLCAweGQ5ZDRkMDM5KTtcbiAgICAgICAgZCA9IEhIKGQsIGEsIGIsIGMsIHhbayArIDEyXSwgUzMyLCAweGU2ZGI5OWU1KTtcbiAgICAgICAgYyA9IEhIKGMsIGQsIGEsIGIsIHhbayArIDE1XSwgUzMzLCAweDFmYTI3Y2Y4KTtcbiAgICAgICAgYiA9IEhIKGIsIGMsIGQsIGEsIHhbayArIDJdLCBTMzQsIDB4YzRhYzU2NjUpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMF0sIFM0MSwgMHhmNDI5MjI0NCk7XG4gICAgICAgIGQgPSBJSShkLCBhLCBiLCBjLCB4W2sgKyA3XSwgUzQyLCAweDQzMmFmZjk3KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDE0XSwgUzQzLCAweGFiOTQyM2E3KTtcbiAgICAgICAgYiA9IElJKGIsIGMsIGQsIGEsIHhbayArIDVdLCBTNDQsIDB4ZmM5M2EwMzkpO1xuICAgICAgICBhID0gSUkoYSwgYiwgYywgZCwgeFtrICsgMTJdLCBTNDEsIDB4NjU1YjU5YzMpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgM10sIFM0MiwgMHg4ZjBjY2M5Mik7XG4gICAgICAgIGMgPSBJSShjLCBkLCBhLCBiLCB4W2sgKyAxMF0sIFM0MywgMHhmZmVmZjQ3ZCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTtcbiAgICAgICAgYSA9IElJKGEsIGIsIGMsIGQsIHhbayArIDhdLCBTNDEsIDB4NmZhODdlNGYpO1xuICAgICAgICBkID0gSUkoZCwgYSwgYiwgYywgeFtrICsgMTVdLCBTNDIsIDB4ZmUyY2U2ZTApO1xuICAgICAgICBjID0gSUkoYywgZCwgYSwgYiwgeFtrICsgNl0sIFM0MywgMHhhMzAxNDMxNCk7XG4gICAgICAgIGIgPSBJSShiLCBjLCBkLCBhLCB4W2sgKyAxM10sIFM0NCwgMHg0ZTA4MTFhMSk7XG4gICAgICAgIGEgPSBJSShhLCBiLCBjLCBkLCB4W2sgKyA0XSwgUzQxLCAweGY3NTM3ZTgyKTtcbiAgICAgICAgZCA9IElJKGQsIGEsIGIsIGMsIHhbayArIDExXSwgUzQyLCAweGJkM2FmMjM1KTtcbiAgICAgICAgYyA9IElJKGMsIGQsIGEsIGIsIHhbayArIDJdLCBTNDMsIDB4MmFkN2QyYmIpO1xuICAgICAgICBiID0gSUkoYiwgYywgZCwgYSwgeFtrICsgOV0sIFM0NCwgMHhlYjg2ZDM5MSk7XG4gICAgICAgIGEgPSBBZGRVbnNpZ25lZChhLCBBQSk7XG4gICAgICAgIGIgPSBBZGRVbnNpZ25lZChiLCBCQik7XG4gICAgICAgIGMgPSBBZGRVbnNpZ25lZChjLCBDQyk7XG4gICAgICAgIGQgPSBBZGRVbnNpZ25lZChkLCBERCk7XG4gICAgfVxuXG4gICAgdmFyIHRlbXAgPSBXb3JkVG9IZXgoYSkgKyBXb3JkVG9IZXgoYikgKyBXb3JkVG9IZXgoYykgKyBXb3JkVG9IZXgoZCk7XG5cbiAgICByZXR1cm4gdGVtcC50b0xvd2VyQ2FzZSgpO1xufVxuIiwiU2suYnVpbHRpbkZpbGVzPXtcImZpbGVzXCI6e1wic3JjL2J1aWx0aW4vc3lzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixhPU1hdGgucG93LGM9e30sZD1bXSxlPVNrLmdldFN5c0FyZ3YoKTtmb3IoYj0wO2I8ZS5sZW5ndGg7KytiKWQucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZVtiXSkpO3JldHVybiBjLmFyZ3Y9bmV3IFNrLmJ1aWx0aW5zLmxpc3QoZCksYy5jb3B5cmlnaHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJDb3B5cmlnaHQgMjAwOS0yMDEwIFNjb3R0IEdyYWhhbS5cXFxcbkFsbCBSaWdodHMgUmVzZXJ2ZWQuXFxcXG5cXFwiKSxTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGMudmVyc2lvbj1cXFwiMy43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDMpLG5ldyBTay5idWlsdGluLmludF8oNyldKSk6KGMudmVyc2lvbj1cXFwiMi43KGlzaCkgW1NrdWxwdF1cXFwiLGMudmVyc2lvbl9pbmZvPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5pbnRfKDIpLG5ldyBTay5idWlsdGluLmludF8oNyldKSksYy5tYXhpbnQ9bmV3IFNrLmJ1aWx0aW4uaW50XyhhKDIsNTMpLTEpLGMubWF4c2l6ZT1uZXcgU2suYnVpbHRpbi5pbnRfKGEoMiw1MyktMSksYy5tb2R1bGVzPVNrLnN5c21vZHVsZXMsYy5wYXRoPVNrLnJlYWxzeXNwYXRoLGMuZ2V0RXhlY3V0aW9uTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2suZXhlY0xpbWl0P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmV4ZWNMaW1pdCl9KSxjLnNldEV4ZWN1dGlvbkxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYobnVsbD09PVNrLmV4ZWNMaW1pdCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJFeGVjdXRpb24gbGltaXRpbmcgaXMgbm90IGVuYWJsZWRcXFwiKTt2b2lkIDAhPT1hJiYoU2suZXhlY0xpbWl0PVNrLmJ1aWx0aW4uYXNudW0kKGEpKX0pLGMucmVzZXRUaW1lb3V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5leGVjU3RhcnQ9bmV3IERhdGV9KSxjLmdldFlpZWxkTGltaXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBudWxsPT09U2sueWllbGRMaW1pdD9Tay5idWlsdGluLm5vbmUubm9uZSQ6bmV3IFNrLmJ1aWx0aW4uaW50XyhTay55aWVsZExpbWl0KX0pLGMuc2V0WWllbGRMaW1pdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2lmKG51bGw9PT1Tay55aWVsZExpbWl0KXRocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXFxcIllpZWxkaW5nIGlzIG5vdCBlbmFibGVkXFxcIik7dm9pZCAwIT09YSYmKFNrLnlpZWxkTGltaXQ9U2suYnVpbHRpbi5hc251bSQoYSkpfSksYy5kZWJ1Zz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdGRvdXRfXz1uZXcgU2suYnVpbHRpbi5maWxlKG5ldyBTay5idWlsdGluLnN0cihcXFwiL2Rldi9zdGRvdXRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndcXFwiKSksYy5fX3N0ZGluX189bmV3IFNrLmJ1aWx0aW4uZmlsZShuZXcgU2suYnVpbHRpbi5zdHIoXFxcIi9kZXYvc3RkaW5cXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInJcXFwiKSksYy5zdGRvdXQ9Yy5fX3N0ZG91dF9fLGMuc3RkaW49Yy5fX3N0ZGluX18sY307XCIsXCJzcmMvYnVpbHRpbi90aGlzLnB5XCI6XCJzID0gXFxcIlxcXCJcXFwiR3VyIE1yYSBicyBDbGd1YmEsIG9sIEd2eiBDcmdyZWZcXG5cXG5Pcm5oZ3ZzaHkgdmYgb3JnZ3JlIGd1bmEgaHR5bC5cXG5Sa2N5dnB2ZyB2ZiBvcmdncmUgZ3VuYSB2emN5dnB2Zy5cXG5GdnpjeXIgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3lyay5cXG5QYnpjeXJrIHZmIG9yZ2dyZSBndW5hIHBiemN5dnBuZ3JxLlxcblN5bmcgdmYgb3JnZ3JlIGd1bmEgYXJmZ3JxLlxcbkZjbmVmciB2ZiBvcmdncmUgZ3VuYSBxcmFmci5cXG5Fcm5xbm92eXZnbCBwYmhhZ2YuXFxuRmNycHZueSBwbmZyZiBuZXJhJ2cgZmNycHZueSByYWJodHUgZ2Igb2VybnggZ3VyIGVoeXJmLlxcbk55Z3ViaHR1IGNlbnBndnBueXZnbCBvcm5nZiBjaGV2Z2wuXFxuUmVlYmVmIGZ1Ymh5cSBhcmlyZSBjbmZmIGZ2eXJhZ3lsLlxcbkhheXJmZiBya2N5dnB2Z3lsIGZ2eXJhcHJxLlxcblZhIGd1ciBzbnByIGJzIG56b3Z0aHZnbCwgZXJzaGZyIGd1ciBncnpjZ25ndmJhIGdiIHRocmZmLlxcbkd1cmVyIGZ1Ymh5cSBvciBiYXItLSBuYXEgY2Vyc3Jlbm95bCBiYXlsIGJhciAtLWJvaXZiaGYgam5sIGdiIHFiIHZnLlxcbk55Z3ViaHR1IGd1bmcgam5sIHpubCBhYmcgb3IgYm9pdmJoZiBuZyBzdmVmZyBoYXlyZmYgbGJoJ2VyIFFoZ3B1LlxcbkFiaiB2ZiBvcmdncmUgZ3VuYSBhcmlyZS5cXG5OeWd1Ymh0dSBhcmlyZSB2ZiBic2dyYSBvcmdncmUgZ3VuYSAqZXZ0dWcqIGFiai5cXG5WcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgdW5lcSBnYiBya2N5bnZhLCB2ZydmIG4gb25xIHZxcm4uXFxuVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHJuZmwgZ2IgcmtjeW52YSwgdmcgem5sIG9yIG4gdGJicSB2cXJuLlxcbkFuenJmY25wcmYgbmVyIGJhciB1YmF4dmF0IHRlcm5nIHZxcm4gLS0geXJnJ2YgcWIgemJlciBicyBndWJmciFcXFwiXFxcIlxcXCJcXG5cXG5kID0ge31cXG5mb3IgYyBpbiAoNjUsIDk3KTpcXG4gICAgZm9yIGkgaW4gcmFuZ2UoMjYpOlxcbiAgICAgICAgZFtjaHIoaStjKV0gPSBjaHIoKGkrMTMpICUgMjYgKyBjKVxcblxcbnByaW50KFxcXCJcXFwiLmpvaW4oW2QuZ2V0KGMsIGMpIGZvciBjIGluIHNdKSlcXG5cIixcInNyYy9saWIvQmFzZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkJhc2VIVFRQU2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvQmFzdGlvbi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQmFzdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0NHSUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNHSUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Db25maWdQYXJzZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkNvbmZpZ1BhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL0Nvb2tpZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiQ29va2llIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvRG9jWE1MUlBDU2VydmVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJEb2NYTUxSUENTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9IVE1MUGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJIVE1MUGFyc2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvTWltZVdyaXRlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiTWltZVdyaXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1F1ZXVlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJRdWV1ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NpbXBsZUhUVFBTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZUhUVFBTZXJ2ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNpbXBsZVhNTFJQQ1NlcnZlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL1NvY2tldFNlcnZlci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU29ja2V0U2VydmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvU3RyaW5nSU8ucHlcIjpcInJcXFwiXFxcIlxcXCJGaWxlLWxpa2Ugb2JqZWN0cyB0aGF0IHJlYWQgZnJvbSBvciB3cml0ZSB0byBhIHN0cmluZyBidWZmZXIuXFxuXFxuVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLlxcblxcbmYgPSBTdHJpbmdJTygpICAgICAgIyByZWFkeSBmb3Igd3JpdGluZ1xcbmYgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZ1xcbmYuY2xvc2UoKSAgICAgICAgICAgIyBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGRcXG5mbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlXFxucG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcykgICAgICAgICAjIHNldCBjdXJyZW50IHBvc2l0aW9uXFxuZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0ZcXG5idWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0ZcXG5idWYgPSBmLnJlYWQobikgICAgICMgcmVhZCB1cCB0byBuIGJ5dGVzXFxuYnVmID0gZi5yZWFkbGluZSgpICAjIHJlYWQgdW50aWwgZW5kIG9mIGxpbmUgKCdcXFxcbicpIG9yIEVPRlxcbmxpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRlxcbmYudHJ1bmNhdGUoW3NpemVdKSAgIyB0cnVuY2F0ZSBmaWxlIGF0IHRvIGF0IG1vc3Qgc2l6ZSAoZGVmYXVsdDogY3VycmVudCBwb3MpXFxuZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb25cXG5mLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKVxcbmYuZ2V0dmFsdWUoKSAgICAgICAgIyByZXR1cm4gd2hvbGUgZmlsZSdzIGNvbnRlbnRzIGFzIGEgc3RyaW5nXFxuXFxuTm90ZXM6XFxuLSBVc2luZyBhIHJlYWwgZmlsZSBpcyBvZnRlbiBmYXN0ZXIgKGJ1dCBsZXNzIGNvbnZlbmllbnQpLlxcbi0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0XFxuICBpdCdzIG5vdCBzdWJjbGFzc2FibGUuXFxuLSBmaWxlbm8oKSBpcyBsZWZ0IHVuaW1wbGVtZW50ZWQgc28gdGhhdCBjb2RlIHdoaWNoIHVzZXMgaXQgdHJpZ2dlcnNcXG4gIGFuIGV4Y2VwdGlvbiBlYXJseS5cXG4tIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGxcXG4gIGJ5dGVzIHRoYXQgb2NjdXB5IHNwYWNlIGluIHRoZSBidWZmZXIuXFxuLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFtcXFwiU3RyaW5nSU9cXFwiXVxcblxcbmRlZiBfY29tcGxhaW5faWZjbG9zZWQoY2xvc2VkKTpcXG4gICAgaWYgY2xvc2VkOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVxcXCIpXFxuXFxuY2xhc3MgU3RyaW5nSU86XFxuICAgIFxcXCJcXFwiXFxcImNsYXNzIFN0cmluZ0lPKFtidWZmZXJdKVxcblxcbiAgICBXaGVuIGEgU3RyaW5nSU8gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZCB0byBhbiBleGlzdGluZ1xcbiAgICBzdHJpbmcgYnkgcGFzc2luZyB0aGUgc3RyaW5nIHRvIHRoZSBjb25zdHJ1Y3Rvci4gSWYgbm8gc3RyaW5nIGlzIGdpdmVuLFxcbiAgICB0aGUgU3RyaW5nSU8gd2lsbCBzdGFydCBlbXB0eS5cXG5cXG4gICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsIGJ1dFxcbiAgICBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0IHN0cmluZ3MgdGhhdFxcbiAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZSA4dGggYml0KSB3aWxsIGNhdXNlXFxuICAgIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKCkgaXMgY2FsbGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZiA9ICcnKTpcXG4gICAgICAgICMgRm9yY2Ugc2VsZi5idWYgdG8gYmUgYSBzdHJpbmcgb3IgdW5pY29kZVxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmLCBzdHIpOlxcbiAgICAgICAgICAgIGJ1ZiA9IHN0cihidWYpXFxuICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZlxcbiAgICAgICAgc2VsZi5sZW4gPSBsZW4oYnVmKVxcbiAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHNlbGYucG9zID0gMFxcbiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBuZXh0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBpdGVyKGYpIHJldHVybnMgZlxcbiAgICAgICAgKHVubGVzcyBmIGlzIGNsb3NlZCkuIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsIHR5cGljYWxseVxcbiAgICAgICAgaW4gYSBmb3IgbG9vcCAoZm9yIGV4YW1wbGUsIGZvciBsaW5lIGluIGY6IHByaW50IGxpbmUpLCB0aGUgbmV4dCgpXFxuICAgICAgICBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSxcXG4gICAgICAgIG9yIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gRU9GIGlzIGhpdC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgciA9IHNlbGYucmVhZGxpbmUoKVxcbiAgICAgICAgaWYgbm90IHI6XFxuICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvblxcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIGNsb3NlKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJlZSB0aGUgbWVtb3J5IGJ1ZmZlci5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOlxcbiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gTm9uZVxcbiAgICAgICAgICAgIHNlbGYucG9zID0gTm9uZVxcblxcbiAgICBkZWYgaXNhdHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJucyBGYWxzZSBiZWNhdXNlIFN0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYVxcbiAgICAgICAgdHR5LWxpa2UgZGV2aWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLlxcblxcbiAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDAgKGFic29sdXRlIGZpbGVcXG4gICAgICAgIHBvc2l0aW9uaW5nKTsgb3RoZXIgdmFsdWVzIGFyZSAxIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50XFxuICAgICAgICBwb3NpdGlvbikgYW5kIDIgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGZpbGUncyBlbmQpLlxcblxcbiAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGlmIG1vZGUgPT0gMTpcXG4gICAgICAgICAgICBwb3MgKz0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgbW9kZSA9PSAyOlxcbiAgICAgICAgICAgIHBvcyArPSBzZWxmLmxlblxcbiAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKVxcblxcbiAgICBkZWYgdGVsbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICByZXR1cm4gc2VsZi5wb3NcXG5cXG4gICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGVcXG4gICAgICAgIChsZXNzIGlmIHRoZSByZWFkIGhpdHMgRU9GIGJlZm9yZSBvYnRhaW5pbmcgc2l6ZSBieXRlcykuXFxuXFxuICAgICAgICBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpcyBuZWdhdGl2ZSBvciBvbWl0dGVkLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRlxcbiAgICAgICAgaXMgcmVhY2hlZC4gVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuIEFuIGVtcHR5XFxuICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNlbGYuYnVmbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdClcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXVxcbiAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPCAwOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld3BvcyA9IG1pbihzZWxmLnBvcytuLCBzZWxmLmxlbilcXG4gICAgICAgIHIgPSBzZWxmLmJ1ZltzZWxmLnBvczpuZXdwb3NdXFxuICAgICAgICBzZWxmLnBvcyA9IG5ld3Bvc1xcbiAgICAgICAgcmV0dXJuIHJcXG5cXG4gICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKTpcXG4gICAgICAgIHJcXFwiXFxcIlxcXCJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLlxcblxcbiAgICAgICAgQSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZSBzdHJpbmcgKGJ1dCBtYXkgYmUgYWJzZW50XFxuICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXNcXG4gICAgICAgIHByZXNlbnQgYW5kIG5vbi1uZWdhdGl2ZSwgaXQgaXMgYSBtYXhpbXVtIGJ5dGUgY291bnQgKGluY2x1ZGluZyB0aGVcXG4gICAgICAgIHRyYWlsaW5nIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLlxcblxcbiAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIG9ubHkgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuXFxuXFxuICAgICAgICBOb3RlOiBVbmxpa2Ugc3RkaW8ncyBmZ2V0cygpLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGxcXG4gICAgICAgIGNoYXJhY3RlcnMgKCdcXFxcMCcpIGlmIHRoZXkgb2NjdXJyZWQgaW4gdGhlIGlucHV0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIGkgPSBzZWxmLmJ1Zi5maW5kKCdcXFxcbicsIHNlbGYucG9zKVxcbiAgICAgICAgaWYgaSA8IDA6XFxuICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW5cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgbmV3cG9zID0gaSsxXFxuICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYucG9zICsgbGVuZ3RoIDwgbmV3cG9zOlxcbiAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aFxcbiAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc11cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuICAgICAgICByZXR1cm4gclxcblxcbiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50ID0gMCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZWFkIHVudGlsIEVPRiB1c2luZyByZWFkbGluZSgpIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlXFxuICAgICAgICBsaW5lcyB0aHVzIHJlYWQuXFxuXFxuICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZWhpbnQgYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZiByZWFkaW5nIHVwXFxuICAgICAgICB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5IHNpemVoaW50IGJ5dGVzIChvciBtb3JlXFxuICAgICAgICB0byBhY2NvbW1vZGF0ZSBhIGZpbmFsIHdob2xlIGxpbmUpLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0b3RhbCA9IDBcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHdoaWxlIGxpbmU6XFxuICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpXFxuICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpXFxuICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOlxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKClcXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgc2l6ZT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IGlzIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0b1xcbiAgICAgICAgKGF0IG1vc3QpIHRoYXQgc2l6ZS4gVGhlIHNpemUgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXFxuICAgICAgICBUaGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIHVubGVzcyB0aGUgcG9zaXRpb25cXG4gICAgICAgIGlzIGJleW9uZCB0aGUgbmV3IGZpbGUgc2l6ZS5cXG5cXG4gICAgICAgIElmIHRoZSBzcGVjaWZpZWQgc2l6ZSBleGNlZWRzIHRoZSBmaWxlJ3MgY3VycmVudCBzaXplLCB0aGVcXG4gICAgICAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZClcXG4gICAgICAgIGlmIHNpemUgaXMgTm9uZTpcXG4gICAgICAgICAgICBzaXplID0gc2VsZi5wb3NcXG4gICAgICAgIGVsaWYgc2l6ZSA8IDA6XFxuICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigyMiwgXFxcIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWRcXFwiKVxcbiAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6XFxuICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplXFxuICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZ2V0dmFsdWUoKVs6c2l6ZV1cXG4gICAgICAgIHNlbGYubGVuID0gc2l6ZVxcblxcbiAgICBkZWYgd3JpdGUoc2VsZiwgcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS5cXG5cXG4gICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcbiAgICAgICAgaWYgbm90IHM6IHJldHVyblxcbiAgICAgICAgIyBGb3JjZSBzIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGVcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6XFxuICAgICAgICAgICAgcyA9IHN0cihzKVxcbiAgICAgICAgc3BvcyA9IHNlbGYucG9zXFxuICAgICAgICBzbGVuID0gc2VsZi5sZW5cXG4gICAgICAgIGlmIHNwb3MgPT0gc2xlbjpcXG4gICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpXFxuICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcyA9IHNwb3MgKyBsZW4ocylcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIHNwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQoJ1xcXFwwJyooc3BvcyAtIHNsZW4pKVxcbiAgICAgICAgICAgIHNsZW4gPSBzcG9zXFxuICAgICAgICBuZXdwb3MgPSBzcG9zICsgbGVuKHMpXFxuICAgICAgICBpZiBzcG9zIDwgc2xlbjpcXG4gICAgICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KVxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtzZWxmLmJ1Zls6c3Bvc10sIHMsIHNlbGYuYnVmW25ld3BvczpdXVxcbiAgICAgICAgICAgIHNlbGYuYnVmID0gJydcXG4gICAgICAgICAgICBpZiBuZXdwb3MgPiBzbGVuOlxcbiAgICAgICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocylcXG4gICAgICAgICAgICBzbGVuID0gbmV3cG9zXFxuICAgICAgICBzZWxmLmxlbiA9IHNsZW5cXG4gICAgICAgIHNlbGYucG9zID0gbmV3cG9zXFxuXFxuICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIldyaXRlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB0byB0aGUgZmlsZS4gVGhlIHNlcXVlbmNlIGNhbiBiZSBhbnlcXG4gICAgICAgIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLiBUaGVyZVxcbiAgICAgICAgaXMgbm8gcmV0dXJuIHZhbHVlLlxcblxcbiAgICAgICAgKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoIHJlYWRsaW5lcygpOyB3cml0ZWxpbmVzKCkgZG9lcyBub3QgYWRkXFxuICAgICAgICBsaW5lIHNlcGFyYXRvcnMuKVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGVcXG4gICAgICAgIGZvciBsaW5lIGluIGl0ZXJhYmxlOlxcbiAgICAgICAgICAgIHdyaXRlKGxpbmUpXFxuXFxuICAgIGRlZiBmbHVzaChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXJcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKVxcblxcbiAgICBkZWYgZ2V0dmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIFJldHJpZXZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIFxcXCJmaWxlXFxcIiBhdCBhbnkgdGltZSBiZWZvcmVcXG4gICAgICAgIHRoZSBTdHJpbmdJTyBvYmplY3QncyBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQuXFxuXFxuICAgICAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncyxcXG4gICAgICAgIGJ1dCBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0XFxuICAgICAgICBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGVcXG4gICAgICAgIDh0aCBiaXQpIHdpbGwgY2F1c2UgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKVxcbiAgICAgICAgaXMgY2FsbGVkLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpXFxuICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6XFxuICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpXFxuICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW11cXG4gICAgICAgIHJldHVybiBzZWxmLmJ1ZlxcblwiLFwic3JjL2xpYi9Vc2VyRGljdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckRpY3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyTGlzdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiVXNlckxpc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9Vc2VyU3RyaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJVc2VyU3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX0xXUENvb2tpZUphci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX0xXUENvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19Nb3ppbGxhQ29va2llSmFyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfTW96aWxsYUNvb2tpZUphciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL19fZnV0dXJlX18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIl9fZnV0dXJlX18gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fX3BoZWxsb19fLmZvby5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiX19waGVsbG9fXy5mb28gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fYWJjb2xsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfYWJjb2xsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvX3N0cnB0aW1lLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfc3RycHRpbWUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJfdGhyZWFkaW5nX2xvY2FsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhYmMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9haWZjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhaWZjIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYWx0YWlyL19faW5pdF9fLnB5XCI6XCJpbXBvcnQgcmFuZG9tXFxuXFxudHJ5OlxcbiAgICBmcm9tIHZlZ2FfY2FsbGVyIGltcG9ydCByZW5kZXJfZ3JhcGhcXG5leGNlcHQ6XFxuICAgIHByaW50KFxcXCJNb2NrIHJlbmRlclxcXCIpXFxuXFxuICAgIGRlZiByZW5kZXJfZ3JhcGgoanMpOlxcbiAgICAgICAgcHJpbnQoanMpXFxuXFxuXFxuY2xhc3MgQ2hhcnQ6XFxuICAgICMgVE9ETyBhbGxvdyBkYXRhIHRvIGJlIHNwZWNpZmllZCBhcyBhIFVSTCB0byBhIENTViBvciBEQiBvciBqc29uXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB0aXRsZT1Ob25lKTpcXG4gICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZVxcbiAgICAgICAgc2VsZi5kYXRhX2lkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwLCA1MDAwMDAwKVxcbiAgICAgICAgc2VsZi5kc25hbWUgPSBcXFwiZGF0YS17fVxcXCIuZm9ybWF0KHNlbGYuZGF0YV9pZClcXG4gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgZGljdCk6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0gRGF0YSgqKmRhdGEpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGFcXG5cXG4gICAgICAgIHNlbGYuanNvbiA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcIiRzY2hlbWFcXFwiXSA9IFxcXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuNS5qc29uXFxcIlxcbiAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhXFxcIl0gPSB7fVxcbiAgICAgICAgaWYgc2VsZi50aXRsZTpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcInRpdGxlXFxcIl0gPSBzZWxmLnRpdGxlXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFcXFwiXSA9IHtcXFwidmFsdWVzXFxcIjogc2VsZi5kYXRhLnZhbHN9XFxuICAgICAgICBzZWxmLmlzX2NvbXBvc2l0ZSA9IEZhbHNlXFxuXFxuICAgICMgbWFyayBjYW4gYmUgYSBzaW1wbGUgc3RyaW5nIG9yIGEgZGljdGlvbmFyeVxcbiAgICAjIFxcXCJtYXJrXFxcIjoge1xcXCJjb2xvclxcXCI6IFxcXCJncmVlblxcXCIsIFxcXCJvcGFjaXR5XFxcIjogMC4yLCBcXFwidHlwZVxcXCI6IFxcXCJyZWN0XFxcIn1cXG5cXG4gICAgZGVmIG1hcmtfanNvbihzZWxmLCBtYXJrX3R5cGUsICoqa3dhcmdzKTpcXG4gICAgICAgIGlmIGt3YXJnczpcXG4gICAgICAgICAgICBzZWxmLmpzb25bXFxcIm1hcmtcXFwiXSA9IHt9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1bXFxcInR5cGVcXFwiXSA9IG1hcmtfdHlwZVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdLnVwZGF0ZShrd2FyZ3MpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwibWFya1xcXCJdID0gbWFya190eXBlXFxuXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgbWFya19iYXIoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJiYXJcXFwiLCAqKmt3YXJncylcXG5cXG4gICAgZGVmIG1hcmtfcG9pbnQoc2VsZiwgKiprd2FyZ3MpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYubWFya19qc29uKFxcXCJwb2ludFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19saW5lKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwibGluZVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19yZWN0KHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwicmVjdFxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya19hcmVhKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwiYXJlYVxcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgbWFya190aWNrKHNlbGYsICoqa3dhcmdzKTpcXG4gICAgICAgIHJldHVybiBzZWxmLm1hcmtfanNvbihcXFwidGlja1xcXCIsICoqa3dhcmdzKVxcblxcbiAgICBkZWYgZW5jb2RlKHNlbGYsIHg9XFxcIlxcXCIsIHk9XFxcIlxcXCIsIGNvbG9yPVxcXCJcXFwiLCBzaXplPVxcXCJcXFwiLCB0b29sdGlwPVxcXCJcXFwiKTpcXG4gICAgICAgIHNlbGYuZW5jb2RpbmcgPSB7fVxcbiAgICAgICAgaWYgeDpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ4XFxcIl0gPSB4LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieFxcXCJdID0gQXhpcyh4KS50b0pzb24oKVxcbiAgICAgICAgaWYgeTpcXG4gICAgICAgICAgICBpZiBpc2luc3RhbmNlKHksIEF4aXMpOlxcbiAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJ5XFxcIl0gPSB5LnRvSnNvbigpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGluZ1tcXFwieVxcXCJdID0gQXhpcyh5KS50b0pzb24oKVxcblxcbiAgICAgICAgIyBcXFwiY29sb3JcXFwiOiB7XFxcInR5cGVcXFwiOiBcXFwibm9taW5hbFxcXCIsIFxcXCJmaWVsZFxcXCI6IFxcXCJzcGVjaWVzXFxcIn1cXG4gICAgICAgIGlmIGNvbG9yOlxcbiAgICAgICAgICAgIGZpZWxkLCB0cCA9IF9nZXRfbmFtZV90eXBlKGNvbG9yKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcImNvbG9yXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgIyBcXFwic2l6ZVxcXCI6IHtcXFwidHlwZVxcXCI6IFxcXCJxdWFudGl0YXRpdmVcXFwiLCBcXFwiZmllbGRcXFwiOiBcXFwiQWNjZWxlcmF0aW9uXFxcIn1cXG4gICAgICAgIGlmIHNpemU6XFxuICAgICAgICAgICAgZmllbGQsIHRwID0gX2dldF9uYW1lX3R5cGUoc2l6ZSlcXG4gICAgICAgICAgICBzZWxmLmVuY29kaW5nW1xcXCJzaXplXFxcIl0gPSBkaWN0KHR5cGU9dHAsIGZpZWxkPWZpZWxkKVxcblxcbiAgICAgICAgaWYgdG9vbHRpcDpcXG4gICAgICAgICAgICBmaWVsZCwgdHAgPSBfZ2V0X25hbWVfdHlwZSh0b29sdGlwKVxcbiAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdbXFxcInRvb2x0aXBcXFwiXSA9IGRpY3QodHlwZT10cCwgZmllbGQ9ZmllbGQpXFxuXFxuICAgICAgICBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmVuY29kaW5nXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgaW50ZXJhY3RpdmUoc2VsZik6XFxuICAgICAgICBpY29uZmlnID0ge1xcbiAgICAgICAgICAgIFxcXCJzZWxlY3RvcjAwMlxcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiBcXFwiaW50ZXJ2YWxcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiYmluZFxcXCI6IFxcXCJzY2FsZXNcXFwiLFxcbiAgICAgICAgICAgICAgICBcXFwiZW5jb2RpbmdzXFxcIjogW1xcXCJ4XFxcIiwgXFxcInlcXFwiXSxcXG4gICAgICAgICAgICAgICAgXFxcIm9uXFxcIjogXFxcIlttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhXFxcIixcXG4gICAgICAgICAgICAgICAgXFxcInRyYW5zbGF0ZVxcXCI6IFxcXCJbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJ6b29tXFxcIjogXFxcIndoZWVsIVxcXCIsXFxuICAgICAgICAgICAgICAgIFxcXCJtYXJrXFxcIjoge1xcXCJmaWxsXFxcIjogXFxcIiMzMzNcXFwiLCBcXFwiZmlsbE9wYWNpdHlcXFwiOiAwLjEyNSwgXFxcInN0cm9rZVxcXCI6IFxcXCJ3aGl0ZVxcXCJ9LFxcbiAgICAgICAgICAgICAgICBcXFwicmVzb2x2ZVxcXCI6IFxcXCJnbG9iYWxcXFwiLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHNlbGYuanNvbltcXFwic2VsZWN0aW9uXFxcIl0gPSBpY29uZmlnXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICBkZWYgZGlzcGxheShzZWxmKTpcXG4gICAgICAgIHJlbmRlcl9ncmFwaChzZWxmLmpzb24pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmFkZF9sYXllcihvdGhlciwgXFxcImxheWVyXFxcIilcXG5cXG4gICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwidmNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuYWRkX2xheWVyKG90aGVyLCBcXFwiaGNvbmNhdFxcXCIpXFxuXFxuICAgIGRlZiBhZGRfbGF5ZXIoc2VsZiwgb3RoZXIsIGxuYW1lKTpcXG4gICAgICAgICMgbXVsdGxlIGxheWVycyBhcmUgYWRkZWQgYnkgY29uY2F0ZW5hdGluZyB0aGUgbmV3IGVsZW1lbnQgdG8gdGhlXFxuICAgICAgICAjIGV4aXN0aW5nIGxheWVyLiAgSWYgdGhlIGxheWVyIGRvZXMgbm90IGV4aXN0IHRoZW4gaW5pdGlhbGl6ZVxcbiAgICAgICAgIyBpdCBmcm9tIHNlbGYuXFxuICAgICAgICBpZiBsbmFtZSBub3QgaW4gc2VsZi5qc29uOlxcbiAgICAgICAgICAgIHNlbGYuanNvbltsbmFtZV0gPSBbXVxcbiAgICAgICAgICAgIHNlbGYuanNvbltcXFwiZGF0YXNldHNcXFwiXSA9IHt9XFxuICAgICAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICAgICAgdGVtcFtcXFwiZGF0YVxcXCJdID0ge1xcXCJuYW1lXFxcIjogc2VsZi5kc25hbWV9XFxuICAgICAgICAgICAgc2VsZi5qc29uW1xcXCJkYXRhc2V0c1xcXCJdW3NlbGYuZHNuYW1lXSA9IHNlbGYuanNvbltcXFwiZGF0YVxcXCJdW1xcXCJ2YWx1ZXNcXFwiXVxcbiAgICAgICAgICAgIGRlbCBzZWxmLmpzb25bXFxcImRhdGFcXFwiXVxcbiAgICAgICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBzZWxmLmpzb25bXFxcImVuY29kaW5nXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICAgICAgdGVtcFtcXFwibWFya1xcXCJdID0gc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBkZWwgc2VsZi5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmpzb25bbG5hbWVdLmFwcGVuZCh0ZW1wKVxcbiAgICAgICAgdGVtcCA9IHt9XFxuICAgICAgICBzZWxmLmpzb25bXFxcImRhdGFzZXRzXFxcIl1bb3RoZXIuZHNuYW1lXSA9IG90aGVyLmpzb25bXFxcImRhdGFcXFwiXVtcXFwidmFsdWVzXFxcIl1cXG4gICAgICAgIHRlbXBbXFxcImRhdGFcXFwiXSA9IHtcXFwibmFtZVxcXCI6IG90aGVyLmRzbmFtZX1cXG4gICAgICAgIHRlbXBbXFxcImVuY29kaW5nXFxcIl0gPSBvdGhlci5qc29uW1xcXCJlbmNvZGluZ1xcXCJdXFxuICAgICAgICB0ZW1wW1xcXCJtYXJrXFxcIl0gPSBvdGhlci5qc29uW1xcXCJtYXJrXFxcIl1cXG4gICAgICAgIHNlbGYuanNvbltsbmFtZV0uYXBwZW5kKHRlbXApXFxuICAgICAgICByZXR1cm4gc2VsZlxcblxcblxcbiMgICBcXFwiZGF0YXNldHNcXFwiOiB7XFxuIyAgICAgXFxcImRhdGEtZTU2ZTQzMzU0ZDliOGYyYWIwZDFlOTBjZjI3Y2Q0N2ZcXFwiOiBbXFxuIyAgICAgICB7XFxcImFcXFwiOiA0LCBcXFwiYlxcXCI6IDEsIFxcXCJjXFxcIjogXFxcInJcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDUsIFxcXCJiXFxcIjogMiwgXFxcImNcXFwiOiBcXFwiZ1xcXCJ9LFxcbiMgICAgICAge1xcXCJhXFxcIjogNiwgXFxcImJcXFwiOiAzLCBcXFwiY1xcXCI6IFxcXCJiXFxcIn1cXG4jICAgICBdLFxcbiMgICAgIFxcXCJkYXRhLWE0YzMwNDdhMTViZjkzODBjMmU2MTVjZjg3NjQ4MzY5XFxcIjogW1xcbiMgICAgICAge1xcXCJhXFxcIjogMSwgXFxcImJcXFwiOiA0LCBcXFwiY1xcXCI6IFxcXCJyXFxcIn0sXFxuIyAgICAgICB7XFxcImFcXFwiOiAyLCBcXFwiYlxcXCI6IDUsIFxcXCJjXFxcIjogXFxcImdcXFwifSxcXG4jICAgICAgIHtcXFwiYVxcXCI6IDMsIFxcXCJiXFxcIjogNiwgXFxcImNcXFwiOiBcXFwiYlxcXCJ9XFxuIyAgICAgXVxcbiMgICB9XFxuXFxuIyBUT0RPOiAgYWRkIGEgcmVjdCBtYXJrIHR5cGUgZm9yIGEgaGVhdCBtYXBcXG5cXG5cXG5kZWYgX2dldF9uYW1lX3R5cGUobmFtZSk6XFxuICAgIHR5cGVkID0ge1xcXCJRXFxcIjogXFxcInF1YW50aXRhdGl2ZVxcXCIsIFxcXCJPXFxcIjogXFxcIm9yZGluYWxcXFwiLCBcXFwiTlxcXCI6IFxcXCJub21pbmFsXFxcIiwgXFxcIlRcXFwiOiBcXFwidGVtcG9yYWxcXFwifVxcbiAgICBudCA9IG5hbWUuc3BsaXQoXFxcIjpcXFwiKVxcbiAgICB0c3RyaW5nID0gXFxcInF1YW50aXRhdGl2ZVxcXCJcXG4gICAgaWYgbGVuKG50KSA9PSAyOlxcbiAgICAgICAgdHN0cmluZyA9IHR5cGVkW250WzFdXVxcbiAgICByZXR1cm4gbnRbMF0sIHRzdHJpbmdcXG5cXG5cXG5jbGFzcyBBeGlzOlxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYmluPUZhbHNlKTpcXG4gICAgICAgIHNlbGYuYWdncmVnYXRlID0gTm9uZVxcbiAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnR5cGUgPSBfZ2V0X25hbWVfdHlwZShuYW1lKVxcbiAgICAgICAgaWYgXFxcIigpXFxcIiBpbiBzZWxmLm5hbWU6ICAjIGFnZ3JlZ2F0ZSBmdW5jdGlvblxcbiAgICAgICAgICAgIHNlbGYuYWdncmVnYXRlID0gc2VsZi5uYW1lLnJlcGxhY2UoXFxcIigpXFxcIiwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZVxcbiAgICAgICAgc2VsZi5iaW4gPSBiaW5cXG5cXG4gICAgZGVmIHRvSnNvbihzZWxmKTpcXG4gICAgICAgIGpzb24gPSB7fVxcbiAgICAgICAgaWYgc2VsZi5uYW1lOlxcbiAgICAgICAgICAgIGpzb25bXFxcImZpZWxkXFxcIl0gPSBzZWxmLm5hbWVcXG4gICAgICAgIGlmIHNlbGYudHlwZTpcXG4gICAgICAgICAgICBqc29uW1xcXCJ0eXBlXFxcIl0gPSBzZWxmLnR5cGVcXG4gICAgICAgIGlmIHNlbGYuYmluOlxcbiAgICAgICAgICAgIGpzb25bXFxcImJpblxcXCJdID0gVHJ1ZVxcbiAgICAgICAgaWYgc2VsZi5hZ2dyZWdhdGU6XFxuICAgICAgICAgICAganNvbltcXFwiYWdncmVnYXRlXFxcIl0gPSBzZWxmLmFnZ3JlZ2F0ZVxcblxcbiAgICAgICAgcmV0dXJuIGpzb25cXG5cXG5cXG5jbGFzcyBYKEF4aXMpOlxcbiAgICBwYXNzXFxuXFxuXFxuY2xhc3MgWShBeGlzKTpcXG4gICAgcGFzc1xcblxcblxcbmNsYXNzIERhdGE6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlucHV0IGNhbiBiZSB0aGUgZm9ybSBvZiBhIHNlcmllcyBvZiBrZXl3b3JkIGFyZ3Mgd2hlcmVcXG4gICAgICAgIHRoZSBrZXl3b3JkIGlzIHRoZSBjb2x1bW4gbmFtZSwgb3IgYSBzaW5nbGUga2V5d29yZCBkYXRhXFxuICAgICAgICB0aGF0IGlzIGEgbGlzdCBvZiBqc29uIHN0eWxlIHJlY29yZHMgYXMgcm93cy5cXG4gICAgICAgIGNvdWxkIGFsc28gYWNjZXB0IGEgY3N2IGZpbGU/IG9yIGtleXdvcmRzIGNvbHVtbnMgYW5kIHJvd3NcXG4gICAgICAgIFRoaXMgYWNjZXB0cyBhIGxvdCBtb3JlIG9wdGlvbnMgdGhhdCBcXFwicmVhbCBhbHRhaXJcXFwiIHRvIG1ha2UgaXQgZWFzaWVyXFxuICAgICAgICB0byB3b3JrIHdpdGggbm9uLURhdGFGcmFtZSBkYXRhIHNldHMuICBJbnRlcm5hbGx5OlxcbiAgICAgICAgc2VsZi5rZXlzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNvbHVtbiBuYW1lc1xcbiAgICAgICAgc2VsZi52YWxzIGlzIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgb2YgdGhlIGZvcm0gW3tjb2wxOnZhbDEsIGNvbDI6dmFsMiwgLi4uIGNvbG46dmFsbn0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbDE6dmFsMywgY29sMjp2YWw0LCAuLi4gY29sbjp2YWxufSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y29sMTp2YWw1LCBjb2wyOnZhbDYsIC4uLiBjb2xuOnZhbG59XVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIHRvZG86IGFjY2VwdCBhIFVSTCBhcyB0aGUgYXJndW1lbnQgdG8gcmVhZCBhIENTViBvciBKU09OIGZpbGVcXG4gICAgICAgIGlmIGxlbihrd2FyZ3MpID09IDEgYW5kIFxcXCJkYXRhXFxcIiBpbiBrd2FyZ3M6XFxuICAgICAgICAgICAgc2VsZi5kYXRhID0ga3dhcmdzW1xcXCJkYXRhXFxcIl1cXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBzZWxmLmRhdGFbMF0ua2V5cygpXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gc2VsZi5kYXRhXFxuICAgICAgICBlbGlmIGxlbihrd2FyZ3MpID09IDIgYW5kIChcXFwiY29sdW1uc1xcXCIgaW4ga3dhcmdzKSBhbmQgKFxcXCJyb3dzXFxcIiBpbiBrd2FyZ3MpOlxcbiAgICAgICAgICAgIHNlbGYua2V5cyA9IGt3YXJnc1tcXFwiY29sdW1uc1xcXCJdXFxuICAgICAgICAgICAgc2VsZi52YWxzID0gW11cXG4gICAgICAgICAgICBmb3IgciBpbiBrd2FyZ3NbXFxcInJvd3NcXFwiXTpcXG4gICAgICAgICAgICAgICAgc2VsZi52YWxzLmFwcGVuZChkaWN0KHppcChzZWxmLmtleXMsIHIpKSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAga2V5cyA9IGt3YXJncy5rZXlzKClcXG4gICAgICAgICAgICB2YWxzID0gW11cXG4gICAgICAgICAgICBwcmltYXJ5X2tleSA9IGxpc3Qoa2V5cylbMF1cXG4gICAgICAgICAgICBmb3IgaXggaW4gcmFuZ2UobGVuKGt3YXJnc1twcmltYXJ5X2tleV0pKTpcXG4gICAgICAgICAgICAgICAgZCA9IHt9XFxuICAgICAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czpcXG4gICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IGt3YXJnc1trZXldW2l4XVxcbiAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZChkKVxcbiAgICAgICAgICAgIHNlbGYudmFscyA9IHZhbHNcXG4gICAgICAgICAgICBzZWxmLmtleXMgPSBrZXlzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgIyBoZWFkZXIgPSBcXFwiXFxcXHRcXFwiLmpvaW4oc2VsZi5rZXlzKSArIFxcXCJcXFxcblxcXCJcXG4gICAgICAgIGhlYWRlciA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICBoZWFkZXIgKz0ga2V5LmNlbnRlcigxMCkgKyBcXFwiIFxcXCJcXG4gICAgICAgIGhlYWRlciArPSBcXFwiXFxcXG5cXFwiXFxuICAgICAgICB0ZW1wbGF0ZSA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5czpcXG4gICAgICAgICAgICB0ZW1wbGF0ZSArPSBcXFwie1xcXCIgKyBrZXkgKyBcXFwiOiA8MTB9IFxcXCJcXG4gICAgICAgIHRlbXBsYXRlICs9IFxcXCJcXFxcblxcXCJcXG4gICAgICAgIHJlcyA9IFxcXCJcXFwiXFxuICAgICAgICBmb3Igcm93IGluIHNlbGYudmFsczpcXG4gICAgICAgICAgICByZXMgKz0gdGVtcGxhdGUuZm9ybWF0KCoqcm93KVxcblxcbiAgICAgICAgcmV0dXJuIGhlYWRlciArIHJlc1xcblxcblxcbmlmIF9fbmFtZV9fID09IFxcXCJfX21haW5fX1xcXCI6XFxuICAgIGQgPSBEYXRhKGE9WzMsIDQsIDVdLCBiPVsxLCAyLCAzXSwgYz1bXFxcInJcXFwiLCBcXFwiZ1xcXCIsIFxcXCJiXFxcIl0pXFxuICAgIHByaW50KGQpXFxuICAgIHByaW50KFxcbiAgICAgICAgdHlwZShcXG4gICAgICAgICAgICBDaGFydCh7XFxcImFcXFwiOiBsaXN0KFxcXCJhYmNcXFwiKSwgXFxcImJcXFwiOiBbMSwgMiwgM119KS5tYXJrX2JhcigpLmVuY29kZSh4PVxcXCJhOk5cXFwiLCB5PVxcXCJiXFxcIilcXG4gICAgICAgIClcXG4gICAgKVxcbiAgICBhYSA9IChcXG4gICAgICAgIENoYXJ0KERhdGEoYT1bMywgNCwgNV0sIGI9WzEsIDIsIDNdLCBjPVtcXFwiclxcXCIsIFxcXCJnXFxcIiwgXFxcImJcXFwiXSkpXFxuICAgICAgICAubWFya19wb2ludChjb2xvcj1cXFwicmVkXFxcIilcXG4gICAgICAgIC5lbmNvZGUoeD1cXFwiYlxcXCIsIHk9XFxcImFcXFwiLCBjb2xvcj1cXFwiYzpPXFxcIilcXG4gICAgKVxcbiAgICBwcmludChcXFwiYWEgPSBcXFwiLCBhYSlcXG4gICAgYWEuZGlzcGxheSgpXFxuXFxuICAgIGJiID0gKFxcbiAgICAgICAgQ2hhcnQoRGF0YShhPVsxLCAyLCAzXSwgYj1bNCwgNSwgNl0sIGM9W1xcXCJyXFxcIiwgXFxcImdcXFwiLCBcXFwiYlxcXCJdKSlcXG4gICAgICAgIC5tYXJrX2xpbmUoKVxcbiAgICAgICAgLmVuY29kZSh4PVxcXCJiXFxcIiwgeT1cXFwiYVxcXCIsIGNvbG9yPVxcXCJjOk9cXFwiKVxcbiAgICApXFxuICAgIHByaW50KFxcXCJiYiA9IFxcXCIsIGJiKVxcbiAgICBiYi5kaXNwbGF5KClcXG4gICAgcHJpbnQoXFxcImFhK2JiXFxcIiwgKGFhICsgYmIpLmRpc3BsYXkoKSlcXG4gICAgIyBDaGFydChEYXRhKGE9WzEsMiwzLDIsMiw0LDUsNSw2LDcsOCw4LDgsOCw4LDksMCwwXSkpLm1hcmtfYmFyKCkuZW5jb2RlKEF4aXMoJ2E6UScsIGJpbj1UcnVlKSx5PSdjb3VudCgpJylcXG5cXG5cXG4jIHRvZG86IHNlZSBpZiBJIGNhbiB3b3JrIHdpdGggdGhlIHJlcHIgb2YgYW4gb2JqZWN0IHRvIGdldCB0aGUgYmVoYXZpb3IgdGhhdCBhbHRhaXIgZ2V0cyBpbiBub3RlYm9va3NcXG4jIHRvZG86IGltcGxlbWVudCBhIEJpbiBvYmplY3QgdG8gc3BlY2lmaXkgbWF4Ymluc1xcblwiLFwic3JjL2xpYi9hbHRhaXIvdmVnYV9jYWxsZXIuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdmVnYV9jYWxsZXIuanNcXFwiLF9fcGFja2FnZV9fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxyZW5kZXJfZ3JhcGg6bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzKFxcXCJyZW5kZXJfZ3JhcGhcXFwiLGFyZ3VtZW50cywxLDEpO2xldCBiPVxcXCIjXFxcIitTay5kaXZpZCtcXFwiX2dyYXBoaWNzXFxcIjt0cnl7dmVnYUVtYmVkKGIsU2suZmZpLnJlbWFwVG9KcyhhKSx7YWN0aW9uczohMH0pfWNhdGNoKGEpe3Rocm93IG5ldyBTay5idWlsdGluLkV4Y2VwdGlvbihcXFwiRXJyb3IgaW4gZ3JhcGggc3BlY2lmaWNhdGlvbiB1bmFibGUgdG8gcmVuZGVyIHRoZSBncmFwaFxcXFxuXFxcIithLm1lc3NhZ2UpfX0pfTtyZXR1cm4gYX07XCIsXCJzcmMvbGliL2FudGlncmF2aXR5LnB5XCI6XCJpbXBvcnQgd2ViYnJvd3NlclxcblxcbndlYmJyb3dzZXIub3BlbihcXFwiaHR0cHM6Ly94a2NkLmNvbS8zNTMvXFxcIilcXG5cIixcInNyYy9saWIvYW55ZGJtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhbnlkYm0gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9hcnJheS5qc1wiOlwiJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fSxiPVtcXFwiY1xcXCIsXFxcImJcXFwiLFxcXCJCXFxcIixcXFwidVxcXCIsXFxcImhcXFwiLFxcXCJIXFxcIixcXFwiaVxcXCIsXFxcIklcXFwiLFxcXCJsXFxcIixcXFwiTFxcXCIsXFxcImZcXFwiLFxcXCJkXFxcIl07cmV0dXJuIGEuX19uYW1lX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpLGEuYXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLC0xPT1iLmluZGV4T2YoU2suZmZpLnJlbWFwVG9KcyhjKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIHR5cGVjb2RlIChtdXN0IGJlIGMsIGIsIEIsIHUsIGgsIEgsIGksIEksIGwsIEwsIGYgb3IgZClcXFwiKTtpZihkJiYhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7aWYoYS4kZC5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihcXFwidHlwZWNvZGVcXFwiKSxjKSxhLiRkLm1wJGFzc19zdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfX21vZHVsZV9fXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJhcnJheVxcXCIpKSxhLnR5cGVjb2RlPWMsdm9pZCAwPT09ZClhLmludGVybmFsSXRlcmFibGU9bmV3IFNrLmJ1aWx0aW4ubGlzdDtlbHNlIGlmKGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpYS5pbnRlcm5hbEl0ZXJhYmxlPWQ7ZWxzZSBmb3IoYS5pbnRlcm5hbEl0ZXJhYmxlPW5ldyBTay5idWlsdGluLmxpc3QsaXRlcj1Tay5hYnN0ci5pdGVyKGQpLGl0ZW09aXRlci50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWl0ZW07aXRlbT1pdGVyLnRwJGl0ZXJuZXh0KCkpU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuaW50ZXJuYWxJdGVyYWJsZS5hcHBlbmQsW2EuaW50ZXJuYWxJdGVyYWJsZSxpdGVtXSl9KSxjLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLnR5cGVjb2RlKSxjPVxcXCJcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb0pzKGEuaW50ZXJuYWxJdGVyYWJsZSkubGVuZ3RoJiYoXFxcImNcXFwiPT1Tay5mZmkucmVtYXBUb0pzKGEudHlwZWNvZGUpP2M9XFxcIiwgJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLmludGVybmFsSXRlcmFibGUpLmpvaW4oXFxcIlxcXCIpK1xcXCInXFxcIjpjPVxcXCIsIFxcXCIrU2suZmZpLnJlbWFwVG9KcyhTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLl9fcmVwcl9fLFthLmludGVybmFsSXRlcmFibGVdKSkpLG5ldyBTay5idWlsdGluLnN0cihcXFwiYXJyYXkoJ1xcXCIrYitcXFwiJ1xcXCIrYytcXFwiKVxcXCIpfSksYy5fX3N0cl9fPWMuX19yZXByX18sYy5fX2dldGF0dHJpYnV0ZV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS50cCRnZXRhdHRyKGIpfSksYy5hcHBlbmQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5pbnRlcm5hbEl0ZXJhYmxlLmFwcGVuZCxbYS5pbnRlcm5hbEl0ZXJhYmxlLGJdKSxTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmV4dGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSwhU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlXFxcIik7Zm9yKGl0ZXI9U2suYWJzdHIuaXRlcihiKSxpdGVtPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1pdGVtO2l0ZW09aXRlci50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmludGVybmFsSXRlcmFibGUuYXBwZW5kLFthLmludGVybmFsSXRlcmFibGUsaXRlbV0pfSl9LFxcXCJhcnJheVxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi9hc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImFzdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jaGF0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY2hhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2FzeW5jb3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJhc3luY29yZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2F0ZXhpdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYXRleGl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYXVkaW9kZXYucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImF1ZGlvZGV2IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmFzZTY0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJiYXNlNjQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9iZGIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImJkYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2JpbmhleC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYmluaGV4IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvYmlzZWN0LnB5XCI6XCJcXFwiXFxcIlxcXCJCaXNlY3Rpb24gYWxnb3JpdGhtcy5cXFwiXFxcIlxcXCJcXG5cXG5kZWYgaW5zb3J0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgYS5pbnNlcnQobG8sIHgpXFxuXFxuZGVmIGJpc2VjdF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDw9IHgsIGFuZCBhbGwgZSBpblxcbiAgICBhW2k6XSBoYXZlIGUgPiB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYWZ0ZXIgdGhlIHJpZ2h0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWRcXG4gICAgICAgIGVsc2U6IGxvID0gbWlkKzFcXG4gICAgcmV0dXJuIGxvXFxuXFxuZGVmIGluc29ydF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLlxcblxcbiAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSBsZWZ0IG9mIHRoZSBsZWZ0bW9zdCB4LlxcblxcbiAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZVxcbiAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgaWYgbG8gPCAwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKVxcbiAgICBpZiBoaSBpcyBOb25lOlxcbiAgICAgICAgaGkgPSBsZW4oYSlcXG4gICAgd2hpbGUgbG8gPCBoaTpcXG4gICAgICAgIG1pZCA9IChsbytoaSkvLzJcXG4gICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzFcXG4gICAgICAgIGVsc2U6IGhpID0gbWlkXFxuICAgIGEuaW5zZXJ0KGxvLCB4KVxcblxcblxcbmRlZiBiaXNlY3RfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuXFxuXFxuICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDwgeCwgYW5kIGFsbCBlIGluXFxuICAgIGFbaTpdIGhhdmUgZSA+PSB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGxcXG4gICAgaW5zZXJ0IGp1c3QgYmVmb3JlIHRoZSBsZWZ0bW9zdCB4IGFscmVhZHkgdGhlcmUuXFxuXFxuICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlXFxuICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICBpZiBsbyA8IDA6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpXFxuICAgIGlmIGhpIGlzIE5vbmU6XFxuICAgICAgICBoaSA9IGxlbihhKVxcbiAgICB3aGlsZSBsbyA8IGhpOlxcbiAgICAgICAgbWlkID0gKGxvK2hpKS8vMlxcbiAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMVxcbiAgICAgICAgZWxzZTogaGkgPSBtaWRcXG4gICAgcmV0dXJuIGxvXFxuXFxuIyBPdmVyd3JpdGUgYWJvdmUgZGVmaW5pdGlvbnMgd2l0aCBhIGZhc3QgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfYmlzZWN0IGltcG9ydCAqXFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyBDcmVhdGUgYWxpYXNlc1xcbmJpc2VjdCA9IGJpc2VjdF9yaWdodFxcbmluc29ydCA9IGluc29ydF9yaWdodFxcblwiLFwic3JjL2xpYi9ic2RkYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiYnNkZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jUHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY1Byb2ZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jYWxlbmRhci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY2FsZW5kYXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jZ2kucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNnaSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NnaXRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjZ2l0YiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NodW5rLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjaHVuayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NtZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY21kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2NvZGVjcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29kZWNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29kZW9wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb2Rlb3AgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb2xsZWN0aW9ucy5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtjb25zdCBhPXt9O3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXFxcImtleXdvcmRcXFwiLCExLCEwKSxiPT4oYS5faXNrZXl3b3JkPWIuJGQuaXNrZXl3b3JkLFNrLmltcG9ydE1vZHVsZShcXFwiaXRlcnRvb2xzXFxcIiwhMSwhMCkpLGI9PihhLl9jaGFpbj1iLiRkLmNoYWluLGEuX3N0YXJtYXA9Yi4kZC5zdGFybWFwLGEuX3JlcGVhdD1iLiRkLnJlcGVhdCxTay5pbXBvcnRNb2R1bGUoXFxcIm9wZXJhdG9yXFxcIiwhMSwhMCkpLGI9PnthLl9pdGVtZ2V0dGVyPWIuJGQuaXRlbWdldHRlcn0sKCk9PmNvbGxlY3Rpb25zX21vZChhKSl9ZnVuY3Rpb24gY29sbGVjdGlvbnNfbW9kKGEpe2Z1bmN0aW9uIGNvdW50ZXJOdW1iZXJTbG90KGIpe3JldHVybiBmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jJiYhKGMgaW5zdGFuY2VvZiBhLkNvdW50ZXIpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPW5ldyBhLkNvdW50ZXI7cmV0dXJuIGIuY2FsbCh0aGlzLGQsYyksZH19ZnVuY3Rpb24gY291bnRlcklucGxhY2VTbG90KGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKCEoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJDb3VudGVyIFxcXCIrYStcXFwiPSBcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgaXMgbm90IHN1cHBvcnRlZFxcXCIpO3JldHVybiBiLmNhbGwodGhpcyxjKSx0aGlzLmtlZXAkcG9zaXRpdmUoKX19ZnVuY3Rpb24gbmFtZWR0dXBsZShiLGMsZCxsLG0pe2Z1bmN0aW9uIF9tYWtlKGEsYil7cmV0dXJuIGEucHJvdG90eXBlLnRwJG5ldyhTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShiKSl9ZnVuY3Rpb24gX2FzZGljdChhKXtjb25zdCBiPVtdO2ZvcihsZXQgYz0wO2M8YS5fZmllbGRzLnYubGVuZ3RoO2MrKyliLnB1c2goYS5fZmllbGRzLnZbY10pLGIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5kaWN0KGIpfWZ1bmN0aW9uIF9yZXBsYWNlKGEsYil7YT1uZXcgU2suYnVpbHRpbi5kaWN0KGEpO2NvbnN0IGM9YS50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwicG9wXFxcIikpLGQ9U2suYWJzdHIuZ2F0dHIoYixuZXcgU2suYnVpbHRpbi5zdHIoXFxcIl9tYWtlXFxcIikpLGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5LGY9ZShkLFtlKFNrLmJ1aWx0aW4ubWFwXyxbYyxyLGJdKV0pO2lmKGEuc3EkbGVuZ3RoKCkpe2NvbnN0IGI9YS5zayRhc2FycmF5KCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiR290IHVuZXhwZWN0ZCBmaWVsZCBuYW1lczogW1xcXCIrYi5tYXAoYT0+XFxcIidcXFwiK2EuJGpzc3RyKCkrXFxcIidcXFwiKStcXFwiXVxcXCIpfXJldHVybiBmfWlmKGI9Yi50cCRzdHIoKSxTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbYl0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGIpK1xcXCInXFxcIik7Y29uc3Qgbj1iLiRqc3N0cigpO2lmKGUudGVzdChuKXx8IWcudGVzdChuKXx8IW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrbitcXFwiJ1xcXCIpO2xldCBvLHA7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSlvPWMuJGpzc3RyKCkucmVwbGFjZShoLFxcXCIgXFxcIikuc3BsaXQoaiksMT09by5sZW5ndGgmJlxcXCJcXFwiPT09b1swXSYmKG89W10pLHA9by5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKTtlbHNle289W10scD1bXTtmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKWI9Yi50cCRzdHIoKSxwLnB1c2goYiksby5wdXNoKGIuJGpzc3RyKCkpfWxldCBxPW5ldyBTZXQ7aWYoU2subWlzY2V2YWwuaXNUcnVlKGQpKWZvcihpPTA7aTxvLmxlbmd0aDtpKyspKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5faXNrZXl3b3JkLFtwW2ldXSkpfHxmLnRlc3Qob1tpXSl8fCFnLnRlc3Qob1tpXSl8fCFvW2ldfHxxLmhhcyhvW2ldKSkmJihvW2ldPVxcXCJfXFxcIitpLHBbaV09bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJfXFxcIitpKSkscS5hZGQob1tpXSk7ZWxzZSBmb3IoaT0wO2k8by5sZW5ndGg7aSsrKXtpZihTay5taXNjZXZhbC5pc1RydWUoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuX2lza2V5d29yZCxbcFtpXV0pKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSBrZXl3b3JkOiAnXFxcIitvW2ldK1xcXCInXFxcIik7ZWxzZSBpZihmLnRlc3Qob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYoIWcudGVzdChvW2ldKXx8IW9baV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgbXVzdCBiZSB2YWxpZCBpZGVudGlmaWVyczogJ1xcXCIrb1tpXStcXFwiJ1xcXCIpO2Vsc2UgaWYocS5oYXMob1tpXSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICdcXFwiK29baV0rXFxcIidcXFwiKTtxLmFkZChvW2ldKX1jb25zdCByPW5ldyBTay5idWlsdGluLnR1cGxlKHApLHM9W107bGV0IHQ9W107aWYoIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGwpKXtpZih0PVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGwpLHQubGVuZ3RoPm8ubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiR290IG1vcmUgZGVmYXVsdCB2YWx1ZXMgdGhhbiBmaWVsZCBuYW1lc1xcXCIpO2ZvcihsZXQgYT0wLGI9cC5sZW5ndGgtdC5sZW5ndGg7YjxwLmxlbmd0aDthKyssYisrKXMucHVzaChwW2JdKSxzLnB1c2godFthXSl9Y29uc3QgdT1uZXcgU2suYnVpbHRpbi5kaWN0KHMpO19tYWtlLmNvX3Zhcm5hbWVzPVtcXFwiX2Nsc1xcXCIsXFxcIml0ZXJhYmxlXFxcIl0sX2FzZGljdC5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiXSxfcmVwbGFjZS5jb19rd2FyZ3M9MSxfcmVwbGFjZS5jb192YXJuYW1lcz1bXFxcIl9zZWxmXFxcIl07Y29uc3Qgdj17fTtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl2W3BbZV0uJG1hbmdsZWRdPW5ldyBTay5idWlsdGluLnByb3BlcnR5KG5ldyBhLl9pdGVtZ2V0dGVyKFtuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSksdm9pZCAwLHZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFsaWFzIGZvciBmaWVsZCBudW1iZXIgXFxcIitlKSk7cmV0dXJuIFNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3Mobix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gTmFtZWRUdXBsZSgpe30sYmFzZTpTay5idWlsdGluLnR1cGxlLHNsb3RzOnt0cCRkb2M6bitcXFwiKFxcXCIrby5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIix0cCRuZXcoYSxiKXthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJfX25ld19fXFxcIixvLGEsYix0KTtjb25zdCBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBTay5idWlsdGluLnR1cGxlLmNhbGwoYyxhKSxjfSwkcigpe2NvbnN0IGE9dGhpcy52Lm1hcCgoYSxiKT0+b1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYS5qb2luKFxcXCIsIFxcXCIpK1xcXCIpXFxcIil9fSxwcm90bzpPYmplY3QuYXNzaWduKHtfX21vZHVsZV9fOlNrLmJ1aWx0aW4uY2hlY2tOb25lKG0pP1NrLmdsb2JhbHMuX19uYW1lX186bSxfX3Nsb3RzX186bmV3IFNrLmJ1aWx0aW4udHVwbGUsX2ZpZWxkczpyLF9maWVsZF9kZWZhdWx0czp1LF9tYWtlOm5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kKG5ldyBTay5idWlsdGluLmZ1bmMoX21ha2UpKSxfYXNkaWN0Om5ldyBTay5idWlsdGluLmZ1bmMoX2FzZGljdCksX3JlcGxhY2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhfcmVwbGFjZSl9LHYpfSl9YS5fX2FsbF9fPW5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJkZXF1ZVxcXCIsXFxcImRlZmF1bHRkaWN0XFxcIixcXFwibmFtZWR0dXBsZVxcXCIsXFxcIkNvdW50ZXJcXFwiLFxcXCJPcmRlcmVkRGljdFxcXCJdLm1hcChhPT5uZXcgU2suYnVpbHRpbi5zdHIoYSkpKSxhLmRlZmF1bHRkaWN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXFxcImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZGVmYXVsdGRpY3QoYSxiKXt0aGlzLmRlZmF1bHRfZmFjdG9yeT1hLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMsYil9LGJhc2U6U2suYnVpbHRpbi5kaWN0LG1ldGhvZHM6e2NvcHk6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9fSxfX2NvcHlfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fbWlzc2luZ19fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrTm9uZSh0aGlzLmRlZmF1bHRfZmFjdG9yeSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7ZWxzZXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmRlZmF1bHRfZmFjdG9yeSxbXSk7cmV0dXJuIHRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpLGJ9fSwkZmxhZ3M6e09uZUFyZzohMH19fSxnZXRzZXRzOntkZWZhdWx0X2ZhY3Rvcnk6eyRnZXQoKXtyZXR1cm4gdGhpcy5kZWZhdWx0X2ZhY3Rvcnl9LCRzZXQoYSl7YT1hfHxTay5idWlsdGluLm5vbmUubm9uZSQsdGhpcy5kZWZhdWx0X2ZhY3Rvcnk9YX19fSxzbG90czp7dHAkZG9jOlxcXCJkZWZhdWx0ZGljdChkZWZhdWx0X2ZhY3RvcnlbLCAuLi5dKSAtLT4gZGljdCB3aXRoIGRlZmF1bHQgZmFjdG9yeVxcXFxuXFxcXG5UaGUgZGVmYXVsdCBmYWN0b3J5IGlzIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cyB0byBwcm9kdWNlXFxcXG5hIG5ldyB2YWx1ZSB3aGVuIGEga2V5IGlzIG5vdCBwcmVzZW50LCBpbiBfX2dldGl0ZW1fXyBvbmx5LlxcXFxuQSBkZWZhdWx0ZGljdCBjb21wYXJlcyBlcXVhbCB0byBhIGRpY3Qgd2l0aCB0aGUgc2FtZSBpdGVtcy5cXFxcbkFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGlmIHRoZXkgd2VyZVxcXFxucGFzc2VkIHRvIHRoZSBkaWN0IGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcga2V5d29yZCBhcmd1bWVudHMuXFxcXG5cXFwiLHRwJGluaXQoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1jKXRoaXMuZGVmYXVsdF9mYWN0b3J5PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtlbHNlIGlmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGVcXFwiKTtlbHNlIHRoaXMuZGVmYXVsdF9mYWN0b3J5PWM7cmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaW5pdC5jYWxsKHRoaXMsYSxiKX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5kZWZhdWx0X2ZhY3RvcnkpLGI9U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiZGVmYXVsdGRpY3QoXFxcIithK1xcXCIsIFxcXCIrYitcXFwiKVxcXCIpfX0scHJvdG86eyRjb3B5KCl7Y29uc3QgYj1bXTtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKHRoaXMpLGE9PntiLnB1c2goYSksYi5wdXNoKHRoaXMubXAkc3Vic2NyaXB0KGEpKX0pLG5ldyBhLmRlZmF1bHRkaWN0KHRoaXMuZGVmYXVsdF9mYWN0b3J5LGIpfX19KSxhLkNvdW50ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiQ291bnRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIENvdW50ZXIoKXt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3QsU2suYnVpbHRpbi5kaWN0LmFwcGx5KHRoaXMpfSxiYXNlOlNrLmJ1aWx0aW4uZGljdCxtZXRob2RzOntlbGVtZW50czp7JGZsYWdzOntOb0FyZ3M6ITB9LCRtZXRoKCl7Y29uc3QgYj1hLl9jaGFpbi50cCRnZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihcXFwiZnJvbV9pdGVyYWJsZVxcXCIpKSxjPWEuX3N0YXJtYXAsZD1hLl9yZXBlYXQsZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXk7cmV0dXJuIGUoYixbZShjLFtkLGUodGhpcy50cCRnZXRhdHRyKHRoaXMuc3RyJGl0ZW1zKSldKV0pfX0sbW9zdF9jb21tb246eyRmbGFnczp7TmFtZWRBcmdzOltcXFwiblxcXCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSRdfSwkbWV0aChhKXtsZW5ndGg9dGhpcy5zcSRsZW5ndGgoKSxTay5idWlsdGluLmNoZWNrTm9uZShhKT9hPWxlbmd0aDooYT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhKSxhPWE+bGVuZ3RoP2xlbmd0aDowPmE/MDphKTtjb25zdCBiPXRoaXMuJGl0ZW1zKCkuc29ydCgoYyxhKT0+U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbMV0sYVsxXSxcXFwiTHRcXFwiKT8xOlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjWzFdLGFbMV0sXFxcIkd0XFxcIik/LTE6MCk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYi5zbGljZSgwLGEpLm1hcChhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSkpfX0sdXBkYXRlOnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe3JldHVybiBTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcInVwZGF0ZVxcXCIsYSwwLDEpLHRoaXMuY291bnRlciR1cGRhdGUoYSxiKX19LHN1YnRyYWN0OnskZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkbWV0aChhLGIpe1NrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwic3VidHJhY3RcXFwiLGEsMCwxKTtjb25zdCBjPWFbMF07aWYodm9pZCAwIT09YylpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSxjLm1wJHN1YnNjcmlwdChiKSxcXFwiU3ViXFxcIikpfWVsc2UgZm9yKGl0ZXI9U2suYWJzdHIuaXRlcihjKSxrPWl0ZXIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1rO2s9aXRlci50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGspO3RoaXMubXAkYXNzX3N1YnNjcmlwdChrLFNrLmFic3RyLm51bWJlckJpbk9wKGEsdGhpcy4kb25lLFxcXCJTdWJcXFwiKSl9Yj1ifHxbXTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrPTIpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbY10pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYSk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2MrMV0sXFxcIlN1YlxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19taXNzaW5nX186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHplcm99LCRmbGFnczp7T25lQXJnOiEwfX0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuQ291bnRlcixbdGhpc10pfSwkZmxhZ3M6e05vQXJnczohMH19fSxnZXRzZXRzOntfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9LHNsb3RzOnt0cCRkb2M6XFxcIkRpY3Qgc3ViY2xhc3MgZm9yIGNvdW50aW5nIGhhc2hhYmxlIGl0ZW1zLiAgU29tZXRpbWVzIGNhbGxlZCBhIGJhZ1xcXFxuICAgIG9yIG11bHRpc2V0LiAgRWxlbWVudHMgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IGtleXMgYW5kIHRoZWlyIGNvdW50c1xcXFxuICAgIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSB2YWx1ZXMuXFxcXG5cXFxcbiAgICA+Pj4gYyA9IENvdW50ZXIoJ2FiY2RlYWJjZGFiY2FiYScpICAjIGNvdW50IGVsZW1lbnRzIGZyb20gYSBzdHJpbmdcXFxcblxcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKDMpICAgICAgICAgICAgICAgICMgdGhyZWUgbW9zdCBjb21tb24gZWxlbWVudHNcXFxcbiAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV1cXFxcbiAgICA+Pj4gc29ydGVkKGMpICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QgYWxsIHVuaXF1ZSBlbGVtZW50c1xcXFxuICAgIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ11cXFxcbiAgICA+Pj4gJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSkgICAjIGxpc3QgZWxlbWVudHMgd2l0aCByZXBldGl0aW9uc1xcXFxuICAgICdhYWFhYWJiYmJjY2NkZGUnXFxcXG4gICAgPj4+IHN1bShjLnZhbHVlcygpKSAgICAgICAgICAgICAgICAgIyB0b3RhbCBvZiBhbGwgY291bnRzXFxcXG4gICAgMTVcXFxcblxcXFxuICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgY291bnQgb2YgbGV0dGVyICdhJ1xcXFxuICAgIDVcXFxcbiAgICA+Pj4gZm9yIGVsZW0gaW4gJ3NoYXphbSc6ICAgICAgICAgICAjIHVwZGF0ZSBjb3VudHMgZnJvbSBhbiBpdGVyYWJsZVxcXFxuICAgIC4uLiAgICAgY1tlbGVtXSArPSAxICAgICAgICAgICAgICAgICMgYnkgYWRkaW5nIDEgdG8gZWFjaCBlbGVtZW50J3MgY291bnRcXFxcbiAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgc2V2ZW4gJ2EnXFxcXG4gICAgN1xcXFxuICAgID4+PiBkZWwgY1snYiddICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCAnYidcXFxcbiAgICA+Pj4gY1snYiddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgemVybyAnYidcXFxcbiAgICAwXFxcXG5cXFxcbiAgICA+Pj4gZCA9IENvdW50ZXIoJ3NpbXNhbGFiaW0nKSAgICAgICAjIG1ha2UgYW5vdGhlciBjb3VudGVyXFxcXG4gICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAgICAgIyBhZGQgaW4gdGhlIHNlY29uZCBjb3VudGVyXFxcXG4gICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIG5pbmUgJ2EnXFxcXG4gICAgOVxcXFxuXFxcXG4gICAgPj4+IGMuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgY291bnRlclxcXFxuICAgID4+PiBjXFxcXG4gICAgQ291bnRlcigpXFxcXG5cXFxcbiAgICBOb3RlOiAgSWYgYSBjb3VudCBpcyBzZXQgdG8gemVybyBvciByZWR1Y2VkIHRvIHplcm8sIGl0IHdpbGwgcmVtYWluXFxcXG4gICAgaW4gdGhlIGNvdW50ZXIgdW50aWwgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgb3IgdGhlIGNvdW50ZXIgaXMgY2xlYXJlZDpcXFxcblxcXFxuICAgID4+PiBjID0gQ291bnRlcignYWFhYmJjJylcXFxcbiAgICA+Pj4gY1snYiddIC09IDIgICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSB0aGUgY291bnQgb2YgJ2InIGJ5IHR3b1xcXFxuICAgID4+PiBjLm1vc3RfY29tbW9uKCkgICAgICAgICAgICAgICAgICMgJ2InIGlzIHN0aWxsIGluLCBidXQgaXRzIGNvdW50IGlzIHplcm9cXFxcbiAgICBbKCdhJywgMyksICgnYycsIDEpLCAoJ2InLCAwKV1cXFxcblxcXFxuXFxcIix0cCRpbml0KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLnRwanNfbmFtZSxhLDAsMSksdGhpcy5jb3VudGVyJHVwZGF0ZShhLGIpfSwkcigpe2NvbnN0IGE9MDx0aGlzLnNpemU/U2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS4kci5jYWxsKHRoaXMpLnY6XFxcIlxcXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStcXFwiKVxcXCIpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJGFzc19zdWJzY3JpcHQoYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLm1wJGxvb2t1cChhKSYmU2suYnVpbHRpbi5kaWN0LnByb3RvdHlwZS5tcCRhc3Nfc3Vic2NyaXB0LmNhbGwodGhpcyxhLGIpOlNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUubXAkYXNzX3N1YnNjcmlwdC5jYWxsKHRoaXMsYSxiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJHBvc2l0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJG5lZ2F0aXZlOmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJHN1YnRyYWN0OmNvdW50ZXJOdW1iZXJTbG90KGZ1bmN0aW9uKGEsYil7dGhpcy4kaXRlbXMoKS5mb3JFYWNoKChbYyxkXSk9Pntjb25zdCBlPVNrLmFic3RyLm51bWJlckJpbk9wKGQsYi5tcCRzdWJzY3JpcHQoYyksXFxcIlN1YlxcXCIpO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChlLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGUpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiTHRcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy4kemVybyxjLFxcXCJTdWJcXFwiKSl9KX0pLG5iJGFkZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1Tay5hYnN0ci5udW1iZXJCaW5PcChkLGIubXAkc3Vic2NyaXB0KGMpLFxcXCJBZGRcXFwiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZSx0aGlzLiR6ZXJvLFxcXCJHdFxcXCIpJiZhLm1wJGFzc19zdWJzY3JpcHQoYyxlKX0pLGIuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57dm9pZCAwPT09dGhpcy5tcCRsb29rdXAoYikmJlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChiLGMpfSl9KSxuYiRpbnBsYWNlX2FkZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIitcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57Y29uc3QgYz1Tay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AodGhpcy5tcCRzdWJzY3JpcHQoYSksYixcXFwiQWRkXFxcIik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGEsYyl9KX0pLG5iJGlucGxhY2Vfc3VidHJhY3Q6Y291bnRlcklucGxhY2VTbG90KFxcXCItXFxcIixmdW5jdGlvbihhKXthLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e2NvbnN0IGM9U2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKHRoaXMubXAkc3Vic2NyaXB0KGEpLGIsXFxcIlN1YlxcXCIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChhLGMpfSl9KSxuYiRvcjpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZTpkO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSksYi4kaXRlbXMoKS5mb3JFYWNoKChbYixjXSk9Pnt2b2lkIDA9PT10aGlzLm1wJGxvb2t1cChiKSYmU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsdGhpcy4kemVybyxcXFwiR3RcXFwiKSYmYS5tcCRhc3Nfc3Vic2NyaXB0KGIsYyl9KX0pLG5iJGFuZDpjb3VudGVyTnVtYmVyU2xvdChmdW5jdGlvbihhLGIpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2MsZF0pPT57Y29uc3QgZT1iLm1wJHN1YnNjcmlwdChjKSxmPVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChkLGUsXFxcIkx0XFxcIik/ZDplO1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmLHRoaXMuJHplcm8sXFxcIkd0XFxcIikmJmEubXAkYXNzX3N1YnNjcmlwdChjLGYpfSl9KSxuYiRpbnBsYWNlX2FuZDpjb3VudGVySW5wbGFjZVNsb3QoXFxcIiZcXFwiLGZ1bmN0aW9uKGEpe3RoaXMuJGl0ZW1zKCkuZm9yRWFjaCgoW2IsY10pPT57Y29uc3QgZD1hLm1wJHN1YnNjcmlwdChiKTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxjLFxcXCJMdFxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYixkKX0pfSksbmIkaW5wbGFjZV9vcjpjb3VudGVySW5wbGFjZVNsb3QoXFxcInxcXFwiLGZ1bmN0aW9uKGEpe2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsdGhpcy5tcCRzdWJzY3JpcHQoYSksXFxcIkd0XFxcIikmJnRoaXMubXAkYXNzX3N1YnNjcmlwdChhLGIpfSl9KSxuYiRyZWZsZWN0ZWRfYW5kOm51bGwsbmIkcmVmbGVjdGVkX29yOm51bGwsbmIkcmVmbGVjdGVkX2FkZDpudWxsLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpudWxsfSxwcm90bzp7a2VlcCRwb3NpdGl2ZSgpe3JldHVybiB0aGlzLiRpdGVtcygpLmZvckVhY2goKFthLGJdKT0+e1NrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLHRoaXMuJHplcm8sXFxcIkx0RVxcXCIpJiZ0aGlzLm1wJGFzc19zdWJzY3JpcHQoYSl9KSx0aGlzfSwkemVybzpuZXcgU2suYnVpbHRpbi5pbnRfKDApLCRvbmU6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpdGVtc1xcXCIpLGNvdW50ZXIkdXBkYXRlKGEsYil7Y29uc3QgYz1hWzBdO2lmKHZvaWQgMCE9PWMpaWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGMpKWZvcihsZXQgYT1Tay5hYnN0ci5pdGVyKGMpLGI9YS50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWI7Yj1hLnRwJGl0ZXJuZXh0KCkpe2NvbnN0IGE9dGhpcy5tcCRzdWJzY3JpcHQoYik7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGIsU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLiRvbmUsXFxcIkFkZFxcXCIpKX1lbHNlIGlmKCF0aGlzLnNxJGxlbmd0aCgpKXRoaXMudXBkYXRlJGNvbW1vbihhLHZvaWQgMCxcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9U2suYWJzdHIuaXRlcihjKSxiPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9YS50cCRpdGVybmV4dCgpKXtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGIpO3RoaXMubXAkYXNzX3N1YnNjcmlwdChiLFNrLmFic3RyLm51bWJlckJpbk9wKGEsYy5tcCRzdWJzY3JpcHQoYiksXFxcIkFkZFxcXCIpKX1pZihiJiZiLmxlbmd0aClpZighdGhpcy5zcSRsZW5ndGgoKSl0aGlzLnVwZGF0ZSRjb21tb24oW10sYixcXFwidXBkYXRlXFxcIik7ZWxzZSBmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErPTIpe2NvbnN0IGM9bmV3IFNrLmJ1aWx0aW4uc3RyKGJbYV0pLGQ9dGhpcy5tcCRzdWJzY3JpcHQoYyk7dGhpcy5tcCRhc3Nfc3Vic2NyaXB0KGMsU2suYWJzdHIubnVtYmVyQmluT3AoZCxiW2ErMV0sXFxcIkFkZFxcXCIpKX1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfX0sY2xhc3NtZXRob2RzOntmcm9ta2V5czp7JG1ldGg6ZnVuY3Rpb24gZnJvbWtleXMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJDb3VudGVyLmZyb21rZXlzKCkgaXMgdW5kZWZpbmVkLiAgVXNlIENvdW50ZXIoaXRlcmFibGUpIGluc3RlYWQuXFxcIil9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn19fX0pO2NvbnN0IGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJvZGljdF9pdGVyYXRvclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIG9kaWN0X2l0ZXJfKGEpe3RoaXMuJGluZGV4PTAsdGhpcy4kc2VxPWEuc2skYXNhcnJheSgpLHRoaXMuJG9yaWc9YX0saXRlcm5leHQ6U2suZ2VuZXJpYy5pdGVyTmV4dFdpdGhBcnJheUNoZWNrU2l6ZSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO2EuT3JkZXJlZERpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwiT3JkZXJlZERpY3RcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBPcmRlcmVkRGljdCgpe3JldHVybiB0aGlzLm9yZGVyZWRrZXlzPVtdLFNrLmJ1aWx0aW4uZGljdC5jYWxsKHRoaXMpLHRoaXN9LGJhc2U6U2suYnVpbHRpbi5kaWN0LHNsb3RzOnt0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcIk9yZGVyZWREaWN0XFxcIixhLDAsMSksYS51bnNoaWZ0KHRoaXMpLHJlcz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy51cGRhdGUsYSxiKX0sdHAkZG9jOlxcXCJEaWN0aW9uYXJ5IHRoYXQgcmVtZW1iZXJzIGluc2VydGlvbiBvcmRlclxcXCIsJHIoKXtsZXQgYSxiO2NvbnN0IGM9W107Zm9yKGxldCBiPXRoaXMudHAkaXRlcigpLGQ9Yi50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1iLnRwJGl0ZXJuZXh0KCkpYT10aGlzLm1wJHN1YnNjcmlwdChkKSx2b2lkIDA9PT1hJiYoYT1udWxsKSxjLnB1c2goXFxcIihcXFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoZCkrXFxcIiwgXFxcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1xcXCIpXFxcIik7cmV0dXJuIGI9Yy5qb2luKFxcXCIsIFxcXCIpLDA8Yy5sZW5ndGgmJihiPVxcXCJbXFxcIitiK1xcXCJdXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJPcmRlcmVkRGljdChcXFwiK2IrXFxcIilcXFwiKX0sdHAkcmljaGNvbXBhcmUoYixjKXtpZihcXFwiRXFcXFwiIT1jJiZcXFwiTmVcXFwiIT1jKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBkPVxcXCJFcVxcXCI9PWM7aWYoIShiIGluc3RhbmNlb2YgYS5PcmRlcmVkRGljdCkpcmV0dXJuIFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkcmljaGNvbXBhcmUuY2FsbCh0aGlzLGIsYyk7Y29uc3QgZT10aGlzLnNpemUsZj1iLnNpemU7aWYoZSE9PWYpcmV0dXJuIWQ7Zm9yKGxldCBhPXRoaXMudHAkaXRlcigpLGU9Yi50cCRpdGVyKCksZj1hLnRwJGl0ZXJuZXh0KCksZz1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSxnPWUudHAkaXRlcm5leHQoKSl7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZixnLFxcXCJFcVxcXCIpKSlyZXR1cm4hZDtjb25zdCBhPXRoaXMubXAkc3Vic2NyaXB0KGYpLGM9Yi5tcCRzdWJzY3JpcHQoZyk7aWYoIVNrLm1pc2NldmFsLmlzVHJ1ZShTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFxcXCJFcVxcXCIpKSlyZXR1cm4hZH1yZXR1cm4gZH0sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2NvbnN0IGI9dGhpcy5wb3AkaXRlbShhKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpfWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfX0sbWV0aG9kczp7cG9wOnskZmxhZ3M6e05hbWVkQXJnczpbXFxcImtleVxcXCIsXFxcImRlZmF1bHRcXFwiXSxEZWZhdWx0czpbbnVsbF19LCRtZXRoKGEsYil7cmV0dXJuIG51bGw9PT1iP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCxbdGhpcyxhXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUucG9wLFt0aGlzLGEsYl0pfX0scG9waXRlbTp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEpe2xldCBiLGM7aWYoIXRoaXMub3JkZXJlZGtleXMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKFxcXCJkaWN0aW9uYXJ5IGlzIGVtcHR5XFxcIik7cmV0dXJuIGI9dGhpcy5vcmRlcmVka2V5c1swXSxTay5taXNjZXZhbC5pc1RydWUoYSkmJihiPXRoaXMub3JkZXJlZGtleXNbdGhpcy5vcmRlcmVka2V5cy5sZW5ndGgtMV0pLGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucG9wLFt0aGlzLGJdKSxuZXcgU2suYnVpbHRpbi50dXBsZShbYixjXSl9fSxtb3ZlX3RvX2VuZDp7JGZsYWdzOntOYW1lZEFyZ3M6W1xcXCJrZXlcXFwiLFxcXCJsYXN0XFxcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4uYm9vbC50cnVlJF19LCRtZXRoKGEsYil7bGV0IGMsZD0tMTtmb3IobGV0IGU9MDtlPHRoaXMub3JkZXJlZGtleXMubGVuZ3RoO2UrKylpZihjPXRoaXMub3JkZXJlZGtleXNbZV0sYz09PWF8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkVxXFxcIikpe2Q9ZTticmVha31pZigtMSE9PWQpdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoZCwxKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO3JldHVybiBTay5taXNjZXZhbC5pc1RydWUoYik/dGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpOnRoaXMub3JkZXJlZGtleXMudW5zaGlmdChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9fX0scHJvdG86e3NrJGFzYXJyYXkoKXtyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zbGljZSgwKX0sc2V0JGl0ZW0oYSxiKXtjb25zdCBjPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTstMT09YyYmdGhpcy5vcmRlcmVka2V5cy5wdXNoKGEpLFNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUuc2V0JGl0ZW0uY2FsbCh0aGlzLGEsYil9LHBvcCRpdGVtKGEpe3ZhciBiPXRoaXMub3JkZXJlZGtleXMuaW5kZXhPZihhKTtpZigtMSE9YilyZXR1cm4gdGhpcy5vcmRlcmVka2V5cy5zcGxpY2UoYiwxKSxTay5idWlsdGluLmRpY3QucHJvdG90eXBlLnBvcCRpdGVtLmNhbGwodGhpcyxhKX19fSksYS5kZXF1ZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJjb2xsZWN0aW9ucy5kZXF1ZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGRlcXVlKGEsYixjLGQsZSl7dGhpcy5oZWFkPWN8fDAsdGhpcy50YWlsPWR8fDAsdGhpcy5tYXNrPWV8fDEsdGhpcy5tYXhsZW49Yix0aGlzLnY9YXx8WywsXX0sc2xvdHM6e3RwJGRvYzpcXFwiZGVxdWUoW2l0ZXJhYmxlWywgbWF4bGVuXV0pIC0tPiBkZXF1ZSBvYmplY3RcXFxcblxcXFxuQSBsaXN0LWxpa2Ugc2VxdWVuY2Ugb3B0aW1pemVkIGZvciBkYXRhIGFjY2Vzc2VzIG5lYXIgaXRzIGVuZHBvaW50cy5cXFwiLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYil7aWYoW2l0ZXJhYmxlLG1heGxlbl09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImRlcXVlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwibWF4bGVuXFxcIl0sYSxiKSx2b2lkIDAhPT1tYXhsZW4mJiFTay5idWlsdGluLmNoZWNrTm9uZShtYXhsZW4pKWlmKG1heGxlbj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQobWF4bGVuLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcixcXFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFxcXCIpLDA+bWF4bGVuKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1heGxlbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2Vsc2UgdGhpcy5tYXhsZW49bWF4bGVuO3RoaXMuJGNsZWFyKCksdm9pZCAwIT09aXRlcmFibGUmJnRoaXMuJGV4dGVuZChpdGVyYWJsZSl9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJHJpY2hjb21wYXJlKGIsYyl7dmFyIGQ9TWF0aC5tYXg7aWYodGhpcz09PWImJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGU9YixmPXRoaXMudjtiPWIudjtjb25zdCBnPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrLGg9ZS50YWlsLWUuaGVhZCZlLm1hc2s7bGV0IGosbD1kKGcsaCk7aWYoZz09PWgpZm9yKGw9MDtsPGcmJmw8aCYmKGo9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGZbdGhpcy5oZWFkK2wmdGhpcy5tYXNrXSxiW2UuaGVhZCtsJmUubWFza10sXFxcIkVxXFxcIiksISFqKTsrK2wpO2lmKGw+PWd8fGw+PWgpc3dpdGNoKGMpe2Nhc2VcXFwiTHRcXFwiOnJldHVybiBnPGg7Y2FzZVxcXCJMdEVcXFwiOnJldHVybiBnPD1oO2Nhc2VcXFwiRXFcXFwiOnJldHVybiBnPT09aDtjYXNlXFxcIk5vdEVxXFxcIjpyZXR1cm4gZyE9PWg7Y2FzZVxcXCJHdFxcXCI6cmV0dXJuIGc+aDtjYXNlXFxcIkd0RVxcXCI6cmV0dXJuIGc+PWg7fXJldHVyblxcXCJFcVxcXCIhPT1jJiYoXFxcIk5vdEVxXFxcIj09PWN8fFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChmW3RoaXMuaGVhZCtsJnRoaXMubWFza10sYltlLmhlYWQrbCZlLm1hc2tdLGMpKX0sdHAkaXRlcigpe3JldHVybiBuZXcgYyh0aGlzKX0sJHIoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYodGhpcy4kZW50ZXJlZF9yZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlsuLi5dXFxcIik7dGhpcy4kZW50ZXJlZF9yZXByPSEwO2ZvcihsZXQgYz0wO2M8YjtjKyspYS5wdXNoKFNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy52W3RoaXMuaGVhZCtjJnRoaXMubWFza10pKTtjb25zdCBjPVNrLmFic3RyLnR5cGVOYW1lKHRoaXMpO3JldHVybiB2b2lkIDA9PT10aGlzLm1heGxlbj8odGhpcy4kZW50ZXJlZF9yZXByPXZvaWQgMCxuZXcgU2suYnVpbHRpbi5zdHIoYytcXFwiKFtcXFwiK2EuZmlsdGVyKEJvb2xlYW4pLmpvaW4oXFxcIiwgXFxcIikrXFxcIl0pXFxcIikpOm5ldyBTay5idWlsdGluLnN0cihjK1xcXCIoW1xcXCIrYS5maWx0ZXIoQm9vbGVhbikuam9pbihcXFwiLCBcXFwiKStcXFwiXSwgbWF4bGVuPVxcXCIrdGhpcy5tYXhsZW4rXFxcIilcXFwiKX0sdHAkYXNfbnVtYmVyOiEwLG5iJGJvb2woKXtyZXR1cm4gMCE9KHRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrKX0sdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJFcVxcXCIpKXJldHVybiEwO3JldHVybiExfSxzcSRjb25jYXQoYil7aWYoIShiIGluc3RhbmNlb2YgYS5kZXF1ZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJjYW4gb25seSBjb25jYXRlbmF0ZSBkZXF1ZSAobm90ICdcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInKSB0byBkZXF1ZVxcXCIpO2NvbnN0IGM9dGhpcy4kY29weSgpO2ZvcihsZXQgYT1iLnRwJGl0ZXIoKSxkPWEudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9YS50cCRpdGVybmV4dCgpKWMuJHB1c2goZCk7cmV0dXJuIGN9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFza30sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSxcXFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICd7dHAkbmFtZX0nXFxcIik7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzayxjPXRoaXMuJGNvcHkoKTtsZXQgZDswPj1hJiZjLiRjbGVhcigpO2ZvcihsZXQgZT0xO2U8YTtlKyspZm9yKGxldCBhPTA7YTxiO2ErKylkPXRoaXMuaGVhZCthJnRoaXMubWFzayxjLiRwdXNoKHRoaXMudltkXSk7cmV0dXJuIGN9LG1wJHN1YnNjcmlwdChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Ynx8YTwtYil0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTtjb25zdCBjPSgwPD1hP3RoaXMuaGVhZDp0aGlzLnRhaWwpK2EmdGhpcy5tYXNrO3JldHVybiB0aGlzLnZbY119LG1wJGFzc19zdWJzY3JpcHQoYSxiKXthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpO2NvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7aWYoYT49Y3x8YTwtYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFxcXCJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2VcXFwiKTt2b2lkIDA9PT1iP3RoaXMuZGVsJGl0ZW0oYSk6dGhpcy5zZXQkaXRlbShhLGIpfSxuYiRpbnBsYWNlX2FkZChhKXtmb3IodGhpcy5tYXhsZW49dm9pZCAwLGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSk7cmV0dXJuIHRoaXN9LG5iJGlucGxhY2VfbXVsdGlwbHkoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXFxcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAne3RwJG5hbWV9J1xcXCIpLDA+PWEmJnRoaXMuJGNsZWFyKCk7Y29uc3QgYj10aGlzLiRjb3B5KCksYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztmb3IobGV0IGQ9MTtkPGE7ZCsrKWZvcihsZXQgYT0wO2E8YzthKyspe2NvbnN0IGM9dGhpcy5oZWFkK2EmdGhpcy5tYXNrO2IuJHB1c2godGhpcy52W2NdKX1yZXR1cm4gdGhpcy52PWIudix0aGlzLmhlYWQ9Yi5oZWFkLHRoaXMudGFpbD1iLnRhaWwsdGhpcy5tYXNrPWIubWFzayx0aGlzfX0sbWV0aG9kczp7YXBwZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaChhKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxhcHBlbmRsZWZ0OnskbWV0aChhKXtyZXR1cm4gdGhpcy4kcHVzaExlZnQoYSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS5cXFwifSxjbGVhcjp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY2xlYXIoKSxTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuXFxcIn0sX19jb3B5X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuXFxcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kY29weSgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS5cXFwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztsZXQgYz0wO2ZvcihsZXQgZD0wO2Q8YjtkKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMudlt0aGlzLmhlYWQrZCZ0aGlzLm1hc2tdLGEsXFxcIkVxXFxcIikmJmMrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5jb3VudCh2YWx1ZSkgLT4gaW50ZWdlciAtLSByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlXFxcIn0sZXh0ZW5kOnskbWV0aChhKXtyZXR1cm4gdGhpcy4kZXh0ZW5kKGEpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRXh0ZW5kIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0sZXh0ZW5kbGVmdDp7JG1ldGgoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2hMZWZ0KGkpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkV4dGVuZCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZSB3aXRoIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlXFxcIn0saW5kZXg6eyRtZXRoKGEsYixjKXtjb25zdCBkPXRoaXMuJGluZGV4KGEsYixjKTtpZih2b2lkIDAhPT1kKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGQpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcXFwiIGlzIG5vdCBpbiBkZXF1ZVxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbmRleCh2YWx1ZSwgW3N0YXJ0LCBbc3RvcF1dKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS5cXFxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cXFwifSxpbnNlcnQ6eyRtZXRoKGEsYil7YT1Tay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhhLFxcXCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3Qge3RwJG5hbWV9XFxcIik7Y29uc3QgYz10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztpZih2b2lkIDAhPT10aGlzLm1heGxlbiYmYz49dGhpcy5tYXhsZW4pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiZGVxdWUgYWxyZWFkeSBhdCBpdHMgbWF4aW11bSBzaXplXFxcIik7YT5jJiYoYT1jKSxhPD0tYyYmKGE9MCk7Y29uc3QgZD0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztsZXQgZT10aGlzLnRhaWw7Zm9yKHRoaXMudGFpbD10aGlzLnRhaWwrMSZ0aGlzLm1hc2s7ZSE9PWQ7KXtjb25zdCBhPWUtMSZ0aGlzLm1hc2s7dGhpcy52W2VdPXRoaXMudlthXSxlPWF9cmV0dXJuIHRoaXMudltkXT1iLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSksU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiRC5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXhcXFwifSxwb3A6eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHBvcCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuXFxcIn0scG9wbGVmdDp7JG1ldGgoKXtyZXR1cm4gdGhpcy4kcG9wTGVmdCgpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJSZW1vdmUgYW5kIHJldHVybiB0aGUgbGVmdG1vc3QgZWxlbWVudC5cXFwifSxyZW1vdmU6eyRtZXRoKGEpe2NvbnN0IGI9dGhpcy4kaW5kZXgoYSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkrXFxcIiBpcyBub3QgaW4gZGVxdWVcXFwiKTtjb25zdCBjPXRoaXMuaGVhZCtiJnRoaXMubWFzaztmb3IobGV0IGI9YztiIT09dGhpcy50YWlsOyl7Y29uc3QgYT1iKzEmdGhpcy5tYXNrO3RoaXMudltiXT10aGlzLnZbYV0sYj1hfXRoaXMudGFpbD10aGlzLnRhaWwtMSZ0aGlzLm1hc2s7dmFyIGQ9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7ZDx0aGlzLm1hc2s+Pj4xJiZ0aGlzLiRyZXNpemUoZCx0aGlzLnYubGVuZ3RoPj4+MSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XFxcIkQucmVtb3ZlKHZhbHVlKSAtLSByZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXFwifSxfX3JldmVyc2VkX186eyRtZXRoKCl7cmV0dXJuIG5ldyBkKHRoaXMpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELl9fcmV2ZXJzZWRfXygpIC0tIHJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgZGVxdWVcXFwifSxyZXZlcnNlOnskbWV0aCgpe2NvbnN0IGM9dGhpcy5oZWFkLGQ9dGhpcy50YWlsLGU9dGhpcy5tYXNrLGY9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBnPTA7Zzx+fihmLzIpO2crKyl7Y29uc3QgZj1kLWctMSZlLGE9YytnJmUsYj10aGlzLnZbZl07dGhpcy52W2ZdPXRoaXMudlthXSx0aGlzLnZbYV09Yn1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlxcXCJELnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSpcXFwifSxyb3RhdGU6eyRtZXRoKGEpe2E9dm9pZCAwPT09YT8xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLnRhaWw7aWYoMD09PWF8fGM9PT1kKXJldHVybiB0aGlzO2lmKHRoaXMuaGVhZD1jLWEmdGhpcy5tYXNrLHRoaXMudGFpbD1kLWEmdGhpcy5tYXNrLDA8YSlmb3IobGV0IGU9MTtlPD1hO2UrKyl7Y29uc3QgZj1jLWUmdGhpcy5tYXNrLGE9ZC1lJnRoaXMubWFzazt0aGlzLnZbZl09dGhpcy52W2FdLHRoaXMudlthXT12b2lkIDB9ZWxzZSBmb3IobGV0IGU9MDtlPmE7ZS0tKXtjb25zdCBmPWQtZSZ0aGlzLm1hc2ssYT1jLWUmdGhpcy5tYXNrO3RoaXMudltmXT10aGlzLnZbYV0sdGhpcy52W2FdPXZvaWQgMH1yZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwiUm90YXRlIHRoZSBkZXF1ZSBuIHN0ZXBzIHRvIHRoZSByaWdodCAoZGVmYXVsdCBuPTEpLiAgSWYgbiBpcyBuZWdhdGl2ZSwgcm90YXRlcyBsZWZ0LlxcXCJ9fSxnZXRzZXRzOnttYXhsZW46eyRnZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5tYXhsZW4/U2suYnVpbHRpbi5ub25lLm5vbmUkOm5ldyBTay5idWlsdGluLmludF8odGhpcy5tYXhsZW4pfSwkZG9jOlxcXCJtYXhpbXVtIHNpemUgb2YgYSBkZXF1ZSBvciBOb25lIGlmIHVuYm91bmRlZFxcXCJ9fSxwcm90bzp7JGNsZWFyKCl7dGhpcy5oZWFkPTAsdGhpcy50YWlsPTAsdGhpcy5tYXNrPTEsdGhpcy52PVssLF19LCRjb3B5KCl7cmV0dXJuIG5ldyBhLmRlcXVlKHRoaXMudi5zbGljZSgwKSx0aGlzLm1heGxlbix0aGlzLmhlYWQsdGhpcy50YWlsLHRoaXMubWFzayl9LCRleHRlbmQoYSl7Zm9yKGl0PVNrLmFic3RyLml0ZXIoYSksaT1pdC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWk7aT1pdC50cCRpdGVybmV4dCgpKXRoaXMuJHB1c2goaSl9LHNldCRpdGVtKGEsYil7Y29uc3QgYz0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzazt0aGlzLnZbY109Yn0sZGVsJGl0ZW0oYSl7Y29uc3QgYj0oMDw9YT90aGlzLmhlYWQ6dGhpcy50YWlsKSthJnRoaXMubWFzaztmb3IobGV0IGM9YjtjIT09dGhpcy50YWlsOyl7Y29uc3QgYT1jKzEmdGhpcy5tYXNrO3RoaXMudltjXT10aGlzLnZbYV0sYz1hfWNvbnN0IGM9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7dGhpcy50YWlsPXRoaXMudGFpbC0xJnRoaXMubWFzayxjPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShjLHRoaXMudi5sZW5ndGg+Pj4xKX0sJHB1c2goYSl7dGhpcy52W3RoaXMudGFpbF09YSx0aGlzLnRhaWw9dGhpcy50YWlsKzEmdGhpcy5tYXNrLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcExlZnQoKSx0aGlzfSwkcHVzaExlZnQoYSl7dGhpcy5oZWFkPXRoaXMuaGVhZC0xJnRoaXMubWFzayx0aGlzLnZbdGhpcy5oZWFkXT1hLHRoaXMuaGVhZD09PXRoaXMudGFpbCYmdGhpcy4kcmVzaXplKHRoaXMudi5sZW5ndGgsdGhpcy52Lmxlbmd0aDw8MSk7Y29uc3QgYj10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztyZXR1cm4gdm9pZCAwIT09dGhpcy5tYXhsZW4mJmI+dGhpcy5tYXhsZW4mJnRoaXMuJHBvcCgpLHRoaXN9LCRwb3AoKXtpZih0aGlzLmhlYWQ9PT10aGlzLnRhaWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwicG9wIGZyb20gYW4gZW1wdHkgZGVxdWVcXFwiKTt0aGlzLnRhaWw9dGhpcy50YWlsLTEmdGhpcy5tYXNrO2NvbnN0IGE9dGhpcy52W3RoaXMudGFpbF07dGhpcy52W3RoaXMudGFpbF09dm9pZCAwO2NvbnN0IGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7cmV0dXJuIGI8dGhpcy5tYXNrPj4+MSYmdGhpcy4kcmVzaXplKGIsdGhpcy52Lmxlbmd0aD4+PjEpLGF9LCRwb3BMZWZ0KCl7aWYodGhpcy5oZWFkPT09dGhpcy50YWlsKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXFxcInBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlXFxcIik7Y29uc3QgYT10aGlzLnZbdGhpcy5oZWFkXTt0aGlzLnZbdGhpcy5oZWFkXT12b2lkIDAsdGhpcy5oZWFkPXRoaXMuaGVhZCsxJnRoaXMubWFzaztjb25zdCBiPXRoaXMudGFpbC10aGlzLmhlYWQmdGhpcy5tYXNrO3JldHVybiBiPHRoaXMubWFzaz4+PjEmJnRoaXMuJHJlc2l6ZShiLHRoaXMudi5sZW5ndGg+Pj4xKSxhfSwkcmVzaXplKGEsYil7Y29uc3QgYz10aGlzLmhlYWQsZD10aGlzLm1hc2s7aWYodGhpcy5oZWFkPTAsdGhpcy50YWlsPWEsdGhpcy5tYXNrPWItMSwwPT09YylyZXR1cm4gdm9pZCh0aGlzLnYubGVuZ3RoPWIpO2NvbnN0IGU9QXJyYXkoYik7Zm9yKGxldCBmPTA7ZjxhO2YrKyllW2ZdPXRoaXMudltjK2YmZF07dGhpcy52PWV9LCRpbmRleChhLGIsYyl7Y29uc3QgZD10aGlzLnRhaWwtdGhpcy5oZWFkJnRoaXMubWFzaztiPXZvaWQgMD09PWI/MDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKSxjPWM9PT12b2lkIDA/ZDpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhjKTtjb25zdCBlPXRoaXMuaGVhZCxmPXRoaXMubWFzayxnPXRoaXMudixoPTA8PWI/YjpiPC1kPzA6ZCtiO2M9MDw9Yz9jOmM8LWQ/MDpkK2M7Zm9yKGxldCBkPWg7ZDxjO2QrKylpZihnW2UrZCZmXT09PWEpcmV0dXJuIGR9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdLGI9dGhpcy50YWlsLXRoaXMuaGVhZCZ0aGlzLm1hc2s7Zm9yKGxldCBjPTA7YzxiOysrYyl7Y29uc3QgYj10aGlzLmhlYWQrYyZ0aGlzLm1hc2s7YS5wdXNoKHRoaXMudltiXSl9cmV0dXJuIGF9fX0pO2NvbnN0IGM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX2l0ZXJhdG9yXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gX2RlcXVlX2l0ZXJhdG9yKGEpe3RoaXMuJGluZGV4PTAsdGhpcy5kcT1hLnYsdGhpcy4kbGVuZ3RoPWEudGFpbC1hLmhlYWQmYS5tYXNrLHRoaXMuJGhlYWQ9YS5oZWFkLHRoaXMuJHRhaWw9YS50YWlsLHRoaXMuJG1hc2s9YS5tYXNrfSxpdGVybmV4dCgpe2lmKCEodGhpcy4kaW5kZXg+PXRoaXMuJGxlbmd0aCkpe2NvbnN0IGE9KDA8PXRoaXMuJGluZGV4P3RoaXMuJGhlYWQ6dGhpcy4kdGFpbCkrdGhpcy4kaW5kZXgmdGhpcy4kbWFzaztyZXR1cm4gdGhpcy4kaW5kZXgrKyx0aGlzLmRxW2FdfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbiBfX2xlbmd0aF9oaW50X18oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRsZW5ndGgtdGhpcy4kaW5kZXgpfSwkZmxhZ3M6e05vQXJnczohMH19fX0pLGQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJfY29sbGVjdGlvbnMuX2RlcXVlX3JldmVyc2VfaXRlcmF0b3JcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZGVxdWVfcmV2ZXJzZV9pdGVyYXRvcihhKXt0aGlzLiRpbmRleD0oYS50YWlsLWEuaGVhZCZhLm1hc2spLTEsdGhpcy5kcT1hLnYsdGhpcy4kaGVhZD1hLmhlYWQsdGhpcy4kbWFzaz1hLm1hc2t9LGl0ZXJuZXh0KCl7aWYoISgwPnRoaXMuJGluZGV4KSl7Y29uc3QgYT10aGlzLiRoZWFkK3RoaXMuJGluZGV4JnRoaXMuJG1hc2s7cmV0dXJuIHRoaXMuJGluZGV4LS0sdGhpcy5kcVthXX19LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn19KSxlPW5ldyBSZWdFeHAoL15bMC05XS4qLyksZj1uZXcgUmVnRXhwKC9eWzAtOV9dLiovKSxnPW5ldyBSZWdFeHAoL15cXFxcdyokLyksaD0vLC9nLGo9L1xcXFxzKy87cmV0dXJuIG5hbWVkdHVwbGUuY29fYXJnY291bnQ9MixuYW1lZHR1cGxlLmNvX2t3b25seWFyZ2NvdW50PTMsbmFtZWR0dXBsZS4ka3dkZWZzPVtTay5idWlsdGluLmJvb2wuZmFsc2UkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdLG5hbWVkdHVwbGUuY29fdmFybmFtZXM9W1xcXCJ0eXBlbmFtZVxcXCIsXFxcImZpZWxkX25hbWVzXFxcIixcXFwicmVuYW1lXFxcIixcXFwiZGVmYXVsdHNcXFwiLFxcXCJtb2R1bGVcXFwiXSxhLm5hbWVkdHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhuYW1lZHR1cGxlKSxhfVwiLFwic3JjL2xpYi9jb2xvcnN5cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29sb3JzeXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21tYW5kcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29tbWFuZHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb21waWxlYWxsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21waWxlYWxsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29tcGlsZXIvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNvbXBpbGVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29uZmlnL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb25maWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb250ZXh0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb250ZXh0bGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY29va2llbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb29raWVsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jb3B5LnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5UaGlzIGZpbGUgd2FzIG1vZGlmaWVkIGZyb20gQ1B5dGhvbi5cXG5Db3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsXFxuMjAxMSwgMjAxMiwgMjAxMywgMjAxNCwgMjAxNSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZFxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCB0eXBlc1xcbmNsYXNzIEVycm9yKEV4Y2VwdGlvbik6XFxuICAgIHBhc3NcXG5lcnJvciA9IEVycm9yIFxcbmNsYXNzIF9FbXB0eUNsYXNzOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBsb25nXFxuZXhjZXB0IE5hbWVFcnJvcjpcXG4gICAgbG9uZyA9IGludFxcblxcbmRlZiBjb3B5KHgpOlxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIGlmIGNhbGxhYmxlKHgpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgY29waWVyID0gZ2V0YXR0cihjbHMsIFxcXCJfX2NvcHlfX1xcXCIsIE5vbmUpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHJldHVybiBjb3BpZXIoeClcXG4gICAgaWYgY2xzIGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLCB0eXBlLCBmcm96ZW5zZXQsIGxvbmcpOlxcbiAgICAgICAgcmV0dXJuIHhcXG4gICAgaWYgKGNscyA9PSBsaXN0KSBvciAoY2xzID09IGRpY3QpIG9yIChjbHMgPT0gc2V0KSBvciAoY2xzID09IHNsaWNlKTpcXG4gICAgICAgIHJldHVybiBjbHMoeClcXG4gICAgdHJ5OlxcbiAgICAgICAgZ2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX2dldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgc2V0c3RhdGUgPSBnZXRhdHRyKHgsIFxcXCJfX3NldHN0YXRlX19cXFwiLCBOb25lKVxcbiAgICAgICAgaW5pdGFyZ3MgPSBnZXRhdHRyKHgsIFxcXCJfX2dldGluaXRhcmdzX19cXFwiLCBOb25lKVxcbiAgICBleGNlcHQ6XFxuICAgICAgICByZWR1Y3RvciA9IEZhbHNlXFxuICAgIGlmIGdldHN0YXRlIG9yIHNldHN0YXRlIG9yIGluaXRhcmdzOlxcbiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiU2t1bHB0IGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcHlpbmcgd2l0aCB1c2VyLWRlZmluZWQgX19nZXRzdGF0ZV9fLCBfX3NldHN0YXRlX18gb3IgX19nZXRpbml0YXJnc19fKClcXFwiKVxcbiAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgIHJ2ID0gcmVkdWN0b3IoNClcXG4gICAgZWxzZTpcXG4gICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgIGVsaWYgc3RyKGNscylbMTo2XSA9PSBcXFwiY2xhc3NcXFwiOlxcbiAgICAgICAgICAgIGNvcGllciA9IF9jb3B5X2luc3RcXG4gICAgICAgICAgICByZXR1cm4gY29waWVyKHgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEVycm9yKFxcXCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApXFxuXFxuZGVmIF9jb3B5X2luc3QoeCk6XFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fY29weV9fJyk6XFxuICAgICAgICByZXR1cm4geC5fX2NvcHlfXygpXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOlxcbiAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKClcXG4gICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncylcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSBfRW1wdHlDbGFzcygpXFxuICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fXFxuICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0c3RhdGVfXycpOlxcbiAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpXFxuICAgIGVsc2U6XFxuICAgICAgICBzdGF0ZSA9IHguX19kaWN0X19cXG4gICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSlcXG4gICAgZWxzZTpcXG4gICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICByZXR1cm4geVxcblxcbmQgPSBfZGVlcGNvcHlfZGlzcGF0Y2ggPSB7fVxcblxcbmRlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOlxcbiAgICBcXFwiXFxcIlxcXCJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy5cXG4gICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgbW9yZSBpbmZvLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgaWYgbWVtbyBpcyBOb25lOlxcbiAgICAgICAgbWVtbyA9IHt9XFxuICAgIGlkeCA9IGlkKHgpXFxuICAgIHkgPSBtZW1vLmdldChpZHgsIF9uaWwpXFxuICAgIGlmIHkgaXMgbm90IF9uaWw6XFxuICAgICAgICByZXR1cm4geVxcbiAgICBjbHMgPSB0eXBlKHgpXFxuICAgIHRyeTpcXG4gICAgICAgIGdldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19nZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cih4LCBcXFwiX19zZXRzdGF0ZV9fXFxcIiwgTm9uZSlcXG4gICAgICAgIGluaXRhcmdzID0gZ2V0YXR0cih4LCBcXFwiX19nZXRpbml0YXJnc19fXFxcIiwgTm9uZSlcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmVkdWN0b3IgPSBGYWxzZVxcbiAgICBpZiBnZXRzdGF0ZSBvciBzZXRzdGF0ZSBvciBpbml0YXJnczpcXG4gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIlNrdWxwdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBjb3B5aW5nIHdpdGggdXNlci1kZWZpbmVkIF9fZ2V0c3RhdGVfXywgX19zZXRzdGF0ZV9fIG9yIF9fZ2V0aW5pdGFyZ3NfXygpXFxcIilcXG4gICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoLmdldChjbHMpXFxuICAgIGlmIGNvcGllcjpcXG4gICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbylcXG4gICAgZWxpZiBzdHIoY2xzKVsxOjZdID09IFxcXCJjbGFzc1xcXCI6XFxuICAgICAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2hbXFxcIkluc3RhbmNlVHlwZVxcXCJdXFxuICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pXFxuICAgIGVsc2U6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaXNzYyA9IGlzc3ViY2xhc3MoY2xzLCB0eXBlKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBjbHMgaXMgbm90IGEgY2xhc3MgKG9sZCBCb29zdDsgc2VlIFNGICM1MDIwODUpXFxuICAgICAgICAgICAgaXNzYyA9IDBcXG4gICAgICAgIGlmIGlzc2M6XFxuICAgICAgICAgICAgeSA9IF9kZWVwY29weV9hdG9taWMoeCwgbWVtbylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgY29waWVyID0gZ2V0YXR0cih4LCBcXFwiX19kZWVwY29weV9fXFxcIiwgTm9uZSlcXG4gICAgICAgICAgICBpZiBjb3BpZXI6XFxuICAgICAgICAgICAgICAgIHkgPSBjb3BpZXIobWVtbylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgXFxcIl9fcmVkdWNlX2V4X19cXFwiLCBOb25lKVxcbiAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoMilcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCBcXFwiX19yZWR1Y2VfX1xcXCIsIE5vbmUpXFxuICAgICAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKClcXG4gICAgICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1bihkZWVwKWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzXFxcIiAlIGNscylcXG4gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbylcXG4gICAgbWVtb1tpZHhdID0geVxcbiAgICBfa2VlcF9hbGl2ZSh4LCBtZW1vKSAjIE1ha2Ugc3VyZSB4IGxpdmVzIGF0IGxlYXN0IGFzIGxvbmcgYXMgZFxcbiAgICByZXR1cm4geVxcblxcbmRlZiBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pOlxcbiAgICByZXR1cm4geFxcbmRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGUoTm90SW1wbGVtZW50ZWQpXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtib29sXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW2NvbXBsZXhdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFtieXRlc10gPSBfZGVlcGNvcHlfYXRvbWljXFxuZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgdHJ5OlxcbiMgZFt0eXBlcy5Db2RlVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuIyAgIHBhc3NcXG5kW3R5cGVdID0gX2RlZXBjb3B5X2F0b21pY1xcbiMgZFt0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWNcXG5kW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuIyBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWNcXG5cXG5kZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6XFxuICAgIHkgPSBbXVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGEgaW4geDpcXG4gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKVxcbiAgICByZXR1cm4geVxcbmRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdFxcblxcbmRlZiBfZGVlcGNvcHlfc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBzZXQoW10pICAjIG1ha2UgZW1wdHkgc2V0XFxuICAgIG1lbW9baWQoeCldID0gcmVzdWx0ICAjIHJlZ2lzdGVyIHRoaXMgc2V0IGluIHRoZSBtZW1vIGZvciBsb29wIGNoZWNraW5nXFxuICAgIGZvciBhIGluIHg6ICAgIyBnbyB0aHJvdWdoIGVsZW1lbnRzIG9mIHNldFxcbiAgICAgICAgcmVzdWx0LmFkZChkZWVwY29weShhLCBtZW1vKSkgICMgYWRkIHRoZSBjb3BpZWQgZWxlbWVudHMgaW50byB0aGUgbmV3IHNldFxcbiAgICByZXR1cm4gcmVzdWx0ICMgcmV0dXJuIHRoZSBuZXcgc2V0XFxuZFtzZXRdID0gX2RlZXBjb3B5X3NldFxcblxcbmRlZiBfZGVlcGNvcHlfZnJvemVuc2V0KHgsIG1lbW8pOlxcbiAgICByZXN1bHQgPSBmcm96ZW5zZXQoX2RlZXBjb3B5X3NldCh4LG1lbW8pKSBcXG4gICAgbWVtb1tpZCh4KV0gPSByZXN1bHQgXFxuICAgIHJldHVybiByZXN1bHRcXG5kW2Zyb3plbnNldF0gPSBfZGVlcGNvcHlfZnJvemVuc2V0XFxuXFxuZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKTpcXG4gICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XVxcbiAgICAjIFdlJ3JlIG5vdCBnb2luZyB0byBwdXQgdGhlIHR1cGxlIGluIHRoZSBtZW1vLCBidXQgaXQncyBzdGlsbCBpbXBvcnRhbnQgd2VcXG4gICAgIyBjaGVjayBmb3IgaXQsIGluIGNhc2UgdGhlIHR1cGxlIGNvbnRhaW5zIHJlY3Vyc2l2ZSBtdXRhYmxlIHN0cnVjdHVyZXMuXFxuICAgIHRyeTpcXG4gICAgICAgIHJldHVybiBtZW1vW2lkKHgpXVxcbiAgICBleGNlcHQgS2V5RXJyb3I6XFxuICAgICAgICBwYXNzXFxuICAgIGZvciBrLCBqIGluIHppcCh4LCB5KTpcXG4gICAgICAgIGlmIGsgaXMgbm90IGo6XFxuICAgICAgICAgICAgeSA9IHR1cGxlKHkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgZWxzZTpcXG4gICAgICAgIHkgPSB4XFxuICAgIHJldHVybiB5XFxuZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGVcXG5cXG5kZWYgX2RlZXBjb3B5X2RpY3QoeCwgbWVtbyk6XFxuICAgIHkgPSB7fVxcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOlxcbiAgICAgICAgeVtkZWVwY29weShrZXksIG1lbW8pXSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKVxcbiAgICByZXR1cm4geVxcbmRbZGljdF0gPSBfZGVlcGNvcHlfZGljdFxcblxcbiMgZGVmIF9kZWVwY29weV9tZXRob2QoeCwgbWVtbyk6ICMgQ29weSBpbnN0YW5jZSBtZXRob2RzXFxuIyAgICAgeSA9IHR5cGUoeCkoeC5pbV9mdW5jLCBkZWVwY29weSh4LmltX3NlbGYsIG1lbW8pLCB4LmltX2NsYXNzKTtcXG4jICAgICByZXR1cm4geVxcbmRbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljXFxuXFxuZGVmIF9kZWVwY29weV9pbnN0KHgsIG1lbW8pOlxcbiAgICBpZiBoYXNhdHRyKHgsICdfX2RlZXBjb3B5X18nKTpcXG4gICAgICAgICByZXR1cm4geC5fX2RlZXBjb3B5X18obWVtbylcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6XFxuICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKVxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgICAgICB5ID0geC5fX2NsYXNzX18oKmFyZ3MpXFxuICAgIGVsc2U6XFxuICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKVxcbiAgICAgICAgeS5fX2NsYXNzX18gPSB4Ll9fY2xhc3NfX1xcbiAgICBtZW1vW2lkKHgpXSA9IHlcXG4gICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6XFxuICAgICAgICBzdGF0ZSA9IHguX19nZXRzdGF0ZV9fKClcXG4gICAgZWxzZTpcXG4gICAgICAgIHN0YXRlID0geC5fX2RpY3RfX1xcbiAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKTpcXG4gICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKVxcbiAgICBlbHNlOlxcbiAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpXFxuICAgICAgICByZXR1cm4geVxcbmRbXFxcIkluc3RhbmNlVHlwZVxcXCJdID0gX2RlZXBjb3B5X2luc3RcXG5cXG5kZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6XFxuICAgIFxcXCJcXFwiXFxcIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby5cXG4gICAgQmVjYXVzZSB3ZSByZW1lbWJlciBvYmplY3RzIGJ5IHRoZWlyIGlkLCB3ZSBoYXZlXFxuICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0XFxuICAgIGFsaXZlIGJ5IHJlZmVyZW5jaW5nIHRoZW0uXFxuICAgIFdlIHN0b3JlIGEgcmVmZXJlbmNlIGF0IHRoZSBpZCBvZiB0aGUgbWVtbywgd2hpY2ggc2hvdWxkXFxuICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5XFxuICAgIHRoZSBtZW1vIGl0c2VsZi4uLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdHJ5OlxcbiAgICAgICAgbWVtb1tpZChtZW1vKV0uYXBwZW5kKHgpXFxuICAgIGV4Y2VwdCBLZXlFcnJvcjpcXG4gICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pXFxuICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF1cXG5cXG5kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKTpcXG4gICAgICAgIHJldHVybiB4XFxuICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKVxcbiAgICBpZiBtZW1vIGlzIE5vbmU6XFxuICAgICAgICBtZW1vID0ge31cXG4gICAgbiA9IGxlbihpbmZvKVxcbiAgICBhc3NlcnQgbiBpbiAoMiwgMywgNCwgNSlcXG4gICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXVxcbiAgICBpZiBuID4gMjpcXG4gICAgICAgIHN0YXRlID0gaW5mb1syXVxcbiAgICBlbHNlOlxcbiAgICAgICAgc3RhdGUgPSBOb25lXFxuICAgIGlmIG4gPiAzOlxcbiAgICAgICAgbGlzdGl0ZXIgPSBpbmZvWzNdXFxuICAgIGVsc2U6XFxuICAgICAgICBsaXN0aXRlciA9IE5vbmVcXG4gICAgaWYgbiA+IDQ6XFxuICAgICAgICBkaWN0aXRlciA9IGluZm9bNF1cXG4gICAgZWxzZTpcXG4gICAgICAgIGRpY3RpdGVyID0gTm9uZVxcbiAgICBpZiBkZWVwOlxcbiAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pXFxuICAgIHkgPSBjYWxsYWJsZSgqYXJncylcXG4gICAgbWVtb1tpZCh4KV0gPSB5XFxuXFxuICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOlxcbiAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKVxcbiAgICAgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6XFxuICAgICAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIHR1cGxlKSBhbmQgbGVuKHN0YXRlKSA9PSAyOlxcbiAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzbG90c3RhdGUgPSBOb25lXFxuICAgICAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKVxcbiAgICAgICAgICAgIGlmIHNsb3RzdGF0ZSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2xvdHN0YXRlLml0ZW1zKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpXFxuXFxuICAgIGlmIGxpc3RpdGVyIGlzIG5vdCBOb25lOlxcbiAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6XFxuICAgICAgICAgICAgaWYgZGVlcDpcXG4gICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pXFxuICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSlcXG4gICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6XFxuICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjpcXG4gICAgICAgICAgICBpZiBkZWVwOlxcbiAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pXFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pXFxuICAgICAgICAgICAgeVtrZXldID0gdmFsdWVcXG4gICAgcmV0dXJuIHlcXG5cXG5kZWwgZFxcblxcbmRlbCB0eXBlc1xcblxcbiMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X19cXG5jbGFzcyBfRW1wdHlDbGFzczpcXG4gICAgcGFzc1wiLFwic3JjL2xpYi9jb3B5X3JlZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY29weV9yZWcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9jc3YucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImNzdiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N0eXBlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3R5cGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWNob2xpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2N1cnNlcy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiY3Vyc2VzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGF0ZXRpbWUucHlcIjpcIlxcXCJcXFwiXFxcIkNvbmNyZXRlIGRhdGUvdGltZSBhbmQgcmVsYXRlZCB0eXBlcyAtLSBwcm90b3R5cGUgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLlxcblxcblNlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9Gcm9udFBhZ2VcXG5cXG5TZWUgYWxzbyBodHRwOi8vZGlyLnlhaG9vLmNvbS9SZWZlcmVuY2UvY2FsZW5kYXJzL1xcblxcbkZvciBhIHByaW1lciBvbiBEU1QsIGluY2x1ZGluZyBtYW55IGN1cnJlbnQgRFNUIHJ1bGVzLCBzZWVcXG5odHRwOi8vd2ViZXhoaWJpdHMub3JnL2RheWxpZ2h0c2F2aW5nL1xcblxcbkZvciBtb3JlIGFib3V0IERTVCB0aGFuIHlvdSBldmVyIHdhbnRlZCB0byBrbm93LCBzZWVcXG5mdHA6Ly9lbHNpZS5uY2kubmloLmdvdi9wdWIvXFxuXFxuU291cmNlcyBmb3IgdGltZSB6b25lIGFuZCBEU1QgZGF0YTogaHR0cDovL3d3dy50d2luc3VuLmNvbS90ei90ei1saW5rLmh0bVxcblxcblRoaXMgd2FzIG9yaWdpbmFsbHkgY29waWVkIGZyb20gdGhlIHNhbmRib3ggb2YgdGhlIENQeXRob24gQ1ZTIHJlcG9zaXRvcnkuXFxuVGhhbmtzIHRvIFRpbSBQZXRlcnMgZm9yIHN1Z2dlc3RpbmcgdXNpbmcgaXQuXFxuXFxuVGhpcyB3YXMgdGhlbiBjb3BpZWQgZnJvbSBQeVB5IHY1LjEuMCBpbnRvIFNrdWxwdCBieSBNZXJlZHlkZCBMdWZmLCByZW1vdmluZ1xcbidmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyAoYW5kIHJlcGxhY2luZyBkaXZpc2lvbiBvcGVyYXRvcnMgYWNjb3JkaW5nbHkpXFxuYW5kIHBpY2tsZSBzdXBwb3J0ICh3aGljaCByZXF1aXJlcyAnc3RydWN0Jywgd2hpY2ggU2t1bHB0IGRvZXMgbm90IGN1cnJlbnRseVxcblthcyBvZiAzMS84LzIwMTZdIGhhdmUpXFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IHRpbWUgYXMgX3RpbWVcXG5pbXBvcnQgbWF0aCBhcyBfbWF0aFxcblxcbiMgUHl0aG9uIDItdnMtMyBjb21wYXQgaGFja1xcbmltcG9ydCBzeXNcXG51bmljb2RlID0gdW5pY29kZSBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKSBlbHNlIHN0clxcblxcbl9TRU5USU5FTCA9IG9iamVjdCgpXFxuXFxuZGVmIF9jbXAoeCwgeSk6XFxuICAgIHJldHVybiAwIGlmIHggPT0geSBlbHNlIDEgaWYgeCA+IHkgZWxzZSAtMVxcblxcbmRlZiBfcm91bmQoeCk6XFxuICAgIHJldHVybiBpbnQoX21hdGguZmxvb3IoeCArIDAuNSkgaWYgeCA+PSAwLjAgZWxzZSBfbWF0aC5jZWlsKHggLSAwLjUpKVxcblxcbk1JTllFQVIgPSAxXFxuTUFYWUVBUiA9IDk5OTlcXG5fTUlOWUVBUkZNVCA9IDE5MDBcXG5cXG5fTUFYX0RFTFRBX0RBWVMgPSA5OTk5OTk5OTlcXG5cXG4jIFV0aWxpdHkgZnVuY3Rpb25zLCBhZGFwdGVkIGZyb20gUHl0aG9uJ3MgRGVtby9jbGFzc2VzL0RhdGVzLnB5LCB3aGljaFxcbiMgYWxzbyBhc3N1bWVzIHRoZSBjdXJyZW50IEdyZWdvcmlhbiBjYWxlbmRhciBpbmRlZmluaXRlbHkgZXh0ZW5kZWQgaW5cXG4jIGJvdGggZGlyZWN0aW9ucy4gIERpZmZlcmVuY2U6ICBEYXRlcy5weSBjYWxscyBKYW51YXJ5IDEgb2YgeWVhciAwIGRheVxcbiMgbnVtYmVyIDEuICBUaGUgY29kZSBoZXJlIGNhbGxzIEphbnVhcnkgMSBvZiB5ZWFyIDEgZGF5IG51bWJlciAxLiAgVGhpcyBpc1xcbiMgdG8gbWF0Y2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIFxcXCJwcm9sZXB0aWMgR3JlZ29yaWFuXFxcIiBjYWxlbmRhciBpbiBEZXJzaG93aXR6XFxuIyBhbmQgUmVpbmdvbGQncyBcXFwiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zXFxcIiwgd2hlcmUgaXQncyB0aGUgYmFzZSBjYWxlbmRhclxcbiMgZm9yIGFsbCBjb21wdXRhdGlvbnMuICBTZWUgdGhlIGJvb2sgZm9yIGFsZ29yaXRobXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlblxcbiMgcHJvbGVwdGljIEdyZWdvcmlhbiBvcmRpbmFscyBhbmQgbWFueSBvdGhlciBjYWxlbmRhciBzeXN0ZW1zLlxcblxcbl9EQVlTX0lOX01PTlRIID0gWy0xLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVxcblxcbl9EQVlTX0JFRk9SRV9NT05USCA9IFstMV1cXG5kYm0gPSAwXFxuZm9yIGRpbSBpbiBfREFZU19JTl9NT05USFsxOl06XFxuICAgIF9EQVlTX0JFRk9SRV9NT05USC5hcHBlbmQoZGJtKVxcbiAgICBkYm0gKz0gZGltXFxuZGVsIGRibSwgZGltXFxuXFxuZGVmIF9pc19sZWFwKHllYXIpOlxcbiAgICBcXFwieWVhciAtPiAxIGlmIGxlYXAgeWVhciwgZWxzZSAwLlxcXCJcXG4gICAgcmV0dXJuIHllYXIgJSA0ID09IDAgYW5kICh5ZWFyICUgMTAwICE9IDAgb3IgeWVhciAlIDQwMCA9PSAwKVxcblxcbmRlZiBfZGF5c19iZWZvcmVfeWVhcih5ZWFyKTpcXG4gICAgXFxcInllYXIgLT4gbnVtYmVyIG9mIGRheXMgYmVmb3JlIEphbnVhcnkgMXN0IG9mIHllYXIuXFxcIlxcbiAgICB5ID0geWVhciAtIDFcXG4gICAgcmV0dXJuIHkqMzY1ICsgeS8vNCAtIHkvLzEwMCArIHkvLzQwMFxcblxcbmRlZiBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB0aGF0IG1vbnRoIGluIHRoYXQgeWVhci5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCBtb250aFxcbiAgICBpZiBtb250aCA9PSAyIGFuZCBfaXNfbGVhcCh5ZWFyKTpcXG4gICAgICAgIHJldHVybiAyOVxcbiAgICByZXR1cm4gX0RBWVNfSU5fTU9OVEhbbW9udGhdXFxuXFxuZGVmIF9kYXlzX2JlZm9yZV9tb250aCh5ZWFyLCBtb250aCk6XFxuICAgIFxcXCJ5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB5ZWFyIHByZWNlZGluZyBmaXJzdCBkYXkgb2YgbW9udGguXFxcIlxcbiAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMiwgJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInXFxuICAgIHJldHVybiBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgX2lzX2xlYXAoeWVhcikpXFxuXFxuZGVmIF95bWQyb3JkKHllYXIsIG1vbnRoLCBkYXkpOlxcbiAgICBcXFwieWVhciwgbW9udGgsIGRheSAtPiBvcmRpbmFsLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuICAgIGFzc2VydCAxIDw9IG1vbnRoIDw9IDEyLCAnbW9udGggbXVzdCBiZSBpbiAxLi4xMidcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGFzc2VydCAxIDw9IGRheSA8PSBkaW0sICgnZGF5IG11c3QgYmUgaW4gMS4uJWQnICUgZGltKVxcbiAgICByZXR1cm4gKF9kYXlzX2JlZm9yZV95ZWFyKHllYXIpICtcXG4gICAgICAgICAgICBfZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICtcXG4gICAgICAgICAgICBkYXkpXFxuXFxuX0RJNDAwWSA9IF9kYXlzX2JlZm9yZV95ZWFyKDQwMSkgICAgIyBudW1iZXIgb2YgZGF5cyBpbiA0MDAgeWVhcnNcXG5fREkxMDBZID0gX2RheXNfYmVmb3JlX3llYXIoMTAxKSAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiIDEwMCAgIFxcXCJcXG5fREk0WSAgID0gX2RheXNfYmVmb3JlX3llYXIoNSkgICAgICAjICAgIFxcXCIgICAgXFxcIiAgIFxcXCIgICBcXFwiICAgNCAgIFxcXCJcXG5cXG4jIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbSBwYXN0aW5nXFxuIyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy5cXG5hc3NlcnQgX0RJNFkgPT0gNCAqIDM2NSArIDFcXG5cXG4jIFNpbWlsYXJseSwgYSA0MDAteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb21cXG4jIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTQwMFkgPT0gNCAqIF9ESTEwMFkgKyAxXFxuXFxuIyBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tXFxuIyBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuXFxuYXNzZXJ0IF9ESTEwMFkgPT0gMjUgKiBfREk0WSAtIDFcXG5cXG5fVVNfUEVSX1VTID0gMVxcbl9VU19QRVJfTVMgPSAxMDAwXFxuX1VTX1BFUl9TRUNPTkQgPSAxMDAwMDAwXFxuX1VTX1BFUl9NSU5VVEUgPSA2MDAwMDAwMFxcbl9TRUNPTkRTX1BFUl9EQVkgPSAyNCAqIDM2MDBcXG5fVVNfUEVSX0hPVVIgPSAzNjAwMDAwMDAwXFxuX1VTX1BFUl9EQVkgPSA4NjQwMDAwMDAwMFxcbl9VU19QRVJfV0VFSyA9IDYwNDgwMDAwMDAwMFxcblxcbmRlZiBfb3JkMnltZChuKTpcXG4gICAgXFxcIm9yZGluYWwgLT4gKHllYXIsIG1vbnRoLCBkYXkpLCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS5cXFwiXFxuXFxuICAgICMgbiBpcyBhIDEtYmFzZWQgaW5kZXgsIHN0YXJ0aW5nIGF0IDEtSmFuLTEuICBUaGUgcGF0dGVybiBvZiBsZWFwIHllYXJzXFxuICAgICMgcmVwZWF0cyBleGFjdGx5IGV2ZXJ5IDQwMCB5ZWFycy4gIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byBmaW5kIHRoZVxcbiAgICAjIGNsb3Nlc3QgNDAwLXllYXIgYm91bmRhcnkgYXQgb3IgYmVmb3JlIG4sIHRoZW4gd29yayB3aXRoIHRoZSBvZmZzZXRcXG4gICAgIyBmcm9tIHRoYXQgYm91bmRhcnkgdG8gbi4gIExpZmUgaXMgbXVjaCBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbVxcbiAgICAjIG4gZmlyc3QgLS0gdGhlbiB0aGUgdmFsdWVzIG9mIG4gYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseVxcbiAgICAjIHRob3NlIGRpdmlzaWJsZSBieSBfREk0MDBZOlxcbiAgICAjXFxuICAgICMgICAgIEQgIE0gICBZICAgICAgICAgICAgbiAgICAgICAgICAgICAgbi0xXFxuICAgICMgICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tXFxuICAgICMgICAgIDMxIERlYyAtNDAwICAgICAgICAtX0RJNDAwWSAgICAgICAtX0RJNDAwWSAtMVxcbiAgICAjICAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1fREk0MDBZICsxICAgLV9ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAuLi5cXG4gICAgIyAgICAgMzAgRGVjICAwMDAgICAgICAgIC0xICAgICAgICAgICAgIC0yXFxuICAgICMgICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMVxcbiAgICAjICAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgICA0MDAteWVhciBib3VuZGFyeVxcbiAgICAjICAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDFcXG4gICAgIyAgICAgIDMgSmFuICAwMDEgICAgICAgICAzICAgICAgICAgICAgICAyXFxuICAgICMgICAgIC4uLlxcbiAgICAjICAgICAzMSBEZWMgIDQwMCAgICAgICAgIF9ESTQwMFkgICAgICAgIF9ESTQwMFkgLTFcXG4gICAgIyAgICAgIDEgSmFuICA0MDEgICAgICAgICBfREk0MDBZICsxICAgICBfREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnlcXG4gICAgbiAtPSAxXFxuICAgIG40MDAsIG4gPSBkaXZtb2QobiwgX0RJNDAwWSlcXG4gICAgeWVhciA9IG40MDAgKiA0MDAgKyAxICAgIyAuLi4sIC0zOTksIDEsIDQwMSwgLi4uXFxuXFxuICAgICMgTm93IG4gaXMgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCwgaW4gZGF5cywgZnJvbSBKYW51YXJ5IDEgb2YgeWVhciwgdG9cXG4gICAgIyB0aGUgZGVzaXJlZCBkYXRlLiAgTm93IGNvbXB1dGUgaG93IG1hbnkgMTAwLXllYXIgY3ljbGVzIHByZWNlZGUgbi5cXG4gICAgIyBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbFxcbiAgICAjIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUgZGVzaXJlZFxcbiAgICAjIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuXFxuICAgIG4xMDAsIG4gPSBkaXZtb2QobiwgX0RJMTAwWSlcXG5cXG4gICAgIyBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuXFxuICAgIG40LCBuID0gZGl2bW9kKG4sIF9ESTRZKVxcblxcbiAgICAjIEFuZCBub3cgaG93IG1hbnkgc2luZ2xlIHllYXJzLiAgQWdhaW4gbjEgY2FuIGJlIDQsIGFuZCBhZ2FpbiBtZWFuaW5nXFxuICAgICMgdGhhdCB0aGUgZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiB0aGUgNC15ZWFyIGN5Y2xlLlxcbiAgICBuMSwgbiA9IGRpdm1vZChuLCAzNjUpXFxuXFxuICAgIHllYXIgKz0gbjEwMCAqIDEwMCArIG40ICogNCArIG4xXFxuICAgIGlmIG4xID09IDQgb3IgbjEwMCA9PSA0OlxcbiAgICAgICAgYXNzZXJ0IG4gPT0gMFxcbiAgICAgICAgcmV0dXJuIHllYXItMSwgMTIsIDMxXFxuXFxuICAgICMgTm93IHRoZSB5ZWFyIGlzIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSBKYW51YXJ5IDEuICBXZSBmaW5kXFxuICAgICMgdGhlIG1vbnRoIHZpYSBhbiBlc3RpbWF0ZSB0aGF0J3MgZWl0aGVyIGV4YWN0IG9yIG9uZSB0b28gbGFyZ2UuXFxuICAgIGxlYXB5ZWFyID0gbjEgPT0gMyBhbmQgKG40ICE9IDI0IG9yIG4xMDAgPT0gMylcXG4gICAgYXNzZXJ0IGxlYXB5ZWFyID09IF9pc19sZWFwKHllYXIpXFxuICAgIG1vbnRoID0gKG4gKyA1MCkgPj4gNVxcbiAgICBwcmVjZWRpbmcgPSBfREFZU19CRUZPUkVfTU9OVEhbbW9udGhdICsgKG1vbnRoID4gMiBhbmQgbGVhcHllYXIpXFxuICAgIGlmIHByZWNlZGluZyA+IG46ICAjIGVzdGltYXRlIGlzIHRvbyBsYXJnZVxcbiAgICAgICAgbW9udGggLT0gMVxcbiAgICAgICAgcHJlY2VkaW5nIC09IF9EQVlTX0lOX01PTlRIW21vbnRoXSArIChtb250aCA9PSAyIGFuZCBsZWFweWVhcilcXG4gICAgbiAtPSBwcmVjZWRpbmdcXG4gICAgYXNzZXJ0IDAgPD0gbiA8IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcblxcbiAgICAjIE5vdyB0aGUgeWVhciBhbmQgbW9udGggYXJlIGNvcnJlY3QsIGFuZCBuIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGVcXG4gICAgIyBzdGFydCBvZiB0aGF0IG1vbnRoOiAgd2UncmUgZG9uZSFcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBuKzFcXG5cXG4jIE1vbnRoIGFuZCBkYXkgbmFtZXMuICBGb3IgbG9jYWxpemVkIHZlcnNpb25zLCBzZWUgdGhlIGNhbGVuZGFyIG1vZHVsZS5cXG5fTU9OVEhOQU1FUyA9IFtOb25lLCBcXFwiSmFuXFxcIiwgXFxcIkZlYlxcXCIsIFxcXCJNYXJcXFwiLCBcXFwiQXByXFxcIiwgXFxcIk1heVxcXCIsIFxcXCJKdW5cXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgIFxcXCJKdWxcXFwiLCBcXFwiQXVnXFxcIiwgXFxcIlNlcFxcXCIsIFxcXCJPY3RcXFwiLCBcXFwiTm92XFxcIiwgXFxcIkRlY1xcXCJdXFxuX0RBWU5BTUVTID0gW05vbmUsIFxcXCJNb25cXFwiLCBcXFwiVHVlXFxcIiwgXFxcIldlZFxcXCIsIFxcXCJUaHVcXFwiLCBcXFwiRnJpXFxcIiwgXFxcIlNhdFxcXCIsIFxcXCJTdW5cXFwiXVxcblxcblxcbmRlZiBfYnVpbGRfc3RydWN0X3RpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgZHN0ZmxhZyk6XFxuICAgIHdkYXkgPSAoX3ltZDJvcmQoeSwgbSwgZCkgKyA2KSAlIDdcXG4gICAgZG51bSA9IF9kYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGRcXG4gICAgcmV0dXJuIF90aW1lLnN0cnVjdF90aW1lKCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZGF5LCBkbnVtLCBkc3RmbGFnKSlcXG5cXG5kZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzKTpcXG4gICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLlxcbiAgICByZXN1bHQgPSBcXFwiJTAyZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgIGlmIHVzOlxcbiAgICAgICAgcmVzdWx0ICs9IFxcXCIuJTA2ZFxcXCIgJSB1c1xcbiAgICByZXR1cm4gcmVzdWx0XFxuXFxuIyBDb3JyZWN0bHkgc3Vic3RpdHV0ZSBmb3IgJXogYW5kICVaIGVzY2FwZXMgaW4gc3RyZnRpbWUgZm9ybWF0cy5cXG5kZWYgX3dyYXBfc3RyZnRpbWUob2JqZWN0LCBmb3JtYXQsIHRpbWV0dXBsZSk6XFxuICAgIHllYXIgPSB0aW1ldHVwbGVbMF1cXG4gICAgaWYgeWVhciA8IF9NSU5ZRUFSRk1UOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwieWVhcj0lZCBpcyBiZWZvcmUgJWQ7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm1ldGhvZHMgcmVxdWlyZSB5ZWFyID49ICVkXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICh5ZWFyLCBfTUlOWUVBUkZNVCwgX01JTllFQVJGTVQpKVxcbiAgICAjIERvbid0IGNhbGwgdXRjb2Zmc2V0KCkgb3IgdHpuYW1lKCkgdW5sZXNzIGFjdHVhbGx5IG5lZWRlZC5cXG4gICAgZnJlcGxhY2UgPSBOb25lICAjIHRoZSBzdHJpbmcgdG8gdXNlIGZvciAlZlxcbiAgICB6cmVwbGFjZSA9IE5vbmUgICMgdGhlIHN0cmluZyB0byB1c2UgZm9yICV6XFxuICAgIFpyZXBsYWNlID0gTm9uZSAgIyB0aGUgc3RyaW5nIHRvIHVzZSBmb3IgJVpcXG5cXG4gICAgIyBTY2FuIGZvcm1hdCBmb3IgJXogYW5kICVaIGVzY2FwZXMsIHJlcGxhY2luZyBhcyBuZWVkZWQuXFxuICAgIG5ld2Zvcm1hdCA9IFtdXFxuICAgIHB1c2ggPSBuZXdmb3JtYXQuYXBwZW5kXFxuICAgIGksIG4gPSAwLCBsZW4oZm9ybWF0KVxcbiAgICB3aGlsZSBpIDwgbjpcXG4gICAgICAgIGNoID0gZm9ybWF0W2ldXFxuICAgICAgICBpICs9IDFcXG4gICAgICAgIGlmIGNoID09ICclJzpcXG4gICAgICAgICAgICBpZiBpIDwgbjpcXG4gICAgICAgICAgICAgICAgY2ggPSBmb3JtYXRbaV1cXG4gICAgICAgICAgICAgICAgaSArPSAxXFxuICAgICAgICAgICAgICAgIGlmIGNoID09ICdmJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIGZyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgZnJlcGxhY2UgPSAnJTA2ZCcgJSBnZXRhdHRyKG9iamVjdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pY3Jvc2Vjb25kJywgMClcXG4gICAgICAgICAgICAgICAgICAgIG5ld2Zvcm1hdC5hcHBlbmQoZnJlcGxhY2UpXFxuICAgICAgICAgICAgICAgIGVsaWYgY2ggPT0gJ3onOlxcbiAgICAgICAgICAgICAgICAgICAgaWYgenJlcGxhY2UgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICB6cmVwbGFjZSA9IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsIFxcXCJfdXRjb2Zmc2V0XFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG9iamVjdC5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICcrJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IDwgMDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9ICctJ1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChvZmZzZXQsIDYwKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenJlcGxhY2UgPSAnJWMlMDJkJTAyZCcgJSAoc2lnbiwgaCwgbSlcXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAnJScgbm90IGluIHpyZXBsYWNlXFxuICAgICAgICAgICAgICAgICAgICBuZXdmb3JtYXQuYXBwZW5kKHpyZXBsYWNlKVxcbiAgICAgICAgICAgICAgICBlbGlmIGNoID09ICdaJzpcXG4gICAgICAgICAgICAgICAgICAgIGlmIFpyZXBsYWNlIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCBcXFwidHpuYW1lXFxcIik6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBvYmplY3QudHpuYW1lKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcyBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyZnRpbWUgaXMgZ29pbmcgdG8gaGF2ZSBhdCB0aGlzOiBlc2NhcGUgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWnJlcGxhY2UgPSBzLnJlcGxhY2UoJyUnLCAnJSUnKVxcbiAgICAgICAgICAgICAgICAgICAgbmV3Zm9ybWF0LmFwcGVuZChacmVwbGFjZSlcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHB1c2goJyUnKVxcbiAgICAgICAgICAgICAgICAgICAgcHVzaChjaClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBwdXNoKCclJylcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcHVzaChjaClcXG4gICAgbmV3Zm9ybWF0ID0gXFxcIlxcXCIuam9pbihuZXdmb3JtYXQpXFxuICAgIHJldHVybiBfdGltZS5zdHJmdGltZShuZXdmb3JtYXQsIHRpbWV0dXBsZSlcXG5cXG4jIEp1c3QgcmFpc2UgVHlwZUVycm9yIGlmIHRoZSBhcmcgaXNuJ3QgTm9uZSBvciBhIHN0cmluZy5cXG5kZWYgX2NoZWNrX3R6bmFtZShuYW1lKTpcXG4gICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKTpcXG4gICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwidHppbmZvLnR6bmFtZSgpIG11c3QgcmV0dXJuIE5vbmUgb3Igc3RyaW5nLCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5vdCAnJXMnXFxcIiAlIHR5cGUobmFtZSkpXFxuXFxuIyBuYW1lIGlzIHRoZSBvZmZzZXQtcHJvZHVjaW5nIG1ldGhvZCwgXFxcInV0Y29mZnNldFxcXCIgb3IgXFxcImRzdFxcXCIuXFxuIyBvZmZzZXQgaXMgd2hhdCBpdCByZXR1cm5lZC5cXG4jIElmIG9mZnNldCBpc24ndCBOb25lIG9yIHRpbWVkZWx0YSwgcmFpc2VzIFR5cGVFcnJvci5cXG4jIElmIG9mZnNldCBpcyBOb25lLCByZXR1cm5zIE5vbmUuXFxuIyBFbHNlIG9mZnNldCBpcyBjaGVja2VkIGZvciBiZWluZyBpbiByYW5nZSwgYW5kIGEgd2hvbGUgIyBvZiBtaW51dGVzLlxcbiMgSWYgaXQgaXMsIGl0cyBpbnRlZ2VyIHZhbHVlIGlzIHJldHVybmVkLiAgRWxzZSBWYWx1ZUVycm9yIGlzIHJhaXNlZC5cXG5kZWYgX2NoZWNrX3V0Y19vZmZzZXQobmFtZSwgb2Zmc2V0KTpcXG4gICAgYXNzZXJ0IG5hbWUgaW4gKFxcXCJ1dGNvZmZzZXRcXFwiLCBcXFwiZHN0XFxcIilcXG4gICAgaWYgb2Zmc2V0IGlzIE5vbmU6XFxuICAgICAgICByZXR1cm5cXG4gICAgaWYgbm90IGlzaW5zdGFuY2Uob2Zmc2V0LCB0aW1lZGVsdGEpOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwib3IgdGltZWRlbHRhLCBub3QgJyVzJ1xcXCIgJSAobmFtZSwgdHlwZShvZmZzZXQpKSlcXG4gICAgZGF5cyA9IG9mZnNldC5kYXlzXFxuICAgIGlmIGRheXMgPCAtMSBvciBkYXlzID4gMDpcXG4gICAgICAgIG9mZnNldCA9IDE0NDAgICMgdHJpZ2dlciBvdXQtb2YtcmFuZ2VcXG4gICAgZWxzZTpcXG4gICAgICAgIHNlY29uZHMgPSBkYXlzICogODY0MDAgKyBvZmZzZXQuc2Vjb25kc1xcbiAgICAgICAgbWludXRlcywgc2Vjb25kcyA9IGRpdm1vZChzZWNvbmRzLCA2MClcXG4gICAgICAgIGlmIHNlY29uZHMgb3Igb2Zmc2V0Lm1pY3Jvc2Vjb25kczpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhIHdob2xlIG51bWJlciBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwib2YgbWludXRlc1xcXCIgJSBuYW1lKVxcbiAgICAgICAgb2Zmc2V0ID0gbWludXRlc1xcbiAgICBpZiBub3QgLTE0NDAgPCBvZmZzZXQgPCAxNDQwOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwiJXMoKT0lZCwgbXVzdCBiZSBpbiAtMTQzOS4uMTQzOVxcXCIgJSAobmFtZSwgb2Zmc2V0KSlcXG4gICAgcmV0dXJuIG9mZnNldFxcblxcbmRlZiBfY2hlY2tfaW50X2ZpZWxkKHZhbHVlKTpcXG4gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KTpcXG4gICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5fX2ludF9fKClcXG4gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjpcXG4gICAgICAgICAgICBwYXNzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWUpXFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX2ludF9fIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXInKVxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJylcXG4gICAgcmFpc2UgVHlwZUVycm9yKCdpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQnKVxcblxcbmRlZiBfY2hlY2tfZGF0ZV9maWVsZHMoeWVhciwgbW9udGgsIGRheSk6XFxuICAgIHllYXIgPSBfY2hlY2tfaW50X2ZpZWxkKHllYXIpXFxuICAgIG1vbnRoID0gX2NoZWNrX2ludF9maWVsZChtb250aClcXG4gICAgZGF5ID0gX2NoZWNrX2ludF9maWVsZChkYXkpXFxuICAgIGlmIG5vdCBNSU5ZRUFSIDw9IHllYXIgPD0gTUFYWUVBUjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3llYXIgbXVzdCBiZSBpbiAlZC4uJWQnICUgKE1JTllFQVIsIE1BWFlFQVIpLCB5ZWFyKVxcbiAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21vbnRoIG11c3QgYmUgaW4gMS4uMTInLCBtb250aClcXG4gICAgZGltID0gX2RheXNfaW5fbW9udGgoeWVhciwgbW9udGgpXFxuICAgIGlmIG5vdCAxIDw9IGRheSA8PSBkaW06XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkYXkgbXVzdCBiZSBpbiAxLi4lZCcgJSBkaW0sIGRheSlcXG4gICAgcmV0dXJuIHllYXIsIG1vbnRoLCBkYXlcXG5cXG5kZWYgX2NoZWNrX3RpbWVfZmllbGRzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCk6XFxuICAgIGhvdXIgPSBfY2hlY2tfaW50X2ZpZWxkKGhvdXIpXFxuICAgIG1pbnV0ZSA9IF9jaGVja19pbnRfZmllbGQobWludXRlKVxcbiAgICBzZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKHNlY29uZClcXG4gICAgbWljcm9zZWNvbmQgPSBfY2hlY2tfaW50X2ZpZWxkKG1pY3Jvc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBob3VyIDw9IDIzOlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaG91ciBtdXN0IGJlIGluIDAuLjIzJywgaG91cilcXG4gICAgaWYgbm90IDAgPD0gbWludXRlIDw9IDU5OlxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWludXRlIG11c3QgYmUgaW4gMC4uNTknLCBtaW51dGUpXFxuICAgIGlmIG5vdCAwIDw9IHNlY29uZCA8PSA1OTpcXG4gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlY29uZCBtdXN0IGJlIGluIDAuLjU5Jywgc2Vjb25kKVxcbiAgICBpZiBub3QgMCA8PSBtaWNyb3NlY29uZCA8PSA5OTk5OTk6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OScsIG1pY3Jvc2Vjb25kKVxcbiAgICByZXR1cm4gaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kXFxuXFxuZGVmIF9jaGVja190emluZm9fYXJnKHR6KTpcXG4gICAgaWYgdHogaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKHR6LCB0emluZm8pOlxcbiAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzXFxcIilcXG5cXG5cXG4jIE5vdGVzIG9uIGNvbXBhcmlzb246ICBJbiBnZW5lcmFsLCBkYXRldGltZSBtb2R1bGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgcmFpc2VcXG4jIFR5cGVFcnJvciB3aGVuIHRoZXkgZG9uJ3Qga25vdyBob3cgdG8gZG8gYSBjb21wYXJpc29uIHRoZW1zZWxmLiAgSWYgdGhleVxcbiMgcmV0dXJuZWQgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCwgY29tcGFyaXNvbiBjb3VsZCAoc2lsZW50bHkpIGZhbGwgYmFjayB0b1xcbiMgdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3RzLWJ5LWNvbXBhcmluZy10aGVpci1tZW1vcnktYWRkcmVzc2VzIHN0cmF0ZWd5LFxcbiMgYW5kIHRoYXQncyBub3QgaGVscGZ1bC4gIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9uczpcXG4jXFxuIyAxLiBGb3IgZGF0ZSBhbmQgZGF0ZXRpbWUsIGlmIHRoZSBvdGhlciBvYmplY3QgaGFzIGEgXFxcInRpbWV0dXBsZVxcXCIgYXR0cixcXG4jICAgIE5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLiAgVGhpcyBpcyBhIGhvb2sgdG8gYWxsb3cgb3RoZXIga2luZHMgb2ZcXG4jICAgIGRhdGV0aW1lLWxpa2Ugb2JqZWN0cyBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlIGNvbXBhcmlzb24uXFxuI1xcbiMgMi4gRWxzZSBfX2VxX18gYW5kIF9fbmVfXyByZXR1cm4gRmFsc2UgYW5kIFRydWUsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXNcXG4jICAgIHNvIG9wZXJ0YWlvbnMgbGlrZVxcbiNcXG4jICAgICAgICB4ID09IHlcXG4jICAgICAgICB4ICE9IHlcXG4jICAgICAgICB4IGluIHNlcXVlbmNlXFxuIyAgICAgICAgeCBub3QgaW4gc2VxdWVuY2VcXG4jICAgICAgICBkaWN0W3hdID0geVxcbiNcXG4jICAgIGRvbid0IHJhaXNlIGFubm95aW5nIFR5cGVFcnJvcnMganVzdCBiZWNhdXNlIGEgZGF0ZXRpbWUgb2JqZWN0XFxuIyAgICBpcyBwYXJ0IG9mIGEgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9uLiAgSWYgdGhlcmUncyBubyBrbm93biB3YXkgdG9cXG4jICAgIGNvbXBhcmUgWCB0byBhIGRhdGV0aW1lLCBzYXlpbmcgdGhleSdyZSBub3QgZXF1YWwgaXMgcmVhc29uYWJsZS5cXG5cXG5kZWYgX2NtcGVycm9yKHgsIHkpOlxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcImNhbid0IGNvbXBhcmUgJyVzJyB0byAnJXMnXFxcIiAlIChcXG4gICAgICAgICAgICAgICAgICAgIHR5cGUoeCkuX19uYW1lX18sIHR5cGUoeSkuX19uYW1lX18pKVxcblxcbmRlZiBfbm9ybWFsaXplX3BhaXIoaGksIGxvLCBmYWN0b3IpOlxcbiAgICBpZiBub3QgMCA8PSBsbyA8PSBmYWN0b3ItMTpcXG4gICAgICAgIGluYywgbG8gPSBkaXZtb2QobG8sIGZhY3RvcilcXG4gICAgICAgIGhpICs9IGluY1xcbiAgICByZXR1cm4gaGksIGxvXFxuXFxuZGVmIF9ub3JtYWxpemVfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGlnbm9yZV9vdmVyZmxvdz1GYWxzZSk6XFxuICAgICMgTm9ybWFsaXplIGFsbCB0aGUgaW5wdXRzLCBhbmQgc3RvcmUgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzLlxcbiAgICBzcywgdXMgPSBfbm9ybWFsaXplX3BhaXIoc3MsIHVzLCAxMDAwMDAwKVxcbiAgICBtbSwgc3MgPSBfbm9ybWFsaXplX3BhaXIobW0sIHNzLCA2MClcXG4gICAgaGgsIG1tID0gX25vcm1hbGl6ZV9wYWlyKGhoLCBtbSwgNjApXFxuICAgIGQsIGhoID0gX25vcm1hbGl6ZV9wYWlyKGQsIGhoLCAyNClcXG4gICAgeSwgbSwgZCA9IF9ub3JtYWxpemVfZGF0ZSh5LCBtLCBkLCBpZ25vcmVfb3ZlcmZsb3cpXFxuICAgIHJldHVybiB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1c1xcblxcbmRlZiBfbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSwgaWdub3JlX292ZXJmbG93PUZhbHNlKTpcXG4gICAgIyBUaGF0IHdhcyBlYXN5LiAgTm93IGl0IGdldHMgbXVkZHk6ICB0aGUgcHJvcGVyIHJhbmdlIGZvciBkYXlcXG4gICAgIyBjYW4ndCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQga25vd2luZyB0aGUgY29ycmVjdCBtb250aCBhbmQgeWVhcixcXG4gICAgIyBidXQgaWYgZGF5IGlzLCBlLmcuLCBwbHVzIG9yIG1pbnVzIGEgbWlsbGlvbiwgdGhlIGN1cnJlbnQgbW9udGhcXG4gICAgIyBhbmQgeWVhciB2YWx1ZXMgbWFrZSBubyBzZW5zZSAoYW5kIG1heSBhbHNvIGJlIG91dCBvZiBib3VuZHNcXG4gICAgIyB0aGVtc2VsdmVzKS5cXG4gICAgIyBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuXFxuICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOlxcbiAgICAgICAgeWVhciwgbW9udGggPSBfbm9ybWFsaXplX3BhaXIoeWVhciwgbW9udGgtMSwgMTIpXFxuICAgICAgICBtb250aCArPSAxXFxuICAgICAgICBhc3NlcnQgMSA8PSBtb250aCA8PSAxMlxcblxcbiAgICAjIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzXFxuICAgICMgZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLlxcbiAgICAjIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlXFxuICAgICMgbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuXFxuICAgIGRpbSA9IF9kYXlzX2luX21vbnRoKHllYXIsIG1vbnRoKVxcbiAgICBpZiBub3QgMSA8PSBkYXkgPD0gZGltOlxcbiAgICAgICAgIyBNb3ZlIGRheS0xIGRheXMgZnJvbSB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoLiAgRmlyc3QgdHJ5IHRvXFxuICAgICAgICAjIGdldCBvZmYgY2hlYXAgaWYgd2UncmUgb25seSBvbmUgZGF5IG91dCBvZiByYW5nZSAoYWRqdXN0bWVudHNcXG4gICAgICAgICMgZm9yIHRpbWV6b25lIGFsb25lIGNhbid0IGJlIHdvcnNlIHRoYW4gdGhhdCkuXFxuICAgICAgICBpZiBkYXkgPT0gMDogICAgIyBtb3ZlIGJhY2sgYSBkYXlcXG4gICAgICAgICAgICBtb250aCAtPSAxXFxuICAgICAgICAgICAgaWYgbW9udGggPiAwOlxcbiAgICAgICAgICAgICAgICBkYXkgPSBfZGF5c19pbl9tb250aCh5ZWFyLCBtb250aClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0geWVhci0xLCAxMiwgMzFcXG4gICAgICAgIGVsaWYgZGF5ID09IGRpbSArIDE6ICAgICMgbW92ZSBmb3J3YXJkIGEgZGF5XFxuICAgICAgICAgICAgbW9udGggKz0gMVxcbiAgICAgICAgICAgIGRheSA9IDFcXG4gICAgICAgICAgICBpZiBtb250aCA+IDEyOlxcbiAgICAgICAgICAgICAgICBtb250aCA9IDFcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG9yZGluYWwgPSBfeW1kMm9yZCh5ZWFyLCBtb250aCwgMSkgKyAoZGF5IC0gMSlcXG4gICAgICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gX29yZDJ5bWQob3JkaW5hbClcXG5cXG4gICAgaWYgbm90IGlnbm9yZV9vdmVyZmxvdyBhbmQgbm90IE1JTllFQVIgPD0geWVhciA8PSBNQVhZRUFSOlxcbiAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcihcXFwiZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2VcXFwiKVxcbiAgICByZXR1cm4geWVhciwgbW9udGgsIGRheVxcblxcbmRlZiBfYWNjdW0odGFnLCBzb2ZhciwgbnVtLCBmYWN0b3IsIGxlZnRvdmVyKTpcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGludCk6XFxuICAgICAgICBwcm9kID0gbnVtICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXJcXG4gICAgaWYgaXNpbnN0YW5jZShudW0sIGZsb2F0KTpcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihudW0pXFxuICAgICAgICBwcm9kID0gaW50KGludHBhcnQpICogZmFjdG9yXFxuICAgICAgICByc3VtID0gc29mYXIgKyBwcm9kXFxuICAgICAgICBpZiBmcmFjcGFydCA9PSAwLjA6XFxuICAgICAgICAgICAgcmV0dXJuIHJzdW0sIGxlZnRvdmVyXFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmYWN0b3IsIGludClcXG4gICAgICAgIGZyYWNwYXJ0LCBpbnRwYXJ0ID0gX21hdGgubW9kZihmYWN0b3IgKiBmcmFjcGFydClcXG4gICAgICAgIHJzdW0gKz0gaW50KGludHBhcnQpXFxuICAgICAgICByZXR1cm4gcnN1bSwgbGVmdG92ZXIgKyBmcmFjcGFydFxcbiAgICByYWlzZSBUeXBlRXJyb3IoXFxcInVuc3VwcG9ydGVkIHR5cGUgZm9yIHRpbWVkZWx0YSAlcyBjb21wb25lbnQ6ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAodGFnLCB0eXBlKG51bSkpKVxcblxcbmNsYXNzIHRpbWVkZWx0YShvYmplY3QpOlxcbiAgICBcXFwiXFxcIlxcXCJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy5cXG5cXG4gICAgU3VwcG9ydGVkIG9wZXJhdG9yczpcXG5cXG4gICAgLSBhZGQsIHN1YnRyYWN0IHRpbWVkZWx0YVxcbiAgICAtIHVuYXJ5IHBsdXMsIG1pbnVzLCBhYnNcXG4gICAgLSBjb21wYXJlIHRvIHRpbWVkZWx0YVxcbiAgICAtIG11bHRpcGx5LCBkaXZpZGUgYnkgaW50L2xvbmdcXG5cXG4gICAgSW4gYWRkaXRpb24sIGRhdGV0aW1lIHN1cHBvcnRzIHN1YnRyYWN0aW9uIG9mIHR3byBkYXRldGltZSBvYmplY3RzXFxuICAgIHJldHVybmluZyBhIHRpbWVkZWx0YSwgYW5kIGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIGEgZGF0ZXRpbWVcXG4gICAgYW5kIGEgdGltZWRlbHRhIGdpdmluZyBhIGRhdGV0aW1lLlxcblxcbiAgICBSZXByZXNlbnRhdGlvbjogKGRheXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykuICBXaHk/ICBCZWNhdXNlIElcXG4gICAgZmVsdCBsaWtlIGl0LlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gJ19kYXlzJywgJ19zZWNvbmRzJywgJ19taWNyb3NlY29uZHMnLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIGRheXM9X1NFTlRJTkVMLCBzZWNvbmRzPV9TRU5USU5FTCwgbWljcm9zZWNvbmRzPV9TRU5USU5FTCxcXG4gICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzPV9TRU5USU5FTCwgbWludXRlcz1fU0VOVElORUwsIGhvdXJzPV9TRU5USU5FTCwgd2Vla3M9X1NFTlRJTkVMKTpcXG4gICAgICAgIHggPSAwXFxuICAgICAgICBsZWZ0b3ZlciA9IDAuMFxcbiAgICAgICAgaWYgbWljcm9zZWNvbmRzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcIm1pY3Jvc2Vjb25kc1xcXCIsIHgsIG1pY3Jvc2Vjb25kcywgX1VTX1BFUl9VUywgbGVmdG92ZXIpXFxuICAgICAgICBpZiBtaWxsaXNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWlsbGlzZWNvbmRzXFxcIiwgeCwgbWlsbGlzZWNvbmRzLCBfVVNfUEVSX01TLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIHNlY29uZHMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwic2Vjb25kc1xcXCIsIHgsIHNlY29uZHMsIF9VU19QRVJfU0VDT05ELCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIG1pbnV0ZXMgaXMgbm90IF9TRU5USU5FTDpcXG4gICAgICAgICAgICB4LCBsZWZ0b3ZlciA9IF9hY2N1bShcXFwibWludXRlc1xcXCIsIHgsIG1pbnV0ZXMsIF9VU19QRVJfTUlOVVRFLCBsZWZ0b3ZlcilcXG4gICAgICAgIGlmIGhvdXJzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImhvdXJzXFxcIiwgeCwgaG91cnMsIF9VU19QRVJfSE9VUiwgbGVmdG92ZXIpXFxuICAgICAgICBpZiBkYXlzIGlzIG5vdCBfU0VOVElORUw6XFxuICAgICAgICAgICAgeCwgbGVmdG92ZXIgPSBfYWNjdW0oXFxcImRheXNcXFwiLCB4LCBkYXlzLCBfVVNfUEVSX0RBWSwgbGVmdG92ZXIpXFxuICAgICAgICBpZiB3ZWVrcyBpcyBub3QgX1NFTlRJTkVMOlxcbiAgICAgICAgICAgIHgsIGxlZnRvdmVyID0gX2FjY3VtKFxcXCJ3ZWVrc1xcXCIsIHgsIHdlZWtzLCBfVVNfUEVSX1dFRUssIGxlZnRvdmVyKVxcbiAgICAgICAgaWYgbGVmdG92ZXIgIT0gMC4wOlxcbiAgICAgICAgICAgIHggKz0gX3JvdW5kKGxlZnRvdmVyKVxcbiAgICAgICAgcmV0dXJuIGNscy5fZnJvbV9taWNyb3NlY29uZHMoeClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBfZnJvbV9taWNyb3NlY29uZHMoY2xzLCB1cyk6XFxuICAgICAgICBzLCB1cyA9IGRpdm1vZCh1cywgX1VTX1BFUl9TRUNPTkQpXFxuICAgICAgICBkLCBzID0gZGl2bW9kKHMsIF9TRUNPTkRTX1BFUl9EQVkpXFxuICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGUoZCwgcywgdXMsIEZhbHNlKVxcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIF9jcmVhdGUoY2xzLCBkLCBzLCB1cywgbm9ybWFsaXplKTpcXG4gICAgICAgIGlmIG5vcm1hbGl6ZTpcXG4gICAgICAgICAgICBzLCB1cyA9IF9ub3JtYWxpemVfcGFpcihzLCB1cywgMTAwMDAwMClcXG4gICAgICAgICAgICBkLCBzID0gX25vcm1hbGl6ZV9wYWlyKGQsIHMsIDI0KjM2MDApXFxuXFxuICAgICAgICBpZiBub3QgLV9NQVhfREVMVEFfREFZUyA8PSBkIDw9IF9NQVhfREVMVEFfREFZUzpcXG4gICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKFxcXCJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkXFxcIiAlIChkLCBfTUFYX0RFTFRBX0RBWVMpKVxcblxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX2RheXMgPSBkXFxuICAgICAgICBzZWxmLl9zZWNvbmRzID0gc1xcbiAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzID0gdXNcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfdG9fbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgoc2VsZi5fZGF5cyAqIF9TRUNPTkRTX1BFUl9EQVkgKyBzZWxmLl9zZWNvbmRzKSAqIF9VU19QRVJfU0VDT05EICtcXG4gICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzKVxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lZGVsdGEgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkLCAlZClcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMpXFxuICAgICAgICBpZiBzZWxmLl9zZWNvbmRzOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwiJXMoJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcylcXG4gICAgICAgIHJldHVybiBcXFwiJXMoJWQpXFxcIiAlIChtb2R1bGUgKyBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZGF5cylcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBtbSwgc3MgPSBkaXZtb2Qoc2VsZi5fc2Vjb25kcywgNjApXFxuICAgICAgICBoaCwgbW0gPSBkaXZtb2QobW0sIDYwKVxcbiAgICAgICAgcyA9IFxcXCIlZDolMDJkOiUwMmRcXFwiICUgKGhoLCBtbSwgc3MpXFxuICAgICAgICBpZiBzZWxmLl9kYXlzOlxcbiAgICAgICAgICAgIGRlZiBwbHVyYWwobik6XFxuICAgICAgICAgICAgICAgIHJldHVybiBuLCBhYnMobikgIT0gMSBhbmQgXFxcInNcXFwiIG9yIFxcXCJcXFwiXFxuICAgICAgICAgICAgcyA9IChcXFwiJWQgZGF5JXMsIFxcXCIgJSBwbHVyYWwoc2VsZi5fZGF5cykpICsgc1xcbiAgICAgICAgaWYgc2VsZi5fbWljcm9zZWNvbmRzOlxcbiAgICAgICAgICAgIHMgPSBzICsgXFxcIi4lMDZkXFxcIiAlIHNlbGYuX21pY3Jvc2Vjb25kc1xcbiAgICAgICAgcmV0dXJuIHNcXG5cXG4gICAgZGVmIHRvdGFsX3NlY29uZHMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUb3RhbCBzZWNvbmRzIGluIHRoZSBkdXJhdGlvbi5cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90b19taWNyb3NlY29uZHMoKSAvIDEwLjAqKjZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5cyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRheXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXlzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcInNlY29uZHNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRzXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmRzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmRzXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRzXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoc2VsZi5fZGF5cyArIG90aGVyLl9kYXlzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWNvbmRzICsgb3RoZXIuX3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kcyArIG90aGVyLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICAjIGZvciBDUHl0aG9uIGNvbXBhdGliaWxpdHksIHdlIGNhbm5vdCB1c2VcXG4gICAgICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZShzZWxmLl9kYXlzIC0gb3RoZXIuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgLSBvdGhlci5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzIC0gb3RoZXIuX21pY3Jvc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgX19uZWdfXyhzZWxmKTpcXG4gICAgICAgICMgZm9yIENQeXRob24gY29tcGF0aWJpbGl0eSwgd2UgY2Fubm90IHVzZVxcbiAgICAgICAgIyBvdXIgX19jbGFzc19fIGhlcmUsIGJ1dCBuZWVkIGEgcmVhbCB0aW1lZGVsdGFcXG4gICAgICAgIHJldHVybiB0aW1lZGVsdGEuX2NyZWF0ZSgtc2VsZi5fZGF5cyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5fbWljcm9zZWNvbmRzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpXFxuXFxuICAgIGRlZiBfX3Bvc19fKHNlbGYpOlxcbiAgICAgICAgIyBmb3IgQ1B5dGhvbiBjb21wYXRpYmlsaXR5LCB3ZSBjYW5ub3QgdXNlXFxuICAgICAgICAjIG91ciBfX2NsYXNzX18gaGVyZSwgYnV0IG5lZWQgYSByZWFsIHRpbWVkZWx0YVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fY3JlYXRlKHNlbGYuX2RheXMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vjb25kcyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpXFxuXFxuICAgIGRlZiBfX2Fic19fKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5fZGF5cyA8IDA6XFxuICAgICAgICAgICAgcmV0dXJuIC1zZWxmXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBpbnQpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgdXNlYyA9IHNlbGYuX3RvX21pY3Jvc2Vjb25kcygpXFxuICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9mcm9tX21pY3Jvc2Vjb25kcyh1c2VjICogb3RoZXIpXFxuXFxuICAgIF9fcm11bF9fID0gX19tdWxfX1xcblxcbiAgICBkZWYgX19kaXZfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgaW50KTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKVxcbiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YS5fZnJvbV9taWNyb3NlY29uZHModXNlYyAvLyBvdGhlcilcXG5cXG4gICAgX19mbG9vcmRpdl9fID0gX19kaXZfX1xcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWVkZWx0YSBvYmplY3RzIHdpdGggb3RoZXIuXFxuXFxuICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6XFxuICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdGhlciwgdGltZWRlbHRhKVxcbiAgICAgICAgcmV0dXJuIF9jbXAoc2VsZi5fZ2V0c3RhdGUoKSwgb3RoZXIuX2dldHN0YXRlKCkpXFxuXFxuICAgIGRlZiBfX2hhc2hfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlID09IC0xOlxcbiAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiAoc2VsZi5fZGF5cyAhPSAwIG9yXFxuICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgIT0gMCBvclxcbiAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZHMgIT0gMClcXG5cXG50aW1lZGVsdGEubWluID0gdGltZWRlbHRhKC1fTUFYX0RFTFRBX0RBWVMpXFxudGltZWRlbHRhLm1heCA9IHRpbWVkZWx0YShfTUFYX0RFTFRBX0RBWVMsIDI0KjM2MDAtMSwgMTAwMDAwMC0xKVxcbnRpbWVkZWx0YS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcbmNsYXNzIGRhdGUob2JqZWN0KTpcXG4gICAgXFxcIlxcXCJcXFwiQ29uY3JldGUgZGF0ZSB0eXBlLlxcblxcbiAgICBDb25zdHJ1Y3RvcnM6XFxuXFxuICAgIF9fbmV3X18oKVxcbiAgICBmcm9tdGltZXN0YW1wKClcXG4gICAgdG9kYXkoKVxcbiAgICBmcm9tb3JkaW5hbCgpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG4gICAgX19hZGRfXywgX19yYWRkX18sIF9fc3ViX18gKGFkZC9yYWRkIG9ubHkgd2l0aCB0aW1lZGVsdGEgYXJnKVxcblxcbiAgICBNZXRob2RzOlxcblxcbiAgICB0aW1ldHVwbGUoKVxcbiAgICB0b29yZGluYWwoKVxcbiAgICB3ZWVrZGF5KClcXG4gICAgaXNvd2Vla2RheSgpLCBpc29jYWxlbmRhcigpLCBpc29mb3JtYXQoKVxcbiAgICBjdGltZSgpXFxuICAgIHN0cmZ0aW1lKClcXG5cXG4gICAgUHJvcGVydGllcyAocmVhZG9ubHkpOlxcbiAgICB5ZWFyLCBtb250aCwgZGF5XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX3llYXInLCAnX21vbnRoJywgJ19kYXknLCAnX2hhc2hjb2RlJ1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnN0cnVjdG9yLlxcblxcbiAgICAgICAgQXJndW1lbnRzOlxcblxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSAocmVxdWlyZWQsIGJhc2UgMSlcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscylcXG4gICAgICAgIHNlbGYuX3llYXIgPSB5ZWFyXFxuICAgICAgICBzZWxmLl9tb250aCA9IG1vbnRoXFxuICAgICAgICBzZWxmLl9kYXkgPSBkYXlcXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgQWRkaXRpb25hbCBjb25zdHJ1Y3RvcnNcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tdGltZXN0YW1wKGNscywgdCk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgZGF0ZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZWVrZGF5LCBqZGF5LCBkc3QgPSBfdGltZS5sb2NhbHRpbWUodClcXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiB0b2RheShjbHMpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGUgZnJvbSB0aW1lLnRpbWUoKS5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodClcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBmcm9tb3JkaW5hbChjbHMsIG4pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29udHJ1Y3QgYSBkYXRlIGZyb20gYSBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuXFxuXFxuICAgICAgICBKYW51YXJ5IDEgb2YgeWVhciAxIGlzIGRheSAxLiAgT25seSB0aGUgeWVhciwgbW9udGggYW5kIGRheSBhcmVcXG4gICAgICAgIG5vbi16ZXJvIGluIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHksIG0sIGQgPSBfb3JkMnltZChuKVxcbiAgICAgICAgcmV0dXJuIGNscyh5LCBtLCBkKVxcblxcbiAgICAjIENvbnZlcnNpb25zIHRvIHN0cmluZ1xcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCknXFxuXFxuICAgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDEwLCAxLCAxLCB0emluZm89dGltZXpvbmUudXRjKVxcbiAgICAgICAgPj4+IHJlcHIoZHQpXFxuICAgICAgICAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgMSwgMSwgMCwgMCwgdHppbmZvPWRhdGV0aW1lLnRpbWV6b25lLnV0YyknXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIG1vZHVsZSA9IFxcXCJkYXRldGltZS5cXFwiIGlmIHNlbGYuX19jbGFzc19fIGlzIGRhdGUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlcyglZCwgJWQsICVkKVxcXCIgJSAobW9kdWxlICsgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl95ZWFyLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXkpXFxuXFxuICAgICMgWFhYIFRoZXNlIHNob3VsZG4ndCBkZXBlbmQgb24gdGltZS5sb2NhbHRpbWUoKSwgYmVjYXVzZSB0aGF0XFxuICAgICMgY2xpcHMgdGhlIHVzYWJsZSBkYXRlcyB0byBbMTk3MCAuLiAyMDM4KS4gIEF0IGxlYXN0IGN0aW1lKCkgaXNcXG4gICAgIyBlYXNpbHkgZG9uZSB3aXRob3V0IHVzaW5nIHN0cmZ0aW1lKCkgLS0gdGhhdCdzIGJldHRlciB0b28gYmVjYXVzZVxcbiAgICAjIHN0cmZ0aW1lKFxcXCIlY1xcXCIsIC4uLikgaXMgbG9jYWxlIHNwZWNpZmljLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAwMDowMDowMCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSwgc2VsZi5feWVhcilcXG5cXG4gICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdCk6XFxuICAgICAgICBcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF93cmFwX3N0cmZ0aW1lKHNlbGYsIGZvcm1hdCwgc2VsZi50aW1ldHVwbGUoKSlcXG5cXG4gICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10KTpcXG4gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZtdCwgKHN0ciwgdW5pY29kZSkpOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcIl9fZm9ybWF0X18gZXhwZWN0cyBzdHIgb3IgdW5pY29kZSwgbm90ICVzXFxcIiAlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQuX19jbGFzc19fLl9fbmFtZV9fKVxcbiAgICAgICAgaWYgbGVuKGZtdCkgIT0gMDpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmbXQpXFxuICAgICAgICByZXR1cm4gc3RyKHNlbGYpXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdZWVlZLU1NLUREJy5cXG5cXG4gICAgICAgIFJlZmVyZW5jZXM6XFxuICAgICAgICAtIGh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWVcXG4gICAgICAgIC0gaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L2lzby10aW1lLmh0bWxcXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIFxcXCIlMDRkLSUwMmQtJTAyZFxcXCIgJSAoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG5cXG4gICAgX19zdHJfXyA9IGlzb2Zvcm1hdFxcblxcbiAgICAjIFJlYWQtb25seSBmaWVsZCBhY2Nlc3NvcnNcXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB5ZWFyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwieWVhciAoMS05OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3llYXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtb250aChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1vbnRoICgxLTEyKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21vbnRoXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF5ICgxLTMxKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2RheVxcblxcbiAgICAjIFN0YW5kYXJkIGNvbnZlcnNpb25zLCBfX2NtcF9fLCBfX2hhc2hfXyAoYW5kIGhlbHBlcnMpXFxuXFxuICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGxvY2FsIHRpbWUgdHVwbGUgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSlcXG5cXG4gICAgZGVmIHRvb3JkaW5hbChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwgZm9yIHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5LlxcblxcbiAgICAgICAgSmFudWFyeSAxIG9mIHllYXIgMSBpcyBkYXkgMS4gIE9ubHkgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgdmFsdWVzXFxuICAgICAgICBjb250cmlidXRlIHRvIHRoZSByZXN1bHQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBfeW1kMm9yZChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5KVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIG5ldyBkYXRlIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYuX3llYXJcXG4gICAgICAgIGlmIG1vbnRoIGlzIE5vbmU6XFxuICAgICAgICAgICAgbW9udGggPSBzZWxmLl9tb250aFxcbiAgICAgICAgaWYgZGF5IGlzIE5vbmU6XFxuICAgICAgICAgICAgZGF5ID0gc2VsZi5fZGF5XFxuICAgICAgICByZXR1cm4gZGF0ZSh5ZWFyLCBtb250aCwgZGF5KVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gRmFsc2VcXG5cXG4gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG5cXG4gICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIik6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheVxcbiAgICAgICAgeTIsIG0yLCBkMiA9IG90aGVyLl95ZWFyLCBvdGhlci5fbW9udGgsIG90aGVyLl9kYXlcXG4gICAgICAgIHJldHVybiBfY21wKCh5LCBtLCBkKSwgKHkyLCBtMiwgZDIpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiSGFzaC5cXFwiXFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goc2VsZi5fZ2V0c3RhdGUoKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbXB1dGF0aW9uc1xcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkID0gX25vcm1hbGl6ZV9kYXRlKFxcbiAgICAgICAgICAgIHNlbGYuX3llYXIsXFxuICAgICAgICAgICAgc2VsZi5fbW9udGgsXFxuICAgICAgICAgICAgc2VsZi5fZGF5ICsgb3RoZXIuZGF5cyAqIGZhY3RvcilcXG4gICAgICAgIHJldHVybiBkYXRlKHksIG0sIGQpXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRlIHRvIGEgdGltZWRlbHRhLlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZF90aW1lZGVsdGEob3RoZXIsIDEpXFxuICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlN1YnRyYWN0IHR3byBkYXRlcywgb3IgYSBkYXRlIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIGRheXMxID0gc2VsZi50b29yZGluYWwoKVxcbiAgICAgICAgICAgIGRheXMyID0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhLl9jcmVhdGUoZGF5czEgLSBkYXlzMiwgMCwgMCwgRmFsc2UpXFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcblxcbiAgICBkZWYgd2Vla2RheShzZWxmKTpcXG4gICAgICAgIFxcXCJSZXR1cm4gZGF5IG9mIHRoZSB3ZWVrLCB3aGVyZSBNb25kYXkgPT0gMCAuLi4gU3VuZGF5ID09IDYuXFxcIlxcbiAgICAgICAgcmV0dXJuIChzZWxmLnRvb3JkaW5hbCgpICsgNikgJSA3XFxuXFxuICAgICMgRGF5LW9mLXRoZS13ZWVrIGFuZCB3ZWVrLW9mLXRoZS15ZWFyLCBhY2NvcmRpbmcgdG8gSVNPXFxuXFxuICAgIGRlZiBpc293ZWVrZGF5KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBkYXkgb2YgdGhlIHdlZWssIHdoZXJlIE1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNy5cXFwiXFxuICAgICAgICAjIDEtSmFuLTAwMDEgaXMgYSBNb25kYXlcXG4gICAgICAgIHJldHVybiBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuXFxuICAgIGRlZiBpc29jYWxlbmRhcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCB3ZWVrZGF5LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IElTTyB3ZWVrIG9mIHRoZSB5ZWFyIGlzIHRoZSAoTW9uLVN1bikgd2Vla1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5OyBldmVyeXRoaW5nIGVsc2UgZGVyaXZlc1xcbiAgICAgICAgZnJvbSB0aGF0LlxcblxcbiAgICAgICAgVGhlIGZpcnN0IHdlZWsgaXMgMTsgTW9uZGF5IGlzIDEgLi4uIFN1bmRheSBpcyA3LlxcblxcbiAgICAgICAgSVNPIGNhbGVuZGFyIGFsZ29yaXRobSB0YWtlbiBmcm9tXFxuICAgICAgICBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2NhbGVuZGFyL2lzb2NhbGVuZGFyLmh0bVxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB5ZWFyID0gc2VsZi5feWVhclxcbiAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgIHRvZGF5ID0gX3ltZDJvcmQoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSlcXG4gICAgICAgICMgSW50ZXJuYWxseSwgd2VlayBhbmQgZGF5IGhhdmUgb3JpZ2luIDBcXG4gICAgICAgIHdlZWssIGRheSA9IGRpdm1vZCh0b2RheSAtIHdlZWsxbW9uZGF5LCA3KVxcbiAgICAgICAgaWYgd2VlayA8IDA6XFxuICAgICAgICAgICAgeWVhciAtPSAxXFxuICAgICAgICAgICAgd2VlazFtb25kYXkgPSBfaXNvd2VlazFtb25kYXkoeWVhcilcXG4gICAgICAgICAgICB3ZWVrLCBkYXkgPSBkaXZtb2QodG9kYXkgLSB3ZWVrMW1vbmRheSwgNylcXG4gICAgICAgIGVsaWYgd2VlayA+PSA1MjpcXG4gICAgICAgICAgICBpZiB0b2RheSA+PSBfaXNvd2VlazFtb25kYXkoeWVhcisxKTpcXG4gICAgICAgICAgICAgICAgeWVhciArPSAxXFxuICAgICAgICAgICAgICAgIHdlZWsgPSAwXFxuICAgICAgICByZXR1cm4geWVhciwgd2VlaysxLCBkYXkrMVxcblxcbl9kYXRlX2NsYXNzID0gZGF0ZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwiZGF0ZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG5kYXRlLm1pbiA9IGRhdGUoMSwgMSwgMSlcXG5kYXRlLm1heCA9IGRhdGUoOTk5OSwgMTIsIDMxKVxcbmRhdGUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShkYXlzPTEpXFxuXFxuY2xhc3MgdHppbmZvKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIGNsYXNzZXMuXFxuXFxuICAgIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGUgbmFtZSgpLCB1dGNvZmZzZXQoKSBhbmQgZHN0KCkgbWV0aG9kcy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIF9fc2xvdHNfXyA9ICgpXFxuXFxuICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IHN0cmluZyBuYW1lIG9mIHRpbWUgem9uZS5cXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB0em5hbWUoKVxcXCIpXFxuXFxuICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcImRhdGV0aW1lIC0+IG1pbnV0ZXMgZWFzdCBvZiBVVEMgKG5lZ2F0aXZlIGZvciB3ZXN0IG9mIFVUQylcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSB1dGNvZmZzZXQoKVxcXCIpXFxuXFxuICAgIGRlZiBkc3Qoc2VsZiwgZHQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUgLT4gRFNUIG9mZnNldCBpbiBtaW51dGVzIGVhc3Qgb2YgVVRDLlxcblxcbiAgICAgICAgUmV0dXJuIDAgaWYgRFNUIG5vdCBpbiBlZmZlY3QuICB1dGNvZmZzZXQoKSBtdXN0IGluY2x1ZGUgdGhlIERTVFxcbiAgICAgICAgb2Zmc2V0LlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0emluZm8gc3ViY2xhc3MgbXVzdCBvdmVycmlkZSBkc3QoKVxcXCIpXFxuXFxuICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KTpcXG4gICAgICAgIFxcXCJkYXRldGltZSBpbiBVVEMgLT4gZGF0ZXRpbWUgaW4gbG9jYWwgdGltZS5cXFwiXFxuXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkdCwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZnJvbXV0YygpIHJlcXVpcmVzIGEgZGF0ZXRpbWUgYXJndW1lbnRcXFwiKVxcbiAgICAgICAgaWYgZHQudHppbmZvIGlzIG5vdCBzZWxmOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImR0LnR6aW5mbyBpcyBub3Qgc2VsZlxcXCIpXFxuXFxuICAgICAgICBkdG9mZiA9IGR0LnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBkdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIHV0Y29mZnNldCgpIFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZXN1bHRcXFwiKVxcblxcbiAgICAgICAgIyBTZWUgdGhlIGxvbmcgY29tbWVudCBibG9jayBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgYW5cXG4gICAgICAgICMgZXhwbGFuYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXFxuICAgICAgICBkdGRzdCA9IGR0LmRzdCgpXFxuICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImZyb211dGMoKSByZXF1aXJlcyBhIG5vbi1Ob25lIGRzdCgpIHJlc3VsdFxcXCIpXFxuICAgICAgICBkZWx0YSA9IGR0b2ZmIC0gZHRkc3RcXG4gICAgICAgIGlmIGRlbHRhOlxcbiAgICAgICAgICAgIGR0ID0gZHQgKyBkZWx0YVxcbiAgICAgICAgICAgIGR0ZHN0ID0gZHQuZHN0KClcXG4gICAgICAgICAgICBpZiBkdGRzdCBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJmcm9tdXRjKCk6IGR0LmRzdCBnYXZlIGluY29uc2lzdGVudCBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0XFxcIilcXG4gICAgICAgIGlmIGR0ZHN0OlxcbiAgICAgICAgICAgIHJldHVybiBkdCArIGR0ZHN0XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBkdFxcblxcbl90emluZm9fY2xhc3MgPSB0emluZm9cXG5cXG5jbGFzcyB0aW1lKG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIlRpbWUgd2l0aCB0aW1lIHpvbmUuXFxuXFxuICAgIENvbnN0cnVjdG9yczpcXG5cXG4gICAgX19uZXdfXygpXFxuXFxuICAgIE9wZXJhdG9yczpcXG5cXG4gICAgX19yZXByX18sIF9fc3RyX19cXG4gICAgX19jbXBfXywgX19oYXNoX19cXG5cXG4gICAgTWV0aG9kczpcXG5cXG4gICAgc3RyZnRpbWUoKVxcbiAgICBpc29mb3JtYXQoKVxcbiAgICB1dGNvZmZzZXQoKVxcbiAgICB0em5hbWUoKVxcbiAgICBkc3QoKVxcblxcbiAgICBQcm9wZXJ0aWVzIChyZWFkb25seSk6XFxuICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwgdHppbmZvXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBfX3Nsb3RzX18gPSAnX2hvdXInLCAnX21pbnV0ZScsICdfc2Vjb25kJywgJ19taWNyb3NlY29uZCcsICdfdHppbmZvJywgJ19oYXNoY29kZSdcXG5cXG4gICAgZGVmIF9fbmV3X18oY2xzLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCwgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0b3IuXFxuXFxuICAgICAgICBBcmd1bWVudHM6XFxuXFxuICAgICAgICBob3VyLCBtaW51dGUgKHJlcXVpcmVkKVxcbiAgICAgICAgc2Vjb25kLCBtaWNyb3NlY29uZCAoZGVmYXVsdCB0byB6ZXJvKVxcbiAgICAgICAgdHppbmZvIChkZWZhdWx0IHRvIE5vbmUpXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCA9IF9jaGVja190aW1lX2ZpZWxkcyhcXG4gICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQpXFxuICAgICAgICBfY2hlY2tfdHppbmZvX2FyZyh0emluZm8pXFxuICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKVxcbiAgICAgICAgc2VsZi5faG91ciA9IGhvdXJcXG4gICAgICAgIHNlbGYuX21pbnV0ZSA9IG1pbnV0ZVxcbiAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kXFxuICAgICAgICBzZWxmLl9taWNyb3NlY29uZCA9IG1pY3Jvc2Vjb25kXFxuICAgICAgICBzZWxmLl90emluZm8gPSB0emluZm9cXG4gICAgICAgIHNlbGYuX2hhc2hjb2RlID0gLTFcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICMgUmVhZC1vbmx5IGZpZWxkIGFjY2Vzc29yc1xcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIGhvdXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJob3VyICgwLTIzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hvdXJcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBtaW51dGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaW51dGUgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWludXRlXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwic2Vjb25kICgwLTU5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NlY29uZFxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pY3Jvc2Vjb25kKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwibWljcm9zZWNvbmQgKDAtOTk5OTk5KVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX21pY3Jvc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgdHppbmZvKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwidGltZXpvbmUgaW5mbyBvYmplY3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl90emluZm9cXG5cXG4gICAgIyBTdGFuZGFyZCBjb252ZXJzaW9ucywgX19oYXNoX18gKGFuZCBoZWxwZXJzKVxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIHRpbWUgb2JqZWN0cyB3aXRoIG90aGVyLlxcblxcbiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID09IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgIT0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gVHJ1ZVxcblxcbiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgX2NtcGVycm9yKHNlbGYsIG90aGVyKVxcblxcbiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWUpXFxuICAgICAgICBteXR6ID0gc2VsZi5fdHppbmZvXFxuICAgICAgICBvdHR6ID0gb3RoZXIuX3R6aW5mb1xcbiAgICAgICAgbXlvZmYgPSBvdG9mZiA9IE5vbmVcXG5cXG4gICAgICAgIGlmIG15dHogaXMgb3R0ejpcXG4gICAgICAgICAgICBiYXNlX2NvbXBhcmUgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG15b2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgICAgICBvdG9mZiA9IG90aGVyLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IG15b2ZmID09IG90b2ZmXFxuXFxuICAgICAgICBpZiBiYXNlX2NvbXBhcmU6XFxuICAgICAgICAgICAgcmV0dXJuIF9jbXAoKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyLl9ob3VyLCBvdGhlci5fbWludXRlLCBvdGhlci5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgaWYgbXlvZmYgaXMgTm9uZSBvciBvdG9mZiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSB0aW1lc1xcXCIpXFxuICAgICAgICBteWhobW0gPSBzZWxmLl9ob3VyICogNjAgKyBzZWxmLl9taW51dGUgLSBteW9mZlxcbiAgICAgICAgb3RoaG1tID0gb3RoZXIuX2hvdXIgKiA2MCArIG90aGVyLl9taW51dGUgLSBvdG9mZlxcbiAgICAgICAgcmV0dXJuIF9jbXAoKG15aGhtbSwgc2VsZi5fc2Vjb25kLCBzZWxmLl9taWNyb3NlY29uZCksXFxuICAgICAgICAgICAgICAgICAgICAob3RoaG1tLCBvdGhlci5fc2Vjb25kLCBvdGhlci5fbWljcm9zZWNvbmQpKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJIYXNoLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgPT0gLTE6XFxuICAgICAgICAgICAgdHpvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG5vdCB0em9mZjogICMgemVybyBvciBOb25lXFxuICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gaGFzaChzZWxmLl9nZXRzdGF0ZSgpWzBdKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2Qoc2VsZi5ob3VyICogNjAgKyBzZWxmLm1pbnV0ZSAtIHR6b2ZmLCA2MClcXG4gICAgICAgICAgICAgICAgaWYgMCA8PSBoIDwgMjQ6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZShoLCBtLCBzZWxmLnNlY29uZCwgc2VsZi5taWNyb3NlY29uZCkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2goKGgsIG0sIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKSlcXG4gICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZVxcblxcbiAgICAjIENvbnZlcnNpb24gdG8gc3RyaW5nXFxuXFxuICAgIGRlZiBfdHpzdHIoc2VsZiwgc2VwPVxcXCI6XFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gZm9ybWF0dGVkIHRpbWV6b25lIG9mZnNldCAoK3h4Onh4KSBvciBOb25lLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgYXNzZXJ0IDAgPD0gaGggPCAyNFxcbiAgICAgICAgICAgIG9mZiA9IFxcXCIlcyUwMmQlcyUwMmRcXFwiICUgKHNpZ24sIGhoLCBzZXAsIG1tKVxcbiAgICAgICAgcmV0dXJuIG9mZlxcblxcbiAgICBkZWYgX19yZXByX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb252ZXJ0IHRvIGZvcm1hbCBzdHJpbmcsIGZvciByZXByKCkuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9taWNyb3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZCwgJWRcXFwiICUgKHNlbGYuX3NlY29uZCwgc2VsZi5fbWljcm9zZWNvbmQpXFxuICAgICAgICBlbGlmIHNlbGYuX3NlY29uZCAhPSAwOlxcbiAgICAgICAgICAgIHMgPSBcXFwiLCAlZFxcXCIgJSBzZWxmLl9zZWNvbmRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcyA9IFxcXCJcXFwiXFxuICAgICAgICBtb2R1bGUgPSBcXFwiZGF0ZXRpbWUuXFxcIiBpZiBzZWxmLl9fY2xhc3NfXyBpcyB0aW1lIGVsc2UgXFxcIlxcXCJcXG4gICAgICAgIHM9IFxcXCIlcyglZCwgJWQlcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBpc29mb3JtYXQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uXFxuXFxuICAgICAgICBUaGlzIGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLCBvciAnSEg6TU06U1Mreno6enonIGlmXFxuICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHMgPSBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKVxcbiAgICAgICAgdHogPSBzZWxmLl90enN0cigpXFxuICAgICAgICBpZiB0ejpcXG4gICAgICAgICAgICBzICs9IHR6XFxuICAgICAgICByZXR1cm4gc1xcblxcbiAgICBfX3N0cl9fID0gaXNvZm9ybWF0XFxuXFxuICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXQpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRm9ybWF0IHVzaW5nIHN0cmZ0aW1lKCkuICBUaGUgZGF0ZSBwYXJ0IG9mIHRoZSB0aW1lc3RhbXAgcGFzc2VkXFxuICAgICAgICB0byB1bmRlcmx5aW5nIHN0cmZ0aW1lIHNob3VsZCBub3QgYmUgdXNlZC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGUgeWVhciBtdXN0IGJlID49IF9NSU5ZRUFSRk1UIGVsc2UgUHl0aG9uJ3Mgc3RyZnRpbWUgaW1wbGVtZW50YXRpb25cXG4gICAgICAgICMgY2FuIHJhaXNlIGEgYm9ndXMgZXhjZXB0aW9uLlxcbiAgICAgICAgdGltZXR1cGxlID0gKDE5MDAsIDEsIDEsXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgMCwgMSwgLTEpXFxuICAgICAgICByZXR1cm4gX3dyYXBfc3RyZnRpbWUoc2VsZiwgZm9ybWF0LCB0aW1ldHVwbGUpXFxuXFxuICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdCk6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmbXQsIChzdHIsIHVuaWNvZGUpKTpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlc1xcXCIgJVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10Ll9fY2xhc3NfXy5fX25hbWVfXylcXG4gICAgICAgIGlmIGxlbihmbXQpICE9IDA6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm10KVxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmKVxcblxcbiAgICAjIFRpbWV6b25lIGZ1bmN0aW9uc1xcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChOb25lKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShOb25lKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3QoTm9uZSlcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KE5vbmUpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCBob3VyPU5vbmUsIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSxcXG4gICAgICAgICAgICAgICAgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IHRpbWUgd2l0aCBuZXcgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGZpZWxkcy5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIGhvdXIgaXMgTm9uZTpcXG4gICAgICAgICAgICBob3VyID0gc2VsZi5ob3VyXFxuICAgICAgICBpZiBtaW51dGUgaXMgTm9uZTpcXG4gICAgICAgICAgICBtaW51dGUgPSBzZWxmLm1pbnV0ZVxcbiAgICAgICAgaWYgc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgc2Vjb25kID0gc2VsZi5zZWNvbmRcXG4gICAgICAgIGlmIG1pY3Jvc2Vjb25kIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWljcm9zZWNvbmQgPSBzZWxmLm1pY3Jvc2Vjb25kXFxuICAgICAgICBpZiB0emluZm8gaXMgVHJ1ZTpcXG4gICAgICAgICAgICB0emluZm8gPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgcmV0dXJuIHRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLCB0emluZm8pXFxuXFxuICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuc2Vjb25kIG9yIHNlbGYubWljcm9zZWNvbmQ6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3V0Y29mZnNldCgpIG9yIDBcXG4gICAgICAgIHJldHVybiBzZWxmLmhvdXIgKiA2MCArIHNlbGYubWludXRlICE9IG9mZnNldFxcblxcbl90aW1lX2NsYXNzID0gdGltZSAgIyBzbyBmdW5jdGlvbnMgdy8gYXJncyBuYW1lZCBcXFwidGltZVxcXCIgY2FuIGdldCBhdCB0aGUgY2xhc3NcXG5cXG50aW1lLm1pbiA9IHRpbWUoMCwgMCwgMClcXG50aW1lLm1heCA9IHRpbWUoMjMsIDU5LCA1OSwgOTk5OTk5KVxcbnRpbWUucmVzb2x1dGlvbiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSlcXG5cXG5jbGFzcyBkYXRldGltZShkYXRlKTpcXG4gICAgXFxcIlxcXCJcXFwiZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheVssIGhvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssdHppbmZvXV1dXV0pXFxuXFxuICAgIFRoZSB5ZWFyLCBtb250aCBhbmQgZGF5IGFyZ3VtZW50cyBhcmUgcmVxdWlyZWQuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW5cXG4gICAgaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG1heSBiZSBpbnRzIG9yIGxvbmdzLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgX19zbG90c19fID0gZGF0ZS5fX3Nsb3RzX18gKyB0aW1lLl9fc2xvdHNfX1xcblxcbiAgICBkZWYgX19uZXdfXyhjbHMsIHllYXIsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPTAsIG1pbnV0ZT0wLCBzZWNvbmQ9MCxcXG4gICAgICAgICAgICAgICAgbWljcm9zZWNvbmQ9MCwgdHppbmZvPU5vbmUpOlxcbiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IF9jaGVja19kYXRlX2ZpZWxkcyh5ZWFyLCBtb250aCwgZGF5KVxcbiAgICAgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kID0gX2NoZWNrX3RpbWVfZmllbGRzKFxcbiAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZClcXG4gICAgICAgIF9jaGVja190emluZm9fYXJnKHR6aW5mbylcXG4gICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpXFxuICAgICAgICBzZWxmLl95ZWFyID0geWVhclxcbiAgICAgICAgc2VsZi5fbW9udGggPSBtb250aFxcbiAgICAgICAgc2VsZi5fZGF5ID0gZGF5XFxuICAgICAgICBzZWxmLl9ob3VyID0gaG91clxcbiAgICAgICAgc2VsZi5fbWludXRlID0gbWludXRlXFxuICAgICAgICBzZWxmLl9zZWNvbmQgPSBzZWNvbmRcXG4gICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kID0gbWljcm9zZWNvbmRcXG4gICAgICAgIHNlbGYuX3R6aW5mbyA9IHR6aW5mb1xcbiAgICAgICAgc2VsZi5faGFzaGNvZGUgPSAtMVxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgIyBSZWFkLW9ubHkgZmllbGQgYWNjZXNzb3JzXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgaG91cihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImhvdXIgKDAtMjMpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faG91clxcblxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIG1pbnV0ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIm1pbnV0ZSAoMC01OSlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9taW51dGVcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBzZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJzZWNvbmQgKDAtNTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kXFxuXFxuICAgIEBwcm9wZXJ0eVxcbiAgICBkZWYgbWljcm9zZWNvbmQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJtaWNyb3NlY29uZCAoMC05OTk5OTkpXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbWljcm9zZWNvbmRcXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiB0emluZm8oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ0aW1lem9uZSBpbmZvIG9iamVjdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3R6aW5mb1xcblxcbiAgICBAY2xhc3NtZXRob2RcXG4gICAgZGVmIGZyb210aW1lc3RhbXAoY2xzLCB0aW1lc3RhbXAsIHR6PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ29uc3RydWN0IGEgZGF0ZXRpbWUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSB0aW1lLnRpbWUoKSkuXFxuXFxuICAgICAgICBBIHRpbWV6b25lIGluZm8gb2JqZWN0IG1heSBiZSBwYXNzZWQgaW4gYXMgd2VsbC5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgX2NoZWNrX3R6aW5mb19hcmcodHopXFxuICAgICAgICBjb252ZXJ0ZXIgPSBfdGltZS5sb2NhbHRpbWUgaWYgdHogaXMgTm9uZSBlbHNlIF90aW1lLmdtdGltZVxcbiAgICAgICAgc2VsZiA9IGNscy5fZnJvbV90aW1lc3RhbXAoY29udmVydGVyLCB0aW1lc3RhbXAsIHR6KVxcbiAgICAgICAgaWYgdHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgc2VsZiA9IHR6LmZyb211dGMoc2VsZilcXG4gICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjZnJvbXRpbWVzdGFtcChjbHMsIHQpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS5cXFwiXFxuICAgICAgICByZXR1cm4gY2xzLl9mcm9tX3RpbWVzdGFtcChfdGltZS5nbXRpbWUsIHQsIE5vbmUpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgX2Zyb21fdGltZXN0YW1wKGNscywgY29udmVydGVyLCB0aW1lc3RhbXAsIHR6aW5mbyk6XFxuICAgICAgICB0X2Z1bGwgPSB0aW1lc3RhbXBcXG4gICAgICAgIHRpbWVzdGFtcCA9IGludChfbWF0aC5mbG9vcih0aW1lc3RhbXApKVxcbiAgICAgICAgZnJhYyA9IHRfZnVsbCAtIHRpbWVzdGFtcFxcbiAgICAgICAgdXMgPSBfcm91bmQoZnJhYyAqIDFlNilcXG5cXG4gICAgICAgICMgSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGFcXG4gICAgICAgICMgZnVsbCBzZWNvbmQsIHVzIGNhbiBiZSByb3VuZGVkIHVwIHRvIDEwMDAwMDAuICBJbiB0aGlzIGNhc2UsXFxuICAgICAgICAjIHJvbGwgb3ZlciB0byBzZWNvbmRzLCBvdGhlcndpc2UsIFZhbHVlRXJyb3IgaXMgcmFpc2VkXFxuICAgICAgICAjIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cXG4gICAgICAgIGlmIHVzID09IDEwMDAwMDA6XFxuICAgICAgICAgICAgdGltZXN0YW1wICs9IDFcXG4gICAgICAgICAgICB1cyA9IDBcXG4gICAgICAgIHksIG0sIGQsIGhoLCBtbSwgc3MsIHdlZWtkYXksIGpkYXksIGRzdCA9IGNvbnZlcnRlcih0aW1lc3RhbXApXFxuICAgICAgICBzcyA9IG1pbihzcywgNTkpICAgICMgY2xhbXAgb3V0IGxlYXAgc2Vjb25kcyBpZiB0aGUgcGxhdGZvcm0gaGFzIHRoZW1cXG4gICAgICAgIHJldHVybiBjbHMoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbylcXG5cXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBub3coY2xzLCB0ej1Ob25lKTpcXG4gICAgICAgIFxcXCJDb25zdHJ1Y3QgYSBkYXRldGltZSBmcm9tIHRpbWUudGltZSgpIGFuZCBvcHRpb25hbCB0aW1lIHpvbmUgaW5mby5cXFwiXFxuICAgICAgICB0ID0gX3RpbWUudGltZSgpXFxuICAgICAgICByZXR1cm4gY2xzLmZyb210aW1lc3RhbXAodCwgdHopXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgdXRjbm93KGNscyk6XFxuICAgICAgICBcXFwiQ29uc3RydWN0IGEgVVRDIGRhdGV0aW1lIGZyb20gdGltZS50aW1lKCkuXFxcIlxcbiAgICAgICAgdCA9IF90aW1lLnRpbWUoKVxcbiAgICAgICAgcmV0dXJuIGNscy51dGNmcm9tdGltZXN0YW1wKHQpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgY29tYmluZShjbHMsIGRhdGUsIHRpbWUpOlxcbiAgICAgICAgXFxcIkNvbnN0cnVjdCBhIGRhdGV0aW1lIGZyb20gYSBnaXZlbiBkYXRlIGFuZCBhIGdpdmVuIHRpbWUuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0ZSwgX2RhdGVfY2xhc3MpOlxcbiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihcXFwiZGF0ZSBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZSBpbnN0YW5jZVxcXCIpXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lLCBfdGltZV9jbGFzcyk6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJ0aW1lIGFyZ3VtZW50IG11c3QgYmUgYSB0aW1lIGluc3RhbmNlXFxcIilcXG4gICAgICAgIHJldHVybiBjbHMoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoLCBkYXRlLmRheSxcXG4gICAgICAgICAgICAgICAgICAgdGltZS5ob3VyLCB0aW1lLm1pbnV0ZSwgdGltZS5zZWNvbmQsIHRpbWUubWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgIHRpbWUudHppbmZvKVxcblxcbiAgICBkZWYgdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBsb2NhbCB0aW1lIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLlxcXCJcXG4gICAgICAgIGRzdCA9IHNlbGYuX2RzdCgpXFxuICAgICAgICBpZiBkc3QgaXMgTm9uZTpcXG4gICAgICAgICAgICBkc3QgPSAtMVxcbiAgICAgICAgZWxpZiBkc3Q6XFxuICAgICAgICAgICAgZHN0ID0gMVxcbiAgICAgICAgcmV0dXJuIF9idWlsZF9zdHJ1Y3RfdGltZShzZWxmLnllYXIsIHNlbGYubW9udGgsIHNlbGYuZGF5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvdXIsIHNlbGYubWludXRlLCBzZWxmLnNlY29uZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0KVxcblxcbiAgICBkZWYgdXRjdGltZXR1cGxlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiBVVEMgdGltZSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5nbXRpbWUoKS5cXFwiXFxuICAgICAgICB5LCBtLCBkID0gc2VsZi55ZWFyLCBzZWxmLm1vbnRoLCBzZWxmLmRheVxcbiAgICAgICAgaGgsIG1tLCBzcyA9IHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgaWYgb2Zmc2V0OiAgIyBuZWl0aGVyIE5vbmUgbm9yIDBcXG4gICAgICAgICAgICBtbSAtPSBvZmZzZXRcXG4gICAgICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCBfID0gX25vcm1hbGl6ZV9kYXRldGltZShcXG4gICAgICAgICAgICAgICAgeSwgbSwgZCwgaGgsIG1tLCBzcywgMCwgaWdub3JlX292ZXJmbG93PVRydWUpXFxuICAgICAgICByZXR1cm4gX2J1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIDApXFxuXFxuICAgIGRlZiBkYXRlKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgZGF0ZSBwYXJ0LlxcXCJcXG4gICAgICAgIHJldHVybiBkYXRlKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXkpXFxuXFxuICAgIGRlZiB0aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHR6aW5mbyBOb25lLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kKVxcblxcbiAgICBkZWYgdGltZXR6KHNlbGYpOlxcbiAgICAgICAgXFxcIlJldHVybiB0aGUgdGltZSBwYXJ0LCB3aXRoIHNhbWUgdHppbmZvLlxcXCJcXG4gICAgICAgIHJldHVybiB0aW1lKHNlbGYuaG91ciwgc2VsZi5taW51dGUsIHNlbGYuc2Vjb25kLCBzZWxmLm1pY3Jvc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdHppbmZvKVxcblxcbiAgICBkZWYgcmVwbGFjZShzZWxmLCB5ZWFyPU5vbmUsIG1vbnRoPU5vbmUsIGRheT1Ob25lLCBob3VyPU5vbmUsXFxuICAgICAgICAgICAgICAgIG1pbnV0ZT1Ob25lLCBzZWNvbmQ9Tm9uZSwgbWljcm9zZWNvbmQ9Tm9uZSwgdHppbmZvPVRydWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZHMuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB5ZWFyIGlzIE5vbmU6XFxuICAgICAgICAgICAgeWVhciA9IHNlbGYueWVhclxcbiAgICAgICAgaWYgbW9udGggaXMgTm9uZTpcXG4gICAgICAgICAgICBtb250aCA9IHNlbGYubW9udGhcXG4gICAgICAgIGlmIGRheSBpcyBOb25lOlxcbiAgICAgICAgICAgIGRheSA9IHNlbGYuZGF5XFxuICAgICAgICBpZiBob3VyIGlzIE5vbmU6XFxuICAgICAgICAgICAgaG91ciA9IHNlbGYuaG91clxcbiAgICAgICAgaWYgbWludXRlIGlzIE5vbmU6XFxuICAgICAgICAgICAgbWludXRlID0gc2VsZi5taW51dGVcXG4gICAgICAgIGlmIHNlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuc2Vjb25kXFxuICAgICAgICBpZiBtaWNyb3NlY29uZCBpcyBOb25lOlxcbiAgICAgICAgICAgIG1pY3Jvc2Vjb25kID0gc2VsZi5taWNyb3NlY29uZFxcbiAgICAgICAgaWYgdHppbmZvIGlzIFRydWU6XFxuICAgICAgICAgICAgdHppbmZvID0gc2VsZi50emluZm9cXG4gICAgICAgIHJldHVybiBkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWljcm9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKVxcblxcbiAgICBkZWYgYXN0aW1lem9uZShzZWxmLCB0eik6XFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0eiwgdHppbmZvKTpcXG4gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcInR6IGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdHppbmZvXFxcIilcXG5cXG4gICAgICAgIG15dHogPSBzZWxmLnR6aW5mb1xcbiAgICAgICAgaWYgbXl0eiBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuXFxuICAgICAgICBpZiB0eiBpcyBteXR6OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmXFxuXFxuICAgICAgICAjIENvbnZlcnQgc2VsZiB0byBVVEMsIGFuZCBhdHRhY2ggdGhlIG5ldyB0aW1lIHpvbmUgb2JqZWN0LlxcbiAgICAgICAgbXlvZmZzZXQgPSBzZWxmLnV0Y29mZnNldCgpXFxuICAgICAgICBpZiBteW9mZnNldCBpcyBOb25lOlxcbiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcImFzdGltZXpvbmUoKSByZXF1aXJlcyBhbiBhd2FyZSBkYXRldGltZVxcXCIpXFxuICAgICAgICB1dGMgPSAoc2VsZiAtIG15b2Zmc2V0KS5yZXBsYWNlKHR6aW5mbz10eilcXG5cXG4gICAgICAgICMgQ29udmVydCBmcm9tIFVUQyB0byB0eidzIGxvY2FsIHRpbWUuXFxuICAgICAgICByZXR1cm4gdHouZnJvbXV0Yyh1dGMpXFxuXFxuICAgICMgV2F5cyB0byBwcm9kdWNlIGEgc3RyaW5nLlxcblxcbiAgICBkZWYgY3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLlxcXCJcXG4gICAgICAgIHdlZWtkYXkgPSBzZWxmLnRvb3JkaW5hbCgpICUgNyBvciA3XFxuICAgICAgICByZXR1cm4gXFxcIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkXFxcIiAlIChcXG4gICAgICAgICAgICBfREFZTkFNRVNbd2Vla2RheV0sXFxuICAgICAgICAgICAgX01PTlRITkFNRVNbc2VsZi5fbW9udGhdLFxcbiAgICAgICAgICAgIHNlbGYuX2RheSxcXG4gICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCxcXG4gICAgICAgICAgICBzZWxmLl95ZWFyKVxcblxcbiAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLlxcblxcbiAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWZcXG4gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC5cXG5cXG4gICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmdcXG4gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLlxcblxcbiAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmRcXG4gICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBzID0gKFxcXCIlMDRkLSUwMmQtJTAyZCVjXFxcIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICtcXG4gICAgICAgICAgICAgX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKVxcbiAgICAgICAgb2ZmID0gc2VsZi5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICBpZiBvZmYgPCAwOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIi1cXFwiXFxuICAgICAgICAgICAgICAgIG9mZiA9IC1vZmZcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBzaWduID0gXFxcIitcXFwiXFxuICAgICAgICAgICAgaGgsIG1tID0gZGl2bW9kKG9mZiwgNjApXFxuICAgICAgICAgICAgcyArPSBcXFwiJXMlMDJkOiUwMmRcXFwiICUgKHNpZ24sIGhoLCBtbSlcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3JlcHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNvbnZlcnQgdG8gZm9ybWFsIHN0cmluZywgZm9yIHJlcHIoKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIEwgPSBbc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSwgICMgVGhlc2UgYXJlIG5ldmVyIHplcm9cXG4gICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsIHNlbGYuX21pY3Jvc2Vjb25kXVxcbiAgICAgICAgaWYgTFstMV0gPT0gMDpcXG4gICAgICAgICAgICBkZWwgTFstMV1cXG4gICAgICAgIGlmIExbLTFdID09IDA6XFxuICAgICAgICAgICAgZGVsIExbLTFdXFxuICAgICAgICBzID0gXFxcIiwgXFxcIi5qb2luKG1hcChzdHIsIEwpKVxcbiAgICAgICAgbW9kdWxlID0gXFxcImRhdGV0aW1lLlxcXCIgaWYgc2VsZi5fX2NsYXNzX18gaXMgZGF0ZXRpbWUgZWxzZSBcXFwiXFxcIlxcbiAgICAgICAgcyA9IFxcXCIlcyglcylcXFwiICUgKG1vZHVsZSArIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzKVxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGFzc2VydCBzWy0xOl0gPT0gXFxcIilcXFwiXFxuICAgICAgICAgICAgcyA9IHNbOi0xXSArIFxcXCIsIHR6aW5mbz0lclxcXCIgJSBzZWxmLl90emluZm8gKyBcXFwiKVxcXCJcXG4gICAgICAgIHJldHVybiBzXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIkNvbnZlcnQgdG8gc3RyaW5nLCBmb3Igc3RyKCkuXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXNvZm9ybWF0KHNlcD0nICcpXFxuXFxuICAgIEBjbGFzc21ldGhvZFxcbiAgICBkZWYgc3RycHRpbWUoY2xzLCBkYXRlX3N0cmluZywgZm9ybWF0KTpcXG4gICAgICAgICdzdHJpbmcsIGZvcm1hdCAtPiBuZXcgZGF0ZXRpbWUgcGFyc2VkIGZyb20gYSBzdHJpbmcgKGxpa2UgdGltZS5zdHJwdGltZSgpKS4nXFxuICAgICAgICBmcm9tIF9zdHJwdGltZSBpbXBvcnQgX3N0cnB0aW1lXFxuICAgICAgICAjIF9zdHJwdGltZS5fc3RycHRpbWUgcmV0dXJucyBhIHR3by1lbGVtZW50IHR1cGxlLiAgVGhlIGZpcnN0XFxuICAgICAgICAjIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlXFxuICAgICAgICAjIG1pY3Jvc2Vjb25kcyAod2hpY2ggYXJlIG5vdCBkZWZpbmVkIGZvciB0aW1lLnN0cnVjdF90aW1lKS5cXG4gICAgICAgIHN0cnVjdCwgbWljcm9zID0gX3N0cnB0aW1lKGRhdGVfc3RyaW5nLCBmb3JtYXQpXFxuICAgICAgICByZXR1cm4gY2xzKCooc3RydWN0WzA6Nl0gKyAobWljcm9zLCkpKVxcblxcbiAgICBkZWYgdXRjb2Zmc2V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgd2VzdCBvZlxcbiAgICAgICAgVVRDKS5cXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8udXRjb2Zmc2V0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwidXRjb2Zmc2V0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YS5fY3JlYXRlKDAsIG9mZnNldCAqIDYwLCAwLCBUcnVlKVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIFJldHVybiBhbiBpbnRlZ2VyIChvciBOb25lKSBpbnN0ZWFkIG9mIGEgdGltZWRlbHRhIChvciBOb25lKS5cXG4gICAgZGVmIF91dGNvZmZzZXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgTm9uZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgb2Zmc2V0ID0gc2VsZi5fdHppbmZvLnV0Y29mZnNldChzZWxmKVxcbiAgICAgICAgb2Zmc2V0ID0gX2NoZWNrX3V0Y19vZmZzZXQoXFxcInV0Y29mZnNldFxcXCIsIG9mZnNldClcXG4gICAgICAgIHJldHVybiBvZmZzZXRcXG5cXG4gICAgZGVmIHR6bmFtZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgdGltZXpvbmUgbmFtZS5cXG5cXG4gICAgICAgIE5vdGUgdGhhdCB0aGUgbmFtZSBpcyAxMDAlIGluZm9ybWF0aW9uYWwgLS0gdGhlcmUncyBubyByZXF1aXJlbWVudCB0aGF0XFxuICAgICAgICBpdCBtZWFuIGFueXRoaW5nIGluIHBhcnRpY3VsYXIuIEZvciBleGFtcGxlLCBcXFwiR01UXFxcIiwgXFxcIlVUQ1xcXCIsIFxcXCItNTAwXFxcIixcXG4gICAgICAgIFxcXCItNTowMFxcXCIsIFxcXCJFRFRcXFwiLCBcXFwiVVMvRWFzdGVyblxcXCIsIFxcXCJBbWVyaWNhL05ldyBZb3JrXFxcIiBhcmUgYWxsIHZhbGlkIHJlcGxpZXMuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBuYW1lID0gc2VsZi5fdHppbmZvLnR6bmFtZShzZWxmKVxcbiAgICAgICAgX2NoZWNrX3R6bmFtZShuYW1lKVxcbiAgICAgICAgcmV0dXJuIG5hbWVcXG5cXG4gICAgZGVmIGRzdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiAwIGlmIERTVCBpcyBub3QgaW4gZWZmZWN0LCBvciB0aGUgRFNUIG9mZnNldCAoaW4gbWludXRlc1xcbiAgICAgICAgZWFzdHdhcmQpIGlmIERTVCBpcyBpbiBlZmZlY3QuXFxuXFxuICAgICAgICBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsOyB0aGUgRFNUIG9mZnNldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvXFxuICAgICAgICB0aGUgVVRDIG9mZnNldCByZXR1cm5lZCBieSB1dGNvZmZzZXQoKSBpZiBhcHBsaWNhYmxlLCBzbyB0aGVyZSdzIG5vXFxuICAgICAgICBuZWVkIHRvIGNvbnN1bHQgZHN0KCkgdW5sZXNzIHlvdSdyZSBpbnRlcmVzdGVkIGluIGRpc3BsYXlpbmcgdGhlIERTVFxcbiAgICAgICAgaW5mby5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fdHppbmZvIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG4gICAgICAgIG9mZnNldCA9IHNlbGYuX3R6aW5mby5kc3Qoc2VsZilcXG4gICAgICAgIG9mZnNldCA9IF9jaGVja191dGNfb2Zmc2V0KFxcXCJkc3RcXFwiLCBvZmZzZXQpXFxuICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhLl9jcmVhdGUoMCwgb2Zmc2V0ICogNjAsIDAsIFRydWUpXFxuICAgICAgICByZXR1cm4gb2Zmc2V0XFxuXFxuICAgICMgUmV0dXJuIGFuIGludGVnZXIgKG9yIE5vbmUpIGluc3RlYWQgb2YgYSB0aW1lZGVsdGEgKG9yIE5vbmUpLlxcbiAgICBkZWYgX2RzdChzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuX3R6aW5mbyBpcyBOb25lOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBvZmZzZXQgPSBzZWxmLl90emluZm8uZHN0KHNlbGYpXFxuICAgICAgICBvZmZzZXQgPSBfY2hlY2tfdXRjX29mZnNldChcXFwiZHN0XFxcIiwgb2Zmc2V0KVxcbiAgICAgICAgcmV0dXJuIG9mZnNldFxcblxcbiAgICAjIENvbXBhcmlzb25zIG9mIGRhdGV0aW1lIG9iamVjdHMgd2l0aCBvdGhlci5cXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMFxcbiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCBcXFwidGltZXR1cGxlXFxcIikgYW5kIG5vdCBpc2luc3RhbmNlKG90aGVyLCBkYXRlKTpcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuXFxuICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPCAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID49IDBcXG4gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgXFxcInRpbWV0dXBsZVxcXCIpIGFuZCBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIF9jbXBlcnJvcihzZWxmLCBvdGhlcilcXG5cXG4gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSk6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwXFxuICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsIFxcXCJ0aW1ldHVwbGVcXFwiKSBhbmQgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGRhdGUpOlxcbiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBfY21wZXJyb3Ioc2VsZiwgb3RoZXIpXFxuXFxuICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBkYXRldGltZSlcXG4gICAgICAgIG15dHogPSBzZWxmLl90emluZm9cXG4gICAgICAgIG90dHogPSBvdGhlci5fdHppbmZvXFxuICAgICAgICBteW9mZiA9IG90b2ZmID0gTm9uZVxcblxcbiAgICAgICAgaWYgbXl0eiBpcyBvdHR6OlxcbiAgICAgICAgICAgIGJhc2VfY29tcGFyZSA9IFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgbXl0eiBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgICAgIGlmIG90dHogaXMgbm90IE5vbmU6XFxuICAgICAgICAgICAgICAgIG90b2ZmID0gb3RoZXIuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgYmFzZV9jb21wYXJlID0gbXlvZmYgPT0gb3RvZmZcXG5cXG4gICAgICAgIGlmIGJhc2VfY29tcGFyZTpcXG4gICAgICAgICAgICByZXR1cm4gX2NtcCgoc2VsZi5feWVhciwgc2VsZi5fbW9udGgsIHNlbGYuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIuX3llYXIsIG90aGVyLl9tb250aCwgb3RoZXIuX2RheSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuX2hvdXIsIG90aGVyLl9taW51dGUsIG90aGVyLl9zZWNvbmQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLl9taWNyb3NlY29uZCkpXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgb2Zmc2V0LWF3YXJlIGRhdGV0aW1lc1xcXCIpXFxuICAgICAgICAjIFhYWCBXaGF0IGZvbGxvd3MgY291bGQgYmUgZG9uZSBtb3JlIGVmZmljaWVudGx5Li4uXFxuICAgICAgICBkaWZmID0gc2VsZiAtIG90aGVyICAgICAjIHRoaXMgd2lsbCB0YWtlIG9mZnNldHMgaW50byBhY2NvdW50XFxuICAgICAgICBpZiBkaWZmLmRheXMgPCAwOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgcmV0dXJuIGRpZmYgYW5kIDEgb3IgMFxcblxcbiAgICBkZWYgX2FkZF90aW1lZGVsdGEoc2VsZiwgb3RoZXIsIGZhY3Rvcik6XFxuICAgICAgICB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cyA9IF9ub3JtYWxpemVfZGF0ZXRpbWUoXFxuICAgICAgICAgICAgc2VsZi5feWVhcixcXG4gICAgICAgICAgICBzZWxmLl9tb250aCxcXG4gICAgICAgICAgICBzZWxmLl9kYXkgKyBvdGhlci5kYXlzICogZmFjdG9yLFxcbiAgICAgICAgICAgIHNlbGYuX2hvdXIsXFxuICAgICAgICAgICAgc2VsZi5fbWludXRlLFxcbiAgICAgICAgICAgIHNlbGYuX3NlY29uZCArIG90aGVyLnNlY29uZHMgKiBmYWN0b3IsXFxuICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQgKyBvdGhlci5taWNyb3NlY29uZHMgKiBmYWN0b3IpXFxuICAgICAgICByZXR1cm4gZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbz1zZWxmLl90emluZm8pXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJBZGQgYSBkYXRldGltZSBhbmQgYSB0aW1lZGVsdGEuXFxcIlxcbiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkXFxuICAgICAgICByZXR1cm4gc2VsZi5fYWRkX3RpbWVkZWx0YShvdGhlciwgMSlcXG5cXG4gICAgX19yYWRkX18gPSBfX2FkZF9fXFxuXFxuICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJTdWJ0cmFjdCB0d28gZGF0ZXRpbWVzLCBvciBhIGRhdGV0aW1lIGFuZCBhIHRpbWVkZWx0YS5cXFwiXFxuICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUpOlxcbiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRfdGltZWRlbHRhKG90aGVyLCAtMSlcXG4gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWRcXG5cXG4gICAgICAgIGRlbHRhX2QgPSBzZWxmLnRvb3JkaW5hbCgpIC0gb3RoZXIudG9vcmRpbmFsKClcXG4gICAgICAgIGRlbHRhX3MgPSAoc2VsZi5faG91ciAtIG90aGVyLl9ob3VyKSAqIDM2MDAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX21pbnV0ZSAtIG90aGVyLl9taW51dGUpICogNjAgKyBcXFxcXFxuICAgICAgICAgICAgICAgICAgKHNlbGYuX3NlY29uZCAtIG90aGVyLl9zZWNvbmQpXFxuICAgICAgICBkZWx0YV91cyA9IHNlbGYuX21pY3Jvc2Vjb25kIC0gb3RoZXIuX21pY3Jvc2Vjb25kXFxuICAgICAgICBiYXNlID0gdGltZWRlbHRhLl9jcmVhdGUoZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXMsIFRydWUpXFxuICAgICAgICBpZiBzZWxmLl90emluZm8gaXMgb3RoZXIuX3R6aW5mbzpcXG4gICAgICAgICAgICByZXR1cm4gYmFzZVxcbiAgICAgICAgbXlvZmYgPSBzZWxmLl91dGNvZmZzZXQoKVxcbiAgICAgICAgb3RvZmYgPSBvdGhlci5fdXRjb2Zmc2V0KClcXG4gICAgICAgIGlmIG15b2ZmID09IG90b2ZmOlxcbiAgICAgICAgICAgIHJldHVybiBiYXNlXFxuICAgICAgICBpZiBteW9mZiBpcyBOb25lIG9yIG90b2ZmIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKFxcXCJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kIG9mZnNldC1hd2FyZSBkYXRldGltZXNcXFwiKVxcbiAgICAgICAgcmV0dXJuIGJhc2UgKyB0aW1lZGVsdGEobWludXRlcyA9IG90b2ZmLW15b2ZmKVxcblxcbiAgICBkZWYgX19oYXNoX18oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSA9PSAtMTpcXG4gICAgICAgICAgICB0em9mZiA9IHNlbGYuX3V0Y29mZnNldCgpXFxuICAgICAgICAgICAgaWYgdHpvZmYgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBoYXNoKHNlbGYuX2dldHN0YXRlKClbMF0pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgZGF5cyA9IF95bWQyb3JkKHNlbGYueWVhciwgc2VsZi5tb250aCwgc2VsZi5kYXkpXFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPSBzZWxmLmhvdXIgKiAzNjAwICsgKHNlbGYubWludXRlIC0gdHpvZmYpICogNjAgKyBzZWxmLnNlY29uZFxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IGhhc2godGltZWRlbHRhKGRheXMsIHNlY29uZHMsIHNlbGYubWljcm9zZWNvbmQpKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlXFxuXFxuXFxuXFxuZGF0ZXRpbWUubWluID0gZGF0ZXRpbWUoMSwgMSwgMSlcXG5kYXRldGltZS5tYXggPSBkYXRldGltZSg5OTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSlcXG5kYXRldGltZS5yZXNvbHV0aW9uID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKVxcblxcblxcbmRlZiBfaXNvd2VlazFtb25kYXkoeWVhcik6XFxuICAgICMgSGVscGVyIHRvIGNhbGN1bGF0ZSB0aGUgZGF5IG51bWJlciBvZiB0aGUgTW9uZGF5IHN0YXJ0aW5nIHdlZWsgMVxcbiAgICAjIFhYWCBUaGlzIGNvdWxkIGJlIGRvbmUgbW9yZSBlZmZpY2llbnRseVxcbiAgICBUSFVSU0RBWSA9IDNcXG4gICAgZmlyc3RkYXkgPSBfeW1kMm9yZCh5ZWFyLCAxLCAxKVxcbiAgICBmaXJzdHdlZWtkYXkgPSAoZmlyc3RkYXkgKyA2KSAlIDcgICMgU2VlIHdlZWtkYXkoKSBhYm92ZVxcbiAgICB3ZWVrMW1vbmRheSA9IGZpcnN0ZGF5IC0gZmlyc3R3ZWVrZGF5XFxuICAgIGlmIGZpcnN0d2Vla2RheSA+IFRIVVJTREFZOlxcbiAgICAgICAgd2VlazFtb25kYXkgKz0gN1xcbiAgICByZXR1cm4gd2VlazFtb25kYXlcXG5cXG5cXFwiXFxcIlxcXCJcXG5Tb21lIHRpbWUgem9uZSBhbGdlYnJhLiAgRm9yIGEgZGF0ZXRpbWUgeCwgbGV0XFxuICAgIHgubiA9IHggc3RyaXBwZWQgb2YgaXRzIHRpbWV6b25lIC0tIGl0cyBuYWl2ZSB0aW1lLlxcbiAgICB4Lm8gPSB4LnV0Y29mZnNldCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LmQgPSB4LmRzdCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvclxcbiAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICB4LnMgPSB4J3Mgc3RhbmRhcmQgb2Zmc2V0LCB4Lm8gLSB4LmRcXG5cXG5Ob3cgc29tZSBkZXJpdmVkIHJ1bGVzLCB3aGVyZSBrIGlzIGEgZHVyYXRpb24gKHRpbWVkZWx0YSkuXFxuXFxuMS4geC5vID0geC5zICsgeC5kXFxuICAgVGhpcyBmb2xsb3dzIGZyb20gdGhlIGRlZmluaXRpb24gb2YgeC5zLlxcblxcbjIuIElmIHggYW5kIHkgaGF2ZSB0aGUgc2FtZSB0emluZm8gbWVtYmVyLCB4LnMgPSB5LnMuXFxuICAgVGhpcyBpcyBhY3R1YWxseSBhIHJlcXVpcmVtZW50LCBhbiBhc3N1bXB0aW9uIHdlIG5lZWQgdG8gbWFrZSBhYm91dFxcbiAgIHNhbmUgdHppbmZvIGNsYXNzZXMuXFxuXFxuMy4gVGhlIG5haXZlIFVUQyB0aW1lIGNvcnJlc3BvbmRpbmcgdG8geCBpcyB4Lm4gLSB4Lm8uXFxuICAgVGhpcyBpcyBhZ2FpbiBhIHJlcXVpcmVtZW50IGZvciBhIHNhbmUgdHppbmZvIGNsYXNzLlxcblxcbjQuICh4K2spLnMgPSB4LnNcXG4gICBUaGlzIGZvbGxvd3MgZnJvbSAjMiwgYW5kIHRoYXQgZGF0aW1ldGltZXR6K3RpbWVkZWx0YSBwcmVzZXJ2ZXMgdHppbmZvLlxcblxcbjUuICh4K2spLm4gPSB4Lm4gKyBrXFxuICAgQWdhaW4gZm9sbG93cyBmcm9tIGhvdyBhcml0aG1ldGljIGlzIGRlZmluZWQuXFxuXFxuTm93IHdlIGNhbiBleHBsYWluIHR6LmZyb211dGMoeCkuICBMZXQncyBhc3N1bWUgaXQncyBhbiBpbnRlcmVzdGluZyBjYXNlXFxuKG1lYW5pbmcgdGhhdCB0aGUgdmFyaW91cyB0emluZm8gbWV0aG9kcyBleGlzdCwgYW5kIGRvbid0IGJsb3cgdXAgb3IgcmV0dXJuXFxuTm9uZSB3aGVuIGNhbGxlZCkuXFxuXFxuVGhlIGZ1bmN0aW9uIHdhbnRzIHRvIHJldHVybiBhIGRhdGV0aW1lIHkgd2l0aCB0aW1lem9uZSB0eiwgZXF1aXZhbGVudCB0byB4LlxcbnggaXMgYWxyZWFkeSBpbiBVVEMuXFxuXFxuQnkgIzMsIHdlIHdhbnRcXG5cXG4gICAgeS5uIC0geS5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV1cXG5cXG5UaGUgYWxnb3JpdGhtIHN0YXJ0cyBieSBhdHRhY2hpbmcgdHogdG8geC5uLCBhbmQgY2FsbGluZyB0aGF0IHkuICBTb1xcbngubiA9IHkubiBhdCB0aGUgc3RhcnQuICBUaGVuIGl0IHdhbnRzIHRvIGFkZCBhIGR1cmF0aW9uIGsgdG8geSwgc28gdGhhdCBbMV1cXG5iZWNvbWVzIHRydWU7IGluIGVmZmVjdCwgd2Ugd2FudCB0byBzb2x2ZSBbMl0gZm9yIGs6XFxuXFxuICAgKHkraykubiAtICh5K2spLm8gPSB4Lm4gICAgICAgICAgICAgICAgICAgICAgWzJdXFxuXFxuQnkgIzEsIHRoaXMgaXMgdGhlIHNhbWUgYXNcXG5cXG4gICAoeStrKS5uIC0gKCh5K2spLnMgKyAoeStrKS5kKSA9IHgubiAgICAgICAgICBbM11cXG5cXG5CeSAjNSwgKHkraykubiA9IHkubiArIGssIHdoaWNoIGVxdWFscyB4Lm4gKyBrIGJlY2F1c2UgeC5uPXkubiBhdCB0aGUgc3RhcnQuXFxuU3Vic3RpdHV0aW5nIHRoYXQgaW50byBbM10sXFxuXFxuICAgeC5uICsgayAtICh5K2spLnMgLSAoeStrKS5kID0geC5uOyB0aGUgeC5uIHRlcm1zIGNhbmNlbCwgbGVhdmluZ1xcbiAgIGsgLSAoeStrKS5zIC0gKHkraykuZCA9IDA7IHJlYXJyYW5naW5nLFxcbiAgIGsgPSAoeStrKS5zIC0gKHkraykuZDsgYnkgIzQsICh5K2spLnMgPT0geS5zLCBzb1xcbiAgIGsgPSB5LnMgLSAoeStrKS5kXFxuXFxuT24gdGhlIFJIUywgKHkraykuZCBjYW4ndCBiZSBjb21wdXRlZCBkaXJlY3RseSwgYnV0IHkucyBjYW4gYmUsIGFuZCB3ZVxcbmFwcHJveGltYXRlIGsgYnkgaWdub3JpbmcgdGhlICh5K2spLmQgdGVybSBhdCBmaXJzdC4gIE5vdGUgdGhhdCBrIGNhbid0IGJlXFxudmVyeSBsYXJnZSwgc2luY2UgYWxsIG9mZnNldC1yZXR1cm5pbmcgbWV0aG9kcyByZXR1cm4gYSBkdXJhdGlvbiBvZiBtYWduaXR1ZGVcXG5sZXNzIHRoYW4gMjQgaG91cnMuICBGb3IgdGhhdCByZWFzb24sIGlmIHkgaXMgZmlybWx5IGluIHN0ZCB0aW1lLCAoeStrKS5kIG11c3RcXG5iZSAwLCBzbyBpZ25vcmluZyBpdCBoYXMgbm8gY29uc2VxdWVuY2UgdGhlbi5cXG5cXG5JbiBhbnkgY2FzZSwgdGhlIG5ldyB2YWx1ZSBpc1xcblxcbiAgICB6ID0geSArIHkucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XVxcblxcbkl0J3MgaGVscGZ1bCB0byBzdGVwIGJhY2sgYXQgbG9vayBhdCBbNF0gZnJvbSBhIGhpZ2hlciBsZXZlbDogIGl0J3Mgc2ltcGx5XFxubWFwcGluZyBmcm9tIFVUQyB0byB0eidzIHN0YW5kYXJkIHRpbWUuXFxuXFxuQXQgdGhpcyBwb2ludCwgaWZcXG5cXG4gICAgei5uIC0gei5vID0geC5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNV1cXG5cXG53ZSBoYXZlIGFuIGVxdWl2YWxlbnQgdGltZSwgYW5kIGFyZSBhbG1vc3QgZG9uZS4gIFRoZSBpbnNlY3VyaXR5IGhlcmUgaXNcXG5hdCB0aGUgc3RhcnQgb2YgZGF5bGlnaHQgdGltZS4gIFBpY3R1cmUgVVMgRWFzdGVybiBmb3IgY29uY3JldGVuZXNzLiAgVGhlIHdhbGxcXG50aW1lIGp1bXBzIGZyb20gMTo1OSB0byAzOjAwLCBhbmQgd2FsbCBob3VycyBvZiB0aGUgZm9ybSAyOk1NIGRvbid0IG1ha2UgZ29vZFxcbnNlbnNlIHRoZW4uICBUaGUgZG9jcyBhc2sgdGhhdCBhbiBFYXN0ZXJuIHR6aW5mbyBjbGFzcyBjb25zaWRlciBzdWNoIGEgdGltZSB0b1xcbmJlIEVEVCAoYmVjYXVzZSBpdCdzIFxcXCJhZnRlciAyXFxcIiksIHdoaWNoIGlzIGEgcmVkdW5kYW50IHNwZWxsaW5nIG9mIDE6TU0gRVNUXFxub24gdGhlIGRheSBEU1Qgc3RhcnRzLiAgV2Ugd2FudCB0byByZXR1cm4gdGhlIDE6TU0gRVNUIHNwZWxsaW5nIGJlY2F1c2UgdGhhdCdzXFxudGhlIG9ubHkgc3BlbGxpbmcgdGhhdCBtYWtlcyBzZW5zZSBvbiB0aGUgbG9jYWwgd2FsbCBjbG9jay5cXG5cXG5JbiBmYWN0LCBpZiBbNV0gaG9sZHMgYXQgdGhpcyBwb2ludCwgd2UgZG8gaGF2ZSB0aGUgc3RhbmRhcmQtdGltZSBzcGVsbGluZyxcXG5idXQgdGhhdCB0YWtlcyBhIGJpdCBvZiBwcm9vZi4gIFdlIGZpcnN0IHByb3ZlIGEgc3Ryb25nZXIgcmVzdWx0LiAgV2hhdCdzIHRoZVxcbmRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTEhTIGFuZCBSSFMgb2YgWzVdPyAgTGV0XFxuXFxuICAgIGRpZmYgPSB4Lm4gLSAoei5uIC0gei5vKSAgICAgICAgICAgICAgICAgICAgWzZdXFxuXFxuTm93XFxuICAgIHoubiA9ICAgICAgICAgICAgICAgICAgICAgICBieSBbNF1cXG4gICAgKHkgKyB5LnMpLm4gPSAgICAgICAgICAgICAgIGJ5ICM1XFxuICAgIHkubiArIHkucyA9ICAgICAgICAgICAgICAgICBzaW5jZSB5Lm4gPSB4Lm5cXG4gICAgeC5uICsgeS5zID0gICAgICAgICAgICAgICAgIHNpbmNlIHogYW5kIHkgYXJlIGhhdmUgdGhlIHNhbWUgdHppbmZvIG1lbWJlcixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnMgPSB6LnMgYnkgIzJcXG4gICAgeC5uICsgei5zXFxuXFxuUGx1Z2dpbmcgdGhhdCBiYWNrIGludG8gWzZdIGdpdmVzXFxuXFxuICAgIGRpZmYgPVxcbiAgICB4Lm4gLSAoKHgubiArIHoucykgLSB6Lm8pID0gICAgIGV4cGFuZGluZ1xcbiAgICB4Lm4gLSB4Lm4gLSB6LnMgKyB6Lm8gPSAgICAgICAgIGNhbmNlbGxpbmdcXG4gICAgLSB6LnMgKyB6Lm8gPSAgICAgICAgICAgICAgICAgICBieSAjMlxcbiAgICB6LmRcXG5cXG5TbyBkaWZmID0gei5kLlxcblxcbklmIFs1XSBpcyB0cnVlIG5vdywgZGlmZiA9IDAsIHNvIHouZCA9IDAgdG9vLCBhbmQgd2UgaGF2ZSB0aGUgc3RhbmRhcmQtdGltZVxcbnNwZWxsaW5nIHdlIHdhbnRlZCBpbiB0aGUgZW5kY2FzZSBkZXNjcmliZWQgYWJvdmUuICBXZSdyZSBkb25lLiAgQ29udHJhcmlseSxcXG5pZiB6LmQgPSAwLCB0aGVuIHdlIGhhdmUgYSBVVEMgZXF1aXZhbGVudCwgYW5kIGFyZSBhbHNvIGRvbmUuXFxuXFxuSWYgWzVdIGlzIG5vdCB0cnVlIG5vdywgZGlmZiA9IHouZCAhPSAwLCBhbmQgei5kIGlzIHRoZSBvZmZzZXQgd2UgbmVlZCB0b1xcbmFkZCB0byB6IChpbiBlZmZlY3QsIHogaXMgaW4gdHoncyBzdGFuZGFyZCB0aW1lLCBhbmQgd2UgbmVlZCB0byBzaGlmdCB0aGVcXG5sb2NhbCBjbG9jayBpbnRvIHR6J3MgZGF5bGlnaHQgdGltZSkuXFxuXFxuTGV0XFxuXFxuICAgIHonID0geiArIHouZCA9IHogKyBkaWZmICAgICAgICAgICAgICAgICAgICAgWzddXFxuXFxuYW5kIHdlIGNhbiBhZ2FpbiBhc2sgd2hldGhlclxcblxcbiAgICB6Jy5uIC0geicubyA9IHgubiAgICAgICAgICAgICAgICAgICAgICAgICAgIFs4XVxcblxcbklmIHNvLCB3ZSdyZSBkb25lLiAgSWYgbm90LCB0aGUgdHppbmZvIGNsYXNzIGlzIGluc2FuZSwgYWNjb3JkaW5nIHRvIHRoZVxcbmFzc3VtcHRpb25zIHdlJ3ZlIG1hZGUuICBUaGlzIGFsc28gcmVxdWlyZXMgYSBiaXQgb2YgcHJvb2YuICBBcyBiZWZvcmUsIGxldCdzXFxuY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBMSFMgYW5kIFJIUyBvZiBbOF0gKGFuZCBza2lwcGluZyBzb21lIG9mXFxudGhlIGp1c3RpZmljYXRpb25zIGZvciB0aGUga2luZHMgb2Ygc3Vic3RpdHV0aW9ucyB3ZSd2ZSBkb25lIHNldmVyYWwgdGltZXNcXG5hbHJlYWR5KTpcXG5cXG4gICAgZGlmZicgPSB4Lm4gLSAoeicubiAtIHonLm8pID0gICAgICAgICAgIHJlcGxhY2luZyB6Jy5uIHZpYSBbN11cXG4gICAgICAgICAgICB4Lm4gIC0gKHoubiArIGRpZmYgLSB6Jy5vKSA9ICAgIHJlcGxhY2luZyBkaWZmIHZpYSBbNl1cXG4gICAgICAgICAgICB4Lm4gLSAoei5uICsgeC5uIC0gKHoubiAtIHoubykgLSB6Jy5vKSA9XFxuICAgICAgICAgICAgeC5uIC0gei5uIC0geC5uICsgei5uIC0gei5vICsgeicubyA9ICAgIGNhbmNlbCB4Lm5cXG4gICAgICAgICAgICAtIHoubiArIHoubiAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgY2FuY2VsIHoublxcbiAgICAgICAgICAgIC0gei5vICsgeicubyA9ICAgICAgICAgICAgICAgICAgICAgICMxIHR3aWNlXFxuICAgICAgICAgICAgLXoucyAtIHouZCArIHonLnMgKyB6Jy5kID0gICAgICAgICAgeiBhbmQgeicgaGF2ZSBzYW1lIHR6aW5mb1xcbiAgICAgICAgICAgIHonLmQgLSB6LmRcXG5cXG5TbyB6JyBpcyBVVEMtZXF1aXZhbGVudCB0byB4IGlmZiB6Jy5kID0gei5kIGF0IHRoaXMgcG9pbnQuICBJZiB0aGV5IGFyZSBlcXVhbCxcXG53ZSd2ZSBmb3VuZCB0aGUgVVRDLWVxdWl2YWxlbnQgc28gYXJlIGRvbmUuICBJbiBmYWN0LCB3ZSBzdG9wIHdpdGggWzddIGFuZFxcbnJldHVybiB6Jywgbm90IGJvdGhlcmluZyB0byBjb21wdXRlIHonLmQuXFxuXFxuSG93IGNvdWxkIHouZCBhbmQgeidkIGRpZmZlcj8gIHonID0geiArIHouZCBbN10sIHNvIG1lcmVseSBtb3ZpbmcgeicgYnlcXG5hIGRzdCgpIG9mZnNldCwgYW5kIHN0YXJ0aW5nICpmcm9tKiBhIHRpbWUgYWxyZWFkeSBpbiBEU1QgKHdlIGtub3cgei5kICE9IDApLFxcbndvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSByZXN1bHQgZHN0KCkgcmV0dXJuczogIHdlIHN0YXJ0IGluIERTVCwgYW5kIG1vdmluZ1xcbmEgbGl0dGxlIGZ1cnRoZXIgaW50byBpdCB0YWtlcyB1cyBvdXQgb2YgRFNULlxcblxcblRoZXJlIGlzbid0IGEgc2FuZSBjYXNlIHdoZXJlIHRoaXMgY2FuIGhhcHBlbi4gIFRoZSBjbG9zZXN0IGl0IGdldHMgaXMgYXRcXG50aGUgZW5kIG9mIERTVCwgd2hlcmUgdGhlcmUncyBhbiBob3VyIGluIFVUQyB3aXRoIG5vIHNwZWxsaW5nIGluIGEgaHlicmlkXFxudHppbmZvIGNsYXNzLiAgSW4gVVMgRWFzdGVybiwgdGhhdCdzIDU6TU0gVVRDID0gMDpNTSBFU1QgPSAxOk1NIEVEVC4gIER1cmluZ1xcbnRoYXQgaG91ciwgb24gYW4gRWFzdGVybiBjbG9jayAxOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIHN0YW5kYXJkIHRpbWUgKDY6TU1cXG5VVEMpIGJlY2F1c2UgdGhlIGRvY3MgaW5zaXN0IG9uIHRoYXQsIGJ1dCAwOk1NIGlzIHRha2VuIGFzIGJlaW5nIGluIGRheWxpZ2h0XFxudGltZSAoNDpNTSBVVEMpLiAgVGhlcmUgaXMgbm8gbG9jYWwgdGltZSBtYXBwaW5nIHRvIDU6TU0gVVRDLiAgVGhlIGxvY2FsXFxuY2xvY2sganVtcHMgZnJvbSAxOjU5IGJhY2sgdG8gMTowMCBhZ2FpbiwgYW5kIHJlcGVhdHMgdGhlIDE6TU0gaG91ciBpblxcbnN0YW5kYXJkIHRpbWUuICBTaW5jZSB0aGF0J3Mgd2hhdCB0aGUgbG9jYWwgY2xvY2sgKmRvZXMqLCB3ZSB3YW50IHRvIG1hcCBib3RoXFxuVVRDIGhvdXJzIDU6TU0gYW5kIDY6TU0gdG8gMTpNTSBFYXN0ZXJuLiAgVGhlIHJlc3VsdCBpcyBhbWJpZ3VvdXNcXG5pbiBsb2NhbCB0aW1lLCBidXQgc28gaXQgZ29lcyAtLSBpdCdzIHRoZSB3YXkgdGhlIGxvY2FsIGNsb2NrIHdvcmtzLlxcblxcbldoZW4geCA9IDU6TU0gVVRDIGlzIHRoZSBpbnB1dCB0byB0aGlzIGFsZ29yaXRobSwgeC5vPTAsIHkubz0tNSBhbmQgeS5kPTAsXFxuc28gej0wOk1NLiAgei5kPTYwIChtaW51dGVzKSB0aGVuLCBzbyBbNV0gZG9lc24ndCBob2xkIGFuZCB3ZSBrZWVwIGdvaW5nLlxcbnonID0geiArIHouZCA9IDE6TU0gdGhlbiwgYW5kIHonLmQ9MCwgYW5kIHonLmQgLSB6LmQgPSAtNjAgIT0gMCBzbyBbOF1cXG4oY29ycmVjdGx5KSBjb25jbHVkZXMgdGhhdCB6JyBpcyBub3QgVVRDLWVxdWl2YWxlbnQgdG8geC5cXG5cXG5CZWNhdXNlIHdlIGtub3cgei5kIHNhaWQgeiB3YXMgaW4gZGF5bGlnaHQgdGltZSAoZWxzZSBbNV0gd291bGQgaGF2ZSBoZWxkIGFuZFxcbndlIHdvdWxkIGhhdmUgc3RvcHBlZCB0aGVuKSwgYW5kIHdlIGtub3cgei5kICE9IHonLmQgKGVsc2UgWzhdIHdvdWxkIGhhdmUgaGVsZFxcbmFuZCB3ZSBoYXZlIHN0b3BwZWQgdGhlbiksIGFuZCB0aGVyZSBhcmUgb25seSAyIHBvc3NpYmxlIHZhbHVlcyBkc3QoKSBjYW5cXG5yZXR1cm4gaW4gRWFzdGVybiwgaXQgZm9sbG93cyB0aGF0IHonLmQgbXVzdCBiZSAwICh3aGljaCBpdCBpcyBpbiB0aGUgZXhhbXBsZSxcXG5idXQgdGhlIHJlYXNvbmluZyBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgZXhhbXBsZSAtLSBpdCBkZXBlbmRzIG9uIHRoZXJlIGJlaW5nXFxudHdvIHBvc3NpYmxlIGRzdCgpIG91dGNvbWVzLCBvbmUgemVybyBhbmQgdGhlIG90aGVyIG5vbi16ZXJvKS4gIFRoZXJlZm9yZVxcbnonIG11c3QgYmUgaW4gc3RhbmRhcmQgdGltZSwgYW5kIGlzIHRoZSBzcGVsbGluZyB3ZSB3YW50IGluIHRoaXMgY2FzZS5cXG5cXG5Ob3RlIGFnYWluIHRoYXQgeicgaXMgbm90IFVUQy1lcXVpdmFsZW50IGFzIGZhciBhcyB0aGUgaHlicmlkIHR6aW5mbyBjbGFzcyBpc1xcbmNvbmNlcm5lZCAoYmVjYXVzZSBpdCB0YWtlcyB6JyBhcyBiZWluZyBpbiBzdGFuZGFyZCB0aW1lIHJhdGhlciB0aGFuIHRoZVxcbmRheWxpZ2h0IHRpbWUgd2UgaW50ZW5kIGhlcmUpLCBidXQgcmV0dXJuaW5nIGl0IGdpdmVzIHRoZSByZWFsLWxpZmUgXFxcImxvY2FsXFxuY2xvY2sgcmVwZWF0cyBhbiBob3VyXFxcIiBiZWhhdmlvciB3aGVuIG1hcHBpbmcgdGhlIFxcXCJ1bnNwZWxsYWJsZVxcXCIgVVRDIGhvdXIgaW50b1xcbnR6LlxcblxcbldoZW4gdGhlIGlucHV0IGlzIDY6TU0sIHo9MTpNTSBhbmQgei5kPTAsIGFuZCB3ZSBzdG9wIGF0IG9uY2UsIGFnYWluIHdpdGhcXG50aGUgMTpNTSBzdGFuZGFyZCB0aW1lIHNwZWxsaW5nIHdlIHdhbnQuXFxuXFxuU28gaG93IGNhbiB0aGlzIGJyZWFrPyAgT25lIG9mIHRoZSBhc3N1bXB0aW9ucyBtdXN0IGJlIHZpb2xhdGVkLiAgVHdvXFxucG9zc2liaWxpdGllczpcXG5cXG4xKSBbMl0gZWZmZWN0aXZlbHkgc2F5cyB0aGF0IHkucyBpcyBpbnZhcmlhbnQgYWNyb3NzIGFsbCB5IGJlbG9uZyB0byBhIGdpdmVuXFxuICAgdGltZSB6b25lLiAgVGhpcyBpc24ndCB0cnVlIGlmLCBmb3IgcG9saXRpY2FsIHJlYXNvbnMgb3IgY29udGluZW50YWwgZHJpZnQsXFxuICAgYSByZWdpb24gZGVjaWRlcyB0byBjaGFuZ2UgaXRzIGJhc2Ugb2Zmc2V0IGZyb20gVVRDLlxcblxcbjIpIFRoZXJlIG1heSBiZSB2ZXJzaW9ucyBvZiBcXFwiZG91YmxlIGRheWxpZ2h0XFxcIiB0aW1lIHdoZXJlIHRoZSB0YWlsIGVuZCBvZlxcbiAgIHRoZSBhbmFseXNpcyBnaXZlcyB1cCBhIHN0ZXAgdG9vIGVhcmx5LiAgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgdGhhdFxcbiAgIGVub3VnaCB0byBzYXkuXFxuXFxuSW4gYW55IGNhc2UsIGl0J3MgY2xlYXIgdGhhdCB0aGUgZGVmYXVsdCBmcm9tdXRjKCkgaXMgc3Ryb25nIGVub3VnaCB0byBoYW5kbGVcXG5cXFwiYWxtb3N0IGFsbFxcXCIgdGltZSB6b25lczogIHNvIGxvbmcgYXMgdGhlIHN0YW5kYXJkIG9mZnNldCBpcyBpbnZhcmlhbnQsIGl0XFxuZG9lc24ndCBtYXR0ZXIgaWYgZGF5bGlnaHQgdGltZSB0cmFuc2l0aW9uIHBvaW50cyBjaGFuZ2UgZnJvbSB5ZWFyIHRvIHllYXIsIG9yXFxuaWYgZGF5bGlnaHQgdGltZSBpcyBza2lwcGVkIGluIHNvbWUgeWVhcnM7IGl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBsYXJnZSBvclxcbnNtYWxsIGRzdCgpIG1heSBnZXQgd2l0aGluIGl0cyBib3VuZHM7IGFuZCBpdCBkb2Vzbid0IGV2ZW4gbWF0dGVyIGlmIHNvbWVcXG5wZXJ2ZXJzZSB0aW1lIHpvbmUgcmV0dXJucyBhIG5lZ2F0aXZlIGRzdCgpKS4gIFNvIGEgYnJlYWtpbmcgY2FzZSBtdXN0IGJlXFxucHJldHR5IGJpemFycmUsIGFuZCBhIHR6aW5mbyBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgZnJvbXV0YygpIGlmIGl0IGlzLlxcblxcXCJcXFwiXFxcIlxcblwiLFwic3JjL2xpYi9kYmhhc2gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRiaGFzaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RlY2ltYWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRlY2ltYWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaWZmbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaWZmbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlyY2FjaGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpcmNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkaXMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kaXN0dXRpbHMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRpc3R1dGlscyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJjb21tYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2RvY3Rlc3QucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImRvY3Rlc3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9kb2N1bWVudC5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGEsYj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkb2N1bWVudFxcXCIpfTtyZXR1cm4gYi5nZXRFbGVtZW50QnlJZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudik7cmV0dXJuIGM/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuRWxlbWVudCxbY10pOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuY3JlYXRlRWxlbWVudD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS52KTtpZihjKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjXSl9KSxiLmdldEVsZW1lbnRzQnlUYWdOYW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGEudiksZD1bXSxlPWMubGVuZ3RoLTE7MDw9ZTtlLS0pZC5wdXNoKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NbZV1dKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoZCl9KSxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRFbGVtZW50c0J5TmFtZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5xdWVyeVNlbGVjdG9yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhLnYpO3JldHVybiBjP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2NdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxiLnF1ZXJ5U2VsZWN0b3JBbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhLnYpLGQ9W10sZT0wO2U8Yy5sZW5ndGg7ZSsrKWQucHVzaChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5FbGVtZW50LFtjW2VdXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGQpfSksYi5nZXRDdXJyZW50RWRpdG9yVmFsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmRpdmlkJiZ2b2lkIDAhPT13aW5kb3cuZWRMaXN0KXtpZihTay5ncmFkZUNvbnRhaW5lciE9U2suZGl2aWQpe3ZhciBhPVNrLmdyYWRlQ29udGFpbmVyK1xcXCIgXFxcIitTay5kaXZpZDtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHdpbmRvdy5lZExpc3RbYV0uZWRpdG9yLmdldFZhbHVlKCkpfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIod2luZG93LmVkTGlzdFtTay5kaXZpZF0uZWRpdG9yLmdldFZhbHVlKCkpfXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJDYW4ndCBmaW5kIGVkaXRvciBmb3IgdGhpcyBkaXZcXFwiKX0pLGIuY3VycmVudERpdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09U2suZGl2aWQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5kaXZpZCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXFxcIlRoZXJlIGlzIG5vIHZhbHVlIHNldCBmb3IgZGl2aWRcXFwiKX0pLGIuY3VycmVudENvdXJzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYodm9pZCAwIT09ZUJvb2tDb25maWcpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlQm9va0NvbmZpZy5jb3Vyc2UpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyBjb3Vyc2VcXFwiKX0pLGIuY3VycmVudEdyYWRpbmdDb250YWluZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKHZvaWQgMCE9PVNrLmdyYWRlQ29udGFpbmVyKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZ3JhZGVDb250YWluZXIpO2lmKG51bGwhPVNrLmRpdmlkKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU2suZGl2aWQpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFxcXCJUaGVyZSBpcyBubyB2YWx1ZSBzZXQgZm9yIGdyYWRpbmdcXFwiKX0pLGE9ZnVuY3Rpb24oYSxjKXtjLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9YixhLmlubmVySFRNTD1iLmlubmVySFRNTCxhLmlubmVyVGV4dD1iLmlubmVyVGV4dCx2b2lkIDAhPT1iLnZhbHVlJiYoYS52YWx1ZT1iLnZhbHVlLFNrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoXFxcInZhbHVlXFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpKSksdm9pZCAwIT09Yi5jaGVja2VkJiYoYS5jaGVja2VkPWIuY2hlY2tlZCxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJjaGVja2VkXFxcIiksU2suYnVpbHRpbi5ib29sKGEuY2hlY2tlZCkpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lckhUTUwpKSxTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxuZXcgU2suYnVpbHRpbi5zdHIoYS5pbm5lclRleHQpKX0pLGMudHAkZ2V0YXR0cj1Tay5nZW5lcmljLmdldEF0dHIsYy5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImlubmVySFRNTFxcXCI9PT1iJiYoYS5pbm5lckhUTUw9YyxhLnYuaW5uZXJIVE1MPWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lckhUTUxcXFwiKSxjKSksXFxcImlubmVyVGV4dFxcXCI9PT1iJiYoYS5pbm5lclRleHQ9YyxhLnYuaW5uZXJUZXh0PWMudixTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEuJGQsbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJpbm5lclRleHRcXFwiKSxjKSl9KSxjLmFwcGVuZENoaWxkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYuYXBwZW5kQ2hpbGQoYi52KX0pLGMucmVtb3ZlQ2hpbGQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Eudi5yZW1vdmVDaGlsZChiLnYpfSksYy5jbG9zZXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnYuY2xvc2VzdChjLnYpO3JldHVybiBkP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLkVsZW1lbnQsW2RdKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLmdldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLnYuc3R5bGVbYi52XSl9KSxjLnNldENTUz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc3R5bGVbYi52XT1jLnZ9KSxjLmdldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldEF0dHJpYnV0ZShiLnYpO3JldHVybiBjP25ldyBTay5idWlsdGluLnN0cihjKTpTay5idWlsdGluLm5vbmUubm9uZSR9KSxjLnNldEF0dHJpYnV0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLnYuc2V0QXR0cmlidXRlKGIudixjLnYpfSksYy5nZXRQcm9wZXJ0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52W2Iudl07cmV0dXJuIGM/bmV3IFNrLmJ1aWx0aW4uc3RyKGMpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGMuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBjb25zb2xlLmxvZyhhLnYudGFnTmFtZSksbmV3IFNrLmJ1aWx0aW4uc3RyKGEudi50YWdOYW1lKX0pLGMuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltET00gRWxlbWVudF1cXFwiKX0pfSxiLkVsZW1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhiLGEsXFxcIkVsZW1lbnRcXFwiLFtdKSxifTtcIixcInNyYy9saWIvZHVtYmRibS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtYmRibSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2R1bW15X3RocmVhZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZHVtbXlfdGhyZWFkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZHVtbXlfdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teV90aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZW1haWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1lIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW1haWwvdGVzdC9kYXRhL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZW5jb2RpbmdzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJlbmNvZGluZ3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9maWxlY21wLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlY21wIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZmlsZWlucHV0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmaWxlaW5wdXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mbm1hdGNoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmbm1hdGNoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZm9ybWF0dGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmb3JtYXR0ZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcGZvcm1hdC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnBmb3JtYXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9mcmFjdGlvbnMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZyYWN0aW9ucyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2Z0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZnRwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZnVuY3Rvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJmdW5jdG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZW5lcmljcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2VuZXJpY3BhdGggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXRvcHQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldG9wdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2dldHBhc3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImdldHBhc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9nZXR0ZXh0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJnZXR0ZXh0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvZ2xvYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZ2xvYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2d6aXAucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImd6aXAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9oYXNobGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJoYXNobGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaGVhcHEucHlcIjpcIlxcXCJcXFwiXFxcIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLlxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblVzYWdlOlxcblxcbmhlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwXFxuaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcFxcbml0ZW0gPSBoZWFwcG9wKGhlYXApICMgcG9wcyB0aGUgc21hbGxlc3QgaXRlbSBmcm9tIHRoZSBoZWFwXFxuaXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdFxcbmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWVcXG5pdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkgIyBwb3BzIGFuZCByZXR1cm5zIHNtYWxsZXN0IGl0ZW0sIGFuZCBhZGRzXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkXFxuXFxuT3VyIEFQSSBkaWZmZXJzIGZyb20gdGV4dGJvb2sgaGVhcCBhbGdvcml0aG1zIGFzIGZvbGxvd3M6XFxuXFxuLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZVxcbiAgaW5kZXggZm9yIGEgbm9kZSBhbmQgdGhlIGluZGV4ZXMgZm9yIGl0cyBjaGlsZHJlbiBzbGlnaHRseSBsZXNzXFxuICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLlxcblxcbi0gT3VyIGhlYXBwb3AoKSBtZXRob2QgcmV0dXJucyB0aGUgc21hbGxlc3QgaXRlbSwgbm90IHRoZSBsYXJnZXN0LlxcblxcblRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0XFxud2l0aG91dCBzdXJwcmlzZXM6IGhlYXBbMF0gaXMgdGhlIHNtYWxsZXN0IGl0ZW0sIGFuZCBoZWFwLnNvcnQoKVxcbm1haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBPcmlnaW5hbCBjb2RlIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycyBhbmQgUmF5bW9uZCBIZXR0aW5nZXJcXG5cXG5fX2Fib3V0X18gPSBcXFwiXFxcIlxcXCJIZWFwIHF1ZXVlc1xcblxcbltleHBsYW5hdGlvbiBieSBGcmFuw6dvaXMgUGluYXJkXVxcblxcbkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXFxuYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLFxcbm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xcbnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxcblxcblRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XFxucmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxcblxcbiAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXFxuXFxuICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2XFxuXFxuICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxcblxcbiAgICAxNSAxNiAgIDE3IDE4ICAgMTkgMjAgICAyMSAyMiAgIDIzIDI0ICAgMjUgMjYgICAyNyAyOCAgIDI5IDMwXFxuXFxuXFxuSW4gdGhlIHRyZWUgYWJvdmUsIGVhY2ggY2VsbCBgaycgaXMgdG9wcGluZyBgMiprKzEnIGFuZCBgMiprKzInLiAgSW5cXG5hIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXFxub3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlXFxudG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9uc1xcbm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxcblRvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvXFxucmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lc1xcbnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXFxuYnV0IHRoZSB0b3AgY2VsbCBcXFwid2luc1xcXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cXG5cXG5JZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XFxudGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kXFxuZmluZCB0aGUgXFxcIm5leHRcXFwiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZVxcbmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd25cXG50aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXFxuVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuXFxuQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LlxcblxcbkEgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ld1xcbml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcXG5ub3QgXFxcImJldHRlclxcXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcXG5lc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGxcXG5pbmNvbWluZyBldmVudHMsIGFuZCB0aGUgXFxcIndpblxcXCIgY29uZGl0aW9uIG1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWRcXG50aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmVcXG5zY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXFxuaGVhcCBpcyBhIGdvb2Qgc3RydWN0dXJlIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyAodGhpcyBpcyB3aGF0IElcXG51c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuXFxuXFxuVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHlcXG5zdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxcbnRoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnRcXG50aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoXFxuYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXFxuXFxuSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcXG5rbm93IHRoYXQgYSBiaWcgc29ydCBpbXBsaWVzIHByb2R1Y2luZyBcXFwicnVuc1xcXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXFxuc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLFxcbmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW5cXG52ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcXG5zb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheVxcbnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3VcXG5yZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXFxucHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsXFxuYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuXFxuXFxuTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2hcXG5tYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcXFwid2luc1xcXCIgb3ZlclxcbnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxcbmhlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHlcXG5mb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZVxcbnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XFxudmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGVcXG5lZmZlY3RpdmUhXFxuXFxuSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluXFxuYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlXFxuYXJvdW5kLiA6LSlcXG5cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxcblsxXSBUaGUgZGlzayBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3aGljaCBhcmUgY3VycmVudCwgbm93YWRheXMsIGFyZVxcbm1vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmdcXG5jYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcXG50YXBlIGRyaXZlcywgdGhlIHN0b3J5IHdhcyBxdWl0ZSBkaWZmZXJlbnQsIGFuZCBvbmUgaGFkIHRvIGJlIHZlcnlcXG5jbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGVcXG5tb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XFxuXFxcInByb2dyZXNzaW5nXFxcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXFxuYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS5cXG5CZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIVxcbkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsnaGVhcHB1c2gnLCAnaGVhcHBvcCcsICdoZWFwaWZ5JywgJ2hlYXByZXBsYWNlJyxcXG4gICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXVxcblxcbmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LlxcXCJcXFwiXFxcIlxcbiAgICBoZWFwLmFwcGVuZChpdGVtKVxcbiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpXFxuXFxuZGVmIGhlYXBwb3AoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC5cXFwiXFxcIlxcXCJcXG4gICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5XFxuICAgIGlmIGhlYXA6XFxuICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXVxcbiAgICAgICAgaGVhcFswXSA9IGxhc3RlbHRcXG4gICAgICAgIF9zaWZ0dXAoaGVhcCwgMClcXG4gICAgICAgIHJldHVybiByZXR1cm5pdGVtXFxuICAgIHJldHVybiBsYXN0ZWx0XFxuXFxuZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOlxcbiAgICBcXFwiXFxcIlxcXCJQb3AgYW5kIHJldHVybiB0aGUgY3VycmVudCBzbWFsbGVzdCB2YWx1ZSwgYW5kIGFkZCB0aGUgbmV3IGl0ZW0uXFxuXFxuICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZVxcbiAgICBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gdXNpbmcgYSBmaXhlZC1zaXplIGhlYXAuICBOb3RlIHRoYXQgdGhlIHZhbHVlXFxuICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZlxcbiAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxcblxcbiAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06XFxuICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cChoZWFwLCAwKVxcbiAgICByZXR1cm4gcmV0dXJuaXRlbVxcblxcbmRlZiBoZWFwcHVzaHBvcChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLlxcXCJcXFwiXFxcIlxcbiAgICBpZiBoZWFwIGFuZCBoZWFwWzBdIDwgaXRlbTpcXG4gICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtXFxuICAgICAgICBfc2lmdHVwKGhlYXAsIDApXFxuICAgIHJldHVybiBpdGVtXFxuXFxuZGVmIGhlYXBpZnkoeCk6XFxuICAgIFxcXCJcXFwiXFxcIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuXFxcIlxcXCJcXFwiXFxuICAgIG4gPSBsZW4oeClcXG4gICAgIyBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8gbG9va2luZyBhdFxcbiAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLFxcbiAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvXFxuICAgICMgai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXNcXG4gICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS5cXG4gICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOlxcbiAgICAgICAgX3NpZnR1cCh4LCBpKVxcblxcbmRlZiBfaGVhcHBvcF9tYXgoaGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwb3AuXFxcIlxcXCJcXFwiXFxuICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eVxcbiAgICBpZiBoZWFwOlxcbiAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF1cXG4gICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0XFxuICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKVxcbiAgICAgICAgcmV0dXJuIHJldHVybml0ZW1cXG4gICAgcmV0dXJuIGxhc3RlbHRcXG5cXG5kZWYgX2hlYXByZXBsYWNlX21heChoZWFwLCBpdGVtKTpcXG4gICAgXFxcIlxcXCJcXFwiTWF4aGVhcCB2ZXJzaW9uIG9mIGEgaGVhcHBvcCBmb2xsb3dlZCBieSBhIGhlYXBwdXNoLlxcXCJcXFwiXFxcIlxcbiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHlcXG4gICAgaGVhcFswXSA9IGl0ZW1cXG4gICAgX3NpZnR1cF9tYXgoaGVhcCwgMClcXG4gICAgcmV0dXJuIHJldHVybml0ZW1cXG5cXG5kZWYgX2hlYXBpZnlfbWF4KHgpOlxcbiAgICBcXFwiXFxcIlxcXCJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgbWF4aGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLlxcXCJcXFwiXFxcIlxcbiAgICBuID0gbGVuKHgpXFxuICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4vLzIpKTpcXG4gICAgICAgIF9zaWZ0dXBfbWF4KHgsIGkpXFxuXFxuIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvc1xcbiMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGVcXG4jIGhlYXAgaW52YXJpYW50LlxcbmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlXFxuICAgICMgbmV3aXRlbSBmaXRzLlxcbiAgICB3aGlsZSBwb3MgPiBzdGFydHBvczpcXG4gICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxXFxuICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc11cXG4gICAgICAgIGlmIG5ld2l0ZW0gPCBwYXJlbnQ6XFxuICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50XFxuICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zXFxuICAgICAgICAgICAgY29udGludWVcXG4gICAgICAgIGJyZWFrXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG5cXG4jIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlXFxuIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2ZcXG4jIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLFxcbiMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLlxcbiNcXG4jIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9XFxuIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0XFxuIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXlcXG4jIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXRcXG4jIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3RcXG4jIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpc1xcbiMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLlxcbiNcXG4jIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vXFxuIyB3YXkgdG8gZXh0cmFjdCBcXFwidGhlIHByaW9yaXR5XFxcIiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlXFxuIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBjb21wYXJpc29uIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzXFxuIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseVxcbiMgZXhwZW5zaXZlLlxcbiNcXG4jIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZlxcbiMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmVcXG4jIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gM1xcbiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOlxcbiNcXG4jIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODBcXG4jIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OFxcbiMgMTg0NyBjdXQgdG8gMTY2MCAgICAgICAgICAgICAgIDE1MDI0IGN1dCB0byA4NzAzXFxuI1xcbiMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWRcXG4jIDIxOTgsIDIxNDgsIGFuZCAyMjE5IGNvbXBhcmVzOiAgaGVhcGlmeSgpIGlzIG1vcmUgZWZmaWNpZW50LCB3aGVuXFxuIyB5b3UgY2FuIHVzZSBpdC5cXG4jXFxuIyBUaGUgdG90YWwgY29tcGFyZXMgbmVlZGVkIGJ5IGxpc3Quc29ydCgpIG9uIHRoZSBzYW1lIGxpc3RzIHdlcmUgODYyNyxcXG4jIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmRcXG4jIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudFxcbiMgZm9yIHNvcnRpbmcuXFxuXFxuZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKTpcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuXFxuICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb25cXG4gICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6XFxuICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLlxcbiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDFcXG4gICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgaGVhcFtjaGlsZHBvc10gPCBoZWFwW3JpZ2h0cG9zXTpcXG4gICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zXFxuICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpXFxuXFxuZGVmIF9zaWZ0ZG93bl9tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnRkb3duJ1xcbiAgICBuZXdpdGVtID0gaGVhcFtwb3NdXFxuICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZVxcbiAgICAjIG5ld2l0ZW0gZml0cy5cXG4gICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6XFxuICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMVxcbiAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdXFxuICAgICAgICBpZiBwYXJlbnQgPCBuZXdpdGVtOlxcbiAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudFxcbiAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvc1xcbiAgICAgICAgICAgIGNvbnRpbnVlXFxuICAgICAgICBicmVha1xcbiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtXFxuXFxuZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6XFxuICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnR1cCdcXG4gICAgZW5kcG9zID0gbGVuKGhlYXApXFxuICAgIHN0YXJ0cG9zID0gcG9zXFxuICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc11cXG4gICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi5cXG4gICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvblxcbiAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczpcXG4gICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC5cXG4gICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxXFxuICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgbm90IGhlYXBbcmlnaHRwb3NdIDwgaGVhcFtjaGlsZHBvc106XFxuICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvc1xcbiAgICAgICAgIyBNb3ZlIHRoZSBsYXJnZXIgY2hpbGQgdXAuXFxuICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXVxcbiAgICAgICAgcG9zID0gY2hpbGRwb3NcXG4gICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxXFxuICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwXFxuICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuXFxuICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW1cXG4gICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKVxcblxcblxcbiMgQWxnb3JpdGhtIG5vdGVzIGZvciBubGFyZ2VzdCgpIGFuZCBuc21hbGxlc3QoKVxcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbiNcXG4jIE1ha2UgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBkYXRhIHdoaWxlIGtlZXBpbmcgdGhlIGsgbW9zdCBleHRyZW1lIHZhbHVlc1xcbiMgaW4gYSBoZWFwLiAgTWVtb3J5IGNvbnN1bXB0aW9uIGlzIGxpbWl0ZWQgdG8ga2VlcGluZyBrIHZhbHVlcyBpbiBhIGxpc3QuXFxuI1xcbiMgTWVhc3VyZWQgcGVyZm9ybWFuY2UgZm9yIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjb21wYXJpc29uc1xcbiMgICAgbiBpbnB1dHMgICAgIGstZXh0cmVtZSB2YWx1ZXMgIChhdmVyYWdlIG9mIDUgdHJpYWxzKSAgICUgbW9yZSB0aGFuIG1pbigpXFxuIyAtLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAgICAgMSwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDMsMzE3ICAgICAgICAgICAgICAgMjMxLjclXFxuIyAgICAgMTAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgIDE0LDA0NiAgICAgICAgICAgICAgICA0MC41JVxcbiMgICAgMTAwLDAwMCAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgIDEwNSw3NDkgICAgICAgICAgICAgICAgIDUuNyVcXG4jICAxLDAwMCwwMDAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgMSwwMDcsNzUxICAgICAgICAgICAgICAgICAwLjglXFxuIyAxMCwwMDAsMDAwICAgICAgICAgICAxMDAgICAgICAgICAgICAgMTAsMDA5LDQwMSAgICAgICAgICAgICAgICAgMC4xJVxcbiNcXG4jIFRoZW9yZXRpY2FsIG51bWJlciBvZiBjb21wYXJpc29ucyBmb3IgayBzbWFsbGVzdCBvZiBuIHJhbmRvbSBpbnB1dHM6XFxuI1xcbiMgU3RlcCAgIENvbXBhcmlzb25zICAgICAgICAgICAgICAgICAgQWN0aW9uXFxuIyAtLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4jICAxICAgICAxLjY2ICogayAgICAgICAgICAgICAgICAgICAgIGhlYXBpZnkgdGhlIGZpcnN0IGstaW5wdXRzXFxuIyAgMiAgICAgbiAtIGsgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlIHJlbWFpbmluZyBlbGVtZW50cyB0byB0b3Agb2YgaGVhcFxcbiMgIDMgICAgIGsgKiAoMSArIGxnMihrKSkgKiBsbihuL2spICAgcmVwbGFjZSB0aGUgdG9wbW9zdCB2YWx1ZSBvbiB0aGUgaGVhcFxcbiMgIDQgICAgIGsgKiBsZzIoaykgLSAoay8yKSAgICAgICAgICAgZmluYWwgc29ydCBvZiB0aGUgayBtb3N0IGV4dHJlbWUgdmFsdWVzXFxuI1xcbiMgQ29tYmluaW5nIGFuZCBzaW1wbGlmeWluZyBmb3IgYSByb3VnaCBlc3RpbWF0ZSBnaXZlczpcXG4jXFxuIyAgICAgICAgY29tcGFyaXNvbnMgPSBuICsgayAqIChsb2coaywgMikgKiBsb2cobi9rKSArIGxvZyhrLCAyKSArIGxvZyhuL2spKVxcbiNcXG4jIENvbXB1dGluZyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGZvciBzdGVwIDM6XFxuIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgKiBGb3IgdGhlIGktdGggbmV3IHZhbHVlIGZyb20gdGhlIGl0ZXJhYmxlLCB0aGUgcHJvYmFiaWxpdHkgb2YgYmVpbmcgaW4gdGhlXFxuIyAgIGsgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyBrL2kuICBGb3IgZXhhbXBsZSwgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSAxMDFzdFxcbiMgICB2YWx1ZSBzZWVuIGJlaW5nIGluIHRoZSAxMDAgbW9zdCBleHRyZW1lIHZhbHVlcyBpcyAxMDAvMTAxLlxcbiMgKiBJZiB0aGUgdmFsdWUgaXMgYSBuZXcgZXh0cmVtZSB2YWx1ZSwgdGhlIGNvc3Qgb2YgaW5zZXJ0aW5nIGl0IGludG8gdGhlXFxuIyAgIGhlYXAgaXMgMSArIGxvZyhrLCAyKS5cXG4jICogVGhlIHByb2JhYmlsaXR5IHRpbWVzIHRoZSBjb3N0IGdpdmVzOlxcbiMgICAgICAgICAgICAoay9pKSAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBTdW1taW5nIGFjcm9zcyB0aGUgcmVtYWluaW5nIG4tayBlbGVtZW50cyBnaXZlczpcXG4jICAgICAgICAgICAgc3VtKChrL2kpICogKDEgKyBsb2coaywgMikpIGZvciBpIGluIHJhbmdlKGsrMSwgbisxKSlcXG4jICogVGhpcyByZWR1Y2VzIHRvOlxcbiMgICAgICAgICAgICAoSChuKSAtIEgoaykpICogayAqICgxICsgbG9nKGssIDIpKVxcbiMgKiBXaGVyZSBIKG4pIGlzIHRoZSBuLXRoIGhhcm1vbmljIG51bWJlciBlc3RpbWF0ZWQgYnk6XFxuIyAgICAgICAgICAgIGdhbW1hID0gMC41NzcyMTU2NjQ5XFxuIyAgICAgICAgICAgIEgobikgPSBsb2cobiwgZSkgKyBnYW1tYSArIDEgLyAoMiAqIG4pXFxuIyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFybW9uaWNfc2VyaWVzXyhtYXRoZW1hdGljcykjUmF0ZV9vZl9kaXZlcmdlbmNlXFxuIyAqIFN1YnN0aXR1dGluZyB0aGUgSChuKSBmb3JtdWxhOlxcbiMgICAgICAgICAgICBjb21wYXJpc29ucyA9IGsgKiAoMSArIGxvZyhrLCAyKSkgKiAobG9nKG4vaywgZSkgKyAoMS9uIC0gMS9rKSAvIDIpXFxuI1xcbiMgV29yc3QtY2FzZSBmb3Igc3RlcCAzOlxcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBpbnB1dCBkYXRhIGlzIHJldmVyc2VkIHNvcnRlZCBzbyB0aGF0IGV2ZXJ5IG5ldyBlbGVtZW50XFxuIyBtdXN0IGJlIGluc2VydGVkIGluIHRoZSBoZWFwOlxcbiNcXG4jICAgICAgICAgICAgIGNvbXBhcmlzb25zID0gMS42NiAqIGsgKyBsb2coaywgMikgKiAobiAtIGspXFxuI1xcbiMgQWx0ZXJuYXRpdmUgQWxnb3JpdGhtc1xcbiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbiMgT3RoZXIgYWxnb3JpdGhtcyB3ZXJlIG5vdCB1c2VkIGJlY2F1c2UgdGhleTpcXG4jIDEpIFRvb2sgbXVjaCBtb3JlIGF1eGlsaWFyeSBtZW1vcnksXFxuIyAyKSBNYWRlIG11bHRpcGxlIHBhc3NlcyBvdmVyIHRoZSBkYXRhLlxcbiMgMykgTWFkZSBtb3JlIGNvbXBhcmlzb25zIGluIGNvbW1vbiBjYXNlcyAoc21hbGwgaywgbGFyZ2Ugbiwgc2VtaS1yYW5kb20gaW5wdXQpLlxcbiMgU2VlIHRoZSBtb3JlIGRldGFpbGVkIGNvbXBhcmlzb24gb2YgYXBwcm9hY2ggYXQ6XFxuIyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81Nzc1NzMtY29tcGFyZS1hbGdvcml0aG1zLWZvci1oZWFwcXNtYWxsZXN0XFxuXFxuZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSwga2V5PU5vbmUpOlxcbiAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dXFxuICAgIFxcXCJcXFwiXFxcIlxcblxcbiAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKClcXG4gICAgaWYgbiA9PSAxOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKVxcbiAgICAgICAgcmVzdWx0ID0gbWluKGl0LCBkZWZhdWx0PXNlbnRpbmVsLCBrZXk9a2V5KVxcbiAgICAgICAgcmV0dXJuIFtdIGlmIHJlc3VsdCBpcyBzZW50aW5lbCBlbHNlIFtyZXN1bHRdXFxuXFxuICAgICMgV2hlbiBuPj1zaXplLCBpdCdzIGZhc3RlciB0byB1c2Ugc29ydGVkKClcXG4gICAgdHJ5OlxcbiAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSlcXG4gICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKTpcXG4gICAgICAgIHBhc3NcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIG4gPj0gc2l6ZTpcXG4gICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl1cXG5cXG4gICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uXFxuICAgIGlmIGtleSBpcyBOb25lOlxcbiAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICAgICAgIyBwdXQgdGhlIHJhbmdlKG4pIGZpcnN0IHNvIHRoYXQgemlwKCkgZG9lc24ndFxcbiAgICAgICAgIyBjb25zdW1lIG9uZSB0b28gbWFueSBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvclxcbiAgICAgICAgcmVzdWx0ID0gWyhlbGVtLCBpKSBmb3IgaSwgZWxlbSBpbiB6aXAocmFuZ2UobiksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgX2hlYXBpZnlfbWF4KHJlc3VsdClcXG4gICAgICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICAgICAgb3JkZXIgPSBuXFxuICAgICAgICBfaGVhcHJlcGxhY2UgPSBfaGVhcHJlcGxhY2VfbWF4XFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiBlbGVtIDwgdG9wOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciArPSAxXFxuICAgICAgICByZXN1bHQuc29ydCgpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKG4pLCBpdCldXFxuICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgIF9oZWFwaWZ5X21heChyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IG5cXG4gICAgX2hlYXByZXBsYWNlID0gX2hlYXByZXBsYWNlX21heFxcbiAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgIGsgPSBrZXkoZWxlbSlcXG4gICAgICAgIGlmIGsgPCB0b3A6XFxuICAgICAgICAgICAgX2hlYXByZXBsYWNlKHJlc3VsdCwgKGssIG9yZGVyLCBlbGVtKSlcXG4gICAgICAgICAgICB0b3AsIF9vcmRlciwgX2VsZW0gPSByZXN1bHRbMF1cXG4gICAgICAgICAgICBvcmRlciArPSAxXFxuICAgIHJlc3VsdC5zb3J0KClcXG4gICAgcmV0dXJuIFtlbGVtIGZvciAoaywgb3JkZXIsIGVsZW0pIGluIHJlc3VsdF1cXG5cXG5kZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKTpcXG4gICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cXG5cXG4gICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl1cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKVxcbiAgICBpZiBuID09IDE6XFxuICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpXFxuICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpXFxuICAgICAgICByZXN1bHQgPSBtYXgoaXQsIGRlZmF1bHQ9c2VudGluZWwsIGtleT1rZXkpXFxuICAgICAgICByZXR1cm4gW10gaWYgcmVzdWx0IGlzIHNlbnRpbmVsIGVsc2UgW3Jlc3VsdF1cXG5cXG4gICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKVxcbiAgICB0cnk6XFxuICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKVxcbiAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOlxcbiAgICAgICAgcGFzc1xcbiAgICBlbHNlOlxcbiAgICAgICAgaWYgbiA+PSBzaXplOlxcbiAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dXFxuXFxuICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvblxcbiAgICBpZiBrZXkgaXMgTm9uZTpcXG4gICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSlcXG4gICAgICAgIHJlc3VsdCA9IFsoZWxlbSwgaSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgICAgIGlmIG5vdCByZXN1bHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxcbiAgICAgICAgaGVhcGlmeShyZXN1bHQpXFxuICAgICAgICB0b3AgPSByZXN1bHRbMF1bMF1cXG4gICAgICAgIG9yZGVyID0gLW5cXG4gICAgICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgICAgICBmb3IgZWxlbSBpbiBpdDpcXG4gICAgICAgICAgICBpZiB0b3AgPCBlbGVtOlxcbiAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoZWxlbSwgb3JkZXIpKVxcbiAgICAgICAgICAgICAgICB0b3AsIF9vcmRlciA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgICAgICBvcmRlciAtPSAxXFxuICAgICAgICByZXN1bHQuc29ydChyZXZlcnNlPVRydWUpXFxuICAgICAgICByZXR1cm4gW2VsZW0gZm9yIChlbGVtLCBvcmRlcikgaW4gcmVzdWx0XVxcblxcbiAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2RcXG4gICAgaXQgPSBpdGVyKGl0ZXJhYmxlKVxcbiAgICByZXN1bHQgPSBbKGtleShlbGVtKSwgaSwgZWxlbSkgZm9yIGksIGVsZW0gaW4gemlwKHJhbmdlKDAsIC1uLCAtMSksIGl0KV1cXG4gICAgaWYgbm90IHJlc3VsdDpcXG4gICAgICAgIHJldHVybiByZXN1bHRcXG4gICAgaGVhcGlmeShyZXN1bHQpXFxuICAgIHRvcCA9IHJlc3VsdFswXVswXVxcbiAgICBvcmRlciA9IC1uXFxuICAgIF9oZWFwcmVwbGFjZSA9IGhlYXByZXBsYWNlXFxuICAgIGZvciBlbGVtIGluIGl0OlxcbiAgICAgICAgayA9IGtleShlbGVtKVxcbiAgICAgICAgaWYgdG9wIDwgazpcXG4gICAgICAgICAgICBfaGVhcHJlcGxhY2UocmVzdWx0LCAoaywgb3JkZXIsIGVsZW0pKVxcbiAgICAgICAgICAgIHRvcCwgX29yZGVyLCBfZWxlbSA9IHJlc3VsdFswXVxcbiAgICAgICAgICAgIG9yZGVyIC09IDFcXG4gICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKVxcbiAgICByZXR1cm4gW2VsZW0gZm9yIChrLCBvcmRlciwgZWxlbSkgaW4gcmVzdWx0XVxcblxcbiMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvblxcbnRyeTpcXG4gICAgZnJvbSBfaGVhcHEgaW1wb3J0ICpcXG5leGNlcHQgSW1wb3J0RXJyb3I6XFxuICAgIHBhc3NcXG50cnk6XFxuICAgIGZyb20gX2hlYXBxIGltcG9ydCBfaGVhcHJlcGxhY2VfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBpZnlfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxudHJ5OlxcbiAgICBmcm9tIF9oZWFwcSBpbXBvcnQgX2hlYXBwb3BfbWF4XFxuZXhjZXB0IEltcG9ydEVycm9yOlxcbiAgICBwYXNzXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG5cXG4gICAgaW1wb3J0IGRvY3Rlc3QgIyBwcmFnbWE6IG5vIGNvdmVyXFxuICAgIHByaW50KGRvY3Rlc3QudGVzdG1vZCgpKSAjIHByYWdtYTogbm8gY292ZXJcXG5cIixcInNyYy9saWIvaG1hYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaG1hYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2hvdHNob3QvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImhvdHNob3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sZW50aXR5ZGVmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHRtbGVudGl0eWRlZnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9odG1sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJodG1sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaHR0cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaHR0cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lkbGVsaWIvSWNvbnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIkljb25zIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaWRsZWxpYi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWRsZWxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2lob29rcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiaWhvb2tzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1hZ2UuanNcIjpcInZhciBJbWFnZU1vZCwkYnVpbHRpbm1vZHVsZTtJbWFnZU1vZHx8KEltYWdlTW9kPXt9LEltYWdlTW9kLmNhbnZhc0xpYj1bXSksJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZyxoPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcImltYWdlXFxcIil9O3JldHVybiBoLkltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxmdW5jdGlvbihhLGIpe3ZhciBjPU1hdGguZmxvb3I7ZT1mdW5jdGlvbihhKXthLndpZHRoPWEuaW1hZ2Uud2lkdGgsYS5oZWlnaHQ9YS5pbWFnZS5oZWlnaHQsYS5kZWxheT0wLGEudXBkYXRlQ291bnQ9MCxhLnVwZGF0ZUludGVydmFsPTEsYS5sYXN0eD0wLGEubGFzdHk9MCxhLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJjYW52YXNcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmN0eD1hLmNhbnZhcy5nZXRDb250ZXh0KFxcXCIyZFxcXCIpLGEuY3R4LmRyYXdJbWFnZShhLmltYWdlLDAsMCksYS5pbWFnZWRhdGE9YS5jdHguZ2V0SW1hZ2VEYXRhKDAsMCxhLndpZHRoLGEuaGVpZ2h0KX0sYi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiX19pbml0X19cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKTt0cnl7YS5pbWFnZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChTay5mZmkucmVtYXBUb0pzKGIpKSxlKGEpfWNhdGNoKGIpe2EuaW1hZ2U9bnVsbH1pZihudWxsPT1hLmltYWdlKXJldHVybiBjPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGMucmVzdW1lPWZ1bmN0aW9uKCl7aWYoYy5kYXRhLmVycm9yKXRocm93IG5ldyBTay5idWlsdGluLklPRXJyb3IoYy5kYXRhLmVycm9yLm1lc3NhZ2UpfSxjLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6bmV3IFByb21pc2UoZnVuY3Rpb24oYyxkKXt2YXIgZj1uZXcgSW1hZ2U7Zi5jcm9zc09yaWdpbj1cXFwiXFxcIixmLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKEVycm9yKFxcXCJGYWlsZWQgdG8gbG9hZCBVUkw6IFxcXCIrZi5zcmMpKX0sZi5vbmxvYWQ9ZnVuY3Rpb24oKXthLmltYWdlPXRoaXMsZShhKSxjKCl9LGYuc3JjPWcoYil9KX0sY30pLGc9ZnVuY3Rpb24oYSl7bGV0IGI9U2suZmZpLnJlbWFwVG9KcyhhKTt0cnl7bGV0IGE9U2sucmVhZChiKSxjPWIuc3Vic3RyaW5nKGIubGFzdEluZGV4T2YoXFxcIi5cXFwiKSsxKTtyZXR1cm5gZGF0YTppbWFnZS8ke2N9O2Jhc2U2NCwgJHthfWB9Y2F0Y2goYSl7Y29uc29sZS5sb2coYCR7Yn0gaXMgbm90IGluIHRoZSBkYXRhYmFzZSAke2F9YCl9dmFyIGMsZCxlPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBTay5pbWFnZVByb3h5P1NrLmltYWdlUHJveHk6ZnVuY3Rpb24oYSl7cmV0dXJuIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiYVxcXCIpLGMuaHJlZj1kLHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Yy5ob3N0P2E6U2suaW1hZ2VQcm94eStcXFwiL1xcXCIrYX07cmV0dXJuIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxkPWUoZCksZH0sZj1mdW5jdGlvbihhLGIsYyl7aWYoMD5ifHwwPmN8fGI+PWEud2lkdGh8fGM+PWEuaGVpZ2h0KXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlBpeGVsIGluZGV4IG91dCBvZiByYW5nZS5cXFwiKX07dmFyIGk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGRlbGF5XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksYS5kZWxheT1Tay5mZmkucmVtYXBUb0pzKGIpLGQ9U2suYnVpbHRpbi5hc251bSQoYyksYS51cGRhdGVJbnRlcnZhbD1kP2Q6MX07Yi5zZXRfZGVsYXk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldERlbGF5PW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXTtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksYj0wO2I8YS5pbWFnZS5oZWlnaHQqYS5pbWFnZS53aWR0aDtiKyspZFtiXT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5nZXRQaXhlbCxbYSxiJWEuaW1hZ2Uud2lkdGgsYyhiL2EuaW1hZ2Uud2lkdGgpXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfTtiLmdldF9waXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhqKSxiLmdldFBpeGVscz1uZXcgU2suYnVpbHRpbi5mdW5jKGopLGIuZ2V0RGF0YT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiLGQsZSxnLGgsaixrLGw9W107Zm9yKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldERhdGFcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxiPTA7YjxhLmltYWdlLmhlaWdodCphLmltYWdlLndpZHRoO2IrKylkPWIlYS5pbWFnZS53aWR0aCxlPWMoYi9hLmltYWdlLndpZHRoKSxmKGEsZCxlKSxrPTQqZSphLndpZHRoKzQqZCxnPWEuaW1hZ2VkYXRhLmRhdGFba10saD1hLmltYWdlZGF0YS5kYXRhW2srMV0saj1hLmltYWdlZGF0YS5kYXRhW2srMl0sbFtiXT1uZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uaW50XyhnKSxuZXcgU2suYnVpbHRpbi5pbnRfKGgpLG5ldyBTay5idWlsdGluLmludF8oaildKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX0pO3ZhciBrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGcsaTtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksaT00KmMqYS53aWR0aCs0KmIsZD1hLmltYWdlZGF0YS5kYXRhW2ldLGc9YS5pbWFnZWRhdGEuZGF0YVtpKzFdLGU9YS5pbWFnZWRhdGEuZGF0YVtpKzJdLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShoLlBpeGVsLFtkLGcsZSxiLGNdKX07Yi5nZXRfcGl4ZWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLmdldFBpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMoayksZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247cmV0dXJuIGQucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZC5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGQpe3ZhciBlPU1hdGgubWF4LGY9TWF0aC5hYnMsZz1NYXRoLm1pbjthLnVwZGF0ZUNvdW50KyssMD09YS51cGRhdGVDb3VudCVhLnVwZGF0ZUludGVydmFsPyhhLmxhc3R4K2EudXBkYXRlSW50ZXJ2YWw+PWEud2lkdGg/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LDAsYS5sYXN0eSxhLndpZHRoLDIpOmEubGFzdHkrYS51cGRhdGVJbnRlcnZhbD49YS5oZWlnaHQ/YS5sYXN0Q3R4LnB1dEltYWdlRGF0YShhLmltYWdlZGF0YSxhLmxhc3RVbHgsYS5sYXN0VWx5LGEubGFzdHgsMCwyLGEuaGVpZ2h0KTphLmxhc3RDdHgucHV0SW1hZ2VEYXRhKGEuaW1hZ2VkYXRhLGEubGFzdFVseCxhLmxhc3RVbHksZyhiLGEubGFzdHgpLGcoYyxhLmxhc3R5KSxlKGYoYi1hLmxhc3R4KSwxKSxlKGYoYy1hLmxhc3R5KSwxKSksYS5sYXN0eD1iLGEubGFzdHk9YywwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZCxhLmRlbGF5KTpkKCkpOmQoKX0pfSxkfTt2YXIgbD1mdW5jdGlvbihhLGIsYyxlKXt2YXIgZztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2V0cGl4ZWxcXFwiLGFyZ3VtZW50cy5sZW5ndGgsNCw0KSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGM9U2suYnVpbHRpbi5hc251bSQoYyksZihhLGIsYyksZz00KmMqYS53aWR0aCs0KmIsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRSZWQsW2VdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShlLmdldEdyZWVuLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRCbHVlLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGIsYyl9O2Iuc2V0X3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobCksYi5zZXRQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKGwpO3ZhciBtPWZ1bmN0aW9uKGEsYixlKXt2YXIgZyxoLGk7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHBpeGVsYXRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMywzKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLGc9YiVhLmltYWdlLndpZHRoLGg9YyhiL2EuaW1hZ2Uud2lkdGgpLGYoYSxnLGgpLGk9NCpoKmEud2lkdGgrNCpnLGEuaW1hZ2VkYXRhLmRhdGFbaV09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0UmVkLFtlXSkpLGEuaW1hZ2VkYXRhLmRhdGFbaSsxXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoZS5nZXRHcmVlbixbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krMl09U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGUuZ2V0Qmx1ZSxbZV0pKSxhLmltYWdlZGF0YS5kYXRhW2krM109MjU1LGQoYSxnLGgpfTtiLnNldF9waXhlbF9hdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pLGIuc2V0UGl4ZWxBdD1uZXcgU2suYnVpbHRpbi5mdW5jKG0pO3ZhciBuPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxnO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1cGRhdGVwaXhlbFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLGM9U2suYnVpbHRpbi5hc251bSQoU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIuZ2V0WCxbYl0pKSxlPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldFksW2JdKSksZihhLGMsZSksZz00KmUqYS53aWR0aCs0KmMsYS5pbWFnZWRhdGEuZGF0YVtnXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRSZWQsW2JdKSksYS5pbWFnZWRhdGEuZGF0YVtnKzFdPVNrLmJ1aWx0aW4uYXNudW0kKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLmdldEdyZWVuLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZysyXT1Tay5idWlsdGluLmFzbnVtJChTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRCbHVlLFtiXSkpLGEuaW1hZ2VkYXRhLmRhdGFbZyszXT0yNTUsZChhLGMsZSl9O2IudXBkYXRlX3BpeGVsPW5ldyBTay5idWlsdGluLmZ1bmMobiksYi51cGRhdGVQaXhlbD1uZXcgU2suYnVpbHRpbi5mdW5jKG4pO3ZhciBvPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXRoZWlnaHRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEuaGVpZ2h0KX07Yi5nZXRfaGVpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMobyksYi5nZXRIZWlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhvKTt2YXIgcD1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0d2lkdGhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxuZXcgU2suYnVpbHRpbi5pbnRfKGEud2lkdGgpfTtiLmdldF93aWR0aD1uZXcgU2suYnVpbHRpbi5mdW5jKHApLGIuZ2V0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhwKSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJoZWlnaHRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLndpZHRoKTp2b2lkIDB9KSxiLl9fc2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtpZihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImhlaWdodFxcXCI9PT1ifHxcXFwid2lkdGhcXFwiPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIkNhbm5vdCBjaGFuZ2UgaGVpZ2h0IG9yIHdpZHRoIHRoZXkgY2FuIG9ubHkgYmUgc2V0IG9uIGNyZWF0aW9uXFxcIik7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcIlVua25vd24gYXR0cmlidXRlOiBcXFwiK2IpfSksYi5kcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImRyYXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KSxlPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uLGUucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sZS5kYXRhPXt0eXBlOlxcXCJTay5wcm9taXNlXFxcIixwcm9taXNlOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3ZhciBmLGc7Yj1Tay5idWlsdGluLmFzbnVtJChiKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksZj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYi5nZXRXaW4sW2JdKSxnPWYuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSx2b2lkIDA9PT1jJiYoYz0wLGQ9MCksYS5sYXN0VWx4PWMsYS5sYXN0VWx5PWQsYS5sYXN0Q3R4PWcsZy5wdXRJbWFnZURhdGEoYS5pbWFnZWRhdGEsYyxkKSwwPGEuZGVsYXk/d2luZG93LnNldFRpbWVvdXQoZSxhLmRlbGF5KTp3aW5kb3cuc2V0VGltZW91dChlLDIwMCl9KX0sZX0pfSxcXFwiSW1hZ2VcXFwiLFtdKSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCwzLDMpLGEud2lkdGg9U2suYnVpbHRpbi5hc251bSQoYiksYS5oZWlnaHQ9U2suYnVpbHRpbi5hc251bSQoYyksYS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIiksYS5jdHg9YS5jYW52YXMuZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxhLmNhbnZhcy5oZWlnaHQ9YS5oZWlnaHQsYS5jYW52YXMud2lkdGg9YS53aWR0aCxhLmltYWdlZGF0YT1hLmN0eC5nZXRJbWFnZURhdGEoMCwwLGEud2lkdGgsYS5oZWlnaHQpfSl9LGguRW1wdHlJbWFnZT1Tay5taXNjZXZhbC5idWlsZENsYXNzKGgsYyxcXFwiRW1wdHlJbWFnZVxcXCIsW2guSW1hZ2VdKSxiPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkLGUsYixmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJfX2luaXRfX1xcXCIsYXJndW1lbnRzLmxlbmd0aCw0LDYpLGEucmVkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGEuZ3JlZW49U2suYnVpbHRpbi5hc251bSQoZCksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGEueD1Tay5idWlsdGluLmFzbnVtJChiKSxhLnk9U2suYnVpbHRpbi5hc251bSQoZil9KTt2YXIgYz1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0cmVkXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnJlZCl9O2IuZ2V0X3JlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGIuZ2V0UmVkPW5ldyBTay5idWlsdGluLmZ1bmMoYyk7dmFyIGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLmdyZWVuKX07Yi5nZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhkKSxiLmdldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZCk7dmFyIGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldGJsdWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLmFzc2skKGEuYmx1ZSl9O2IuZ2V0X2JsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxiLmdldEJsdWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKTt2YXIgZj1mdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ2V0eFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4uYXNzayQoYS54KX07Yi5nZXRfeD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpLGIuZ2V0WD1uZXcgU2suYnVpbHRpbi5mdW5jKGYpO3ZhciBnPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnZXR5XFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5hc3NrJChhLnkpfTtiLmdldF95PW5ldyBTay5idWlsdGluLmZ1bmMoZyksYi5nZXRZPW5ldyBTay5idWlsdGluLmZ1bmMoZyk7dmFyIGg9ZnVuY3Rpb24oYSxiKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRyZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnJlZD1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfcmVkPW5ldyBTay5idWlsdGluLmZ1bmMoaCksYi5zZXRSZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhoKTt2YXIgaT1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldGdyZWVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ncmVlbj1Tay5idWlsdGluLmFzbnVtJChiKX07Yi5zZXRfZ3JlZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhpKSxiLnNldEdyZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoaSk7dmFyIGo9ZnVuY3Rpb24oYSxjKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZXRibHVlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksYS5ibHVlPVNrLmJ1aWx0aW4uYXNudW0kKGMpfTtiLnNldF9ibHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5zZXRCbHVlPW5ldyBTay5idWlsdGluLmZ1bmMoaiksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwicmVkXFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoYS5yZWQpOlxcXCJncmVlblxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS5ncmVlbik6XFxcImJsdWVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEuYmx1ZSk6dm9pZCAwfSksYi5fX3NldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtiPVNrLmZmaS5yZW1hcFRvSnMoYiksKFxcXCJyZWRcXFwiPT09Ynx8XFxcImdyZWVuXFxcIj09PWJ8fFxcXCJibHVlXFxcIj09PWIpJiYoYVtiXT1Tay5idWlsdGluLmFzbnVtJChjKSl9KTt2YXIgaz1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHhcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLng9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKSxiLnNldFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhrKTt2YXIgbD1mdW5jdGlvbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNldHlcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxhLnk9U2suYnVpbHRpbi5hc251bSQoYil9O2Iuc2V0X3k9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLnNldFk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhsKSxiLl9fZ2V0aXRlbV9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5idWlsdGluLmFzbnVtJChiKSwwPT09Yik/YS5yZWQ6MT09Yj9hLmdyZWVuOjI9PWI/YS5ibHVlOnZvaWQgMH0pLGIuX19zdHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5mZmkucmVtYXBUb1B5KFxcXCJbXFxcIithLnJlZCtcXFwiLFxcXCIrYS5ncmVlbitcXFwiLFxcXCIrYS5ibHVlK1xcXCJdXFxcIil9KSxiLmdldENvbG9yVHVwbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLGIuc2V0UmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2EubWF4PVNrLmJ1aWx0aW4uYXNudW0kKGIpfSl9LGguUGl4ZWw9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhoLGIsXFxcIlBpeGVsXFxcIixbXSksYT1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmO1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMyksZD1JbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXSx2b2lkIDA9PT1kPyhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKSxhLnRoZVNjcmVlbj1lLGYuYXBwZW5kQ2hpbGQoZSksSW1hZ2VNb2QuY2FudmFzTGliW1NrLmNhbnZhc109ZSxJbWFnZU1vZC5jYW52YXNMaWJbU2suY2FudmFzXT1hLnRoZVNjcmVlbik6KGEudGhlU2NyZWVuPWQsYS50aGVTY3JlZW4uaGVpZ2h0PWEudGhlU2NyZWVuLmhlaWdodCksdm9pZCAwPT09Yj8oU2suYXZhaWxhYmxlSGVpZ2h0JiYoYS50aGVTY3JlZW4uaGVpZ2h0PVNrLmF2YWlsYWJsZUhlaWdodCksU2suYXZhaWxhYmxlV2lkdGgmJihhLnRoZVNjcmVlbi53aWR0aD1Tay5hdmFpbGFibGVXaWR0aCkpOihhLnRoZVNjcmVlbi5oZWlnaHQ9Yy52LGEudGhlU2NyZWVuLndpZHRoPWIudiksYS50aGVTY3JlZW4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwifSksYi5nZXRXaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYS50aGVTY3JlZW59KSxiLmV4aXRvbmNsaWNrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVTY3JlZW4uaWQ7YS50aGVTY3JlZW4ub25jbGljaz1mdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpLm9uY2xpY2s9bnVsbCxkZWxldGUgSW1hZ2VNb2QuY2FudmFzTGliW2JdfX0pfSxoLkltYWdlV2luPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaCxhLFxcXCJJbWFnZVdpblxcXCIsW10pLGh9O1wiLFwic3JjL2xpYi9pbWFwbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWFwbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW1naGRyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbWdoZHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9pbXB1dGlsLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJpbXB1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvaXRlcnRvb2xzLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjb21iaW5hdGlvbnNOZXcoYSxiLGMpe2xldCBkLGU7W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoYS50cCRuYW1lLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hKXJldHVybiBuZXcgYS5jb25zdHJ1Y3RvcihmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb25zdHJ1Y3Rvci5jYWxsKGIsZixlKSxifX12YXIgYT17fTtyZXR1cm4gYS5hY2N1bXVsYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmFjY3VtdWxhdGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBhY2N1bXVsYXRlKGEsYixjKXt0aGlzLml0ZXI9YSx0aGlzLmZ1bmM9Yix0aGlzLnRvdGFsPWMsdGhpcy50cCRpdGVybmV4dD0oKT0+KHRoaXMudG90YWw9U2suYnVpbHRpbi5jaGVja05vbmUodGhpcy50b3RhbCk/dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk6dGhpcy50b3RhbCx0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0LHRoaXMudG90YWwpfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpcmV0dXJuIHRoaXMudG90YWw9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMuZnVuYyxbdGhpcy50b3RhbCxhXSksdGhpcy50b3RhbH0sc2xvdHM6e3RwJGRvYzpcXFwiYWNjdW11bGF0ZShpdGVyYWJsZVssIGZ1bmMsIGluaXRpYWxdKSAtLT4gYWNjdW11bGF0ZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHNlcmllcyBvZiBhY2N1bXVsYXRlZCBzdW1zIChvciBvdGhlciBiaW5hcnkgZnVuY3Rpb24gcmVzdWx0cykuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImFjY3VtdWxhdGVcXFwiLGIsMCwyKTtsZXRbZCxlLGZdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJhY2N1bXVsYXRlXFxcIixbXFxcIml0ZXJhYmxlXFxcIixcXFwiZnVuY1xcXCIsXFxcImluaXRpYWxcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZihkPVNrLmFic3RyLml0ZXIoZCksZT1Tay5idWlsdGluLmNoZWNrTm9uZShlKT9uZXcgU2suYnVpbHRpbi5mdW5jKChjLGEpPT5Tay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpKTplLHRoaXM9PT1hLmFjY3VtdWxhdGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5hY2N1bXVsYXRlKGQsZSxmKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuYWNjdW11bGF0ZS5jYWxsKGIsZCxlLGYpLGJ9fX19KSxhLmNoYWluPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNoYWluXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY2hhaW4oYSl7dGhpcy5pdGVyYWJsZXM9YSx0aGlzLmN1cnJlbnRfaXQ9bnVsbCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT4odGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLmN1cnJlbnRfaXQ9dGhpcy5pdGVyYWJsZXMudHAkaXRlcm5leHQoKSx2b2lkIDA9PT10aGlzLmN1cnJlbnRfaXQpP3ZvaWQodGhpcy50cCRpdGVybmV4dD0oKT0+dm9pZCAwKToodGhpcy5jdXJyZW50X2l0PVNrLmFic3RyLml0ZXIodGhpcy5jdXJyZW50X2l0KSx0aGlzLnRwJGl0ZXJuZXh0KCkpfSxpdGVybmV4dCgpe2ZvcihsZXQgYTt2b2lkIDA9PT1hOylpZihhPXRoaXMuY3VycmVudF9pdC50cCRpdGVybmV4dCgpLHZvaWQgMD09PWEpe2lmKHRoaXMuY3VycmVudF9pdD10aGlzLml0ZXJhYmxlcy50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycmVudF9pdClyZXR1cm4gdm9pZCh0aGlzLnRwJGl0ZXJuZXh0PSgpPT52b2lkIDApO3RoaXMuY3VycmVudF9pdD1Tay5hYnN0ci5pdGVyKHRoaXMuY3VycmVudF9pdCl9ZWxzZSByZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiY2hhaW4oKml0ZXJhYmxlcykgLS0+IGNoYWluIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSBjaGFpbiBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgZWxlbWVudHMgZnJvbSB0aGVcXFxcbmZpcnN0IGl0ZXJhYmxlIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgdGhlbiBlbGVtZW50cyBmcm9tIHRoZSBuZXh0XFxcXG5pdGVyYWJsZSwgdW50aWwgYWxsIG9mIHRoZSBpdGVyYWJsZXMgYXJlIGV4aGF1c3RlZC5cXFwiLHRwJG5ldyhiLGMpe2lmKFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImNoYWluXFxcIixjKSxiPW5ldyBTay5idWlsdGluLnR1cGxlKGIuc2xpY2UoMCkpLnRwJGl0ZXIoKSx0aGlzPT09YS5jaGFpbi5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmNoYWluKGIpO2Vsc2V7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jaGFpbi5jYWxsKGMsYiksY319fSxjbGFzc21ldGhvZHM6e2Zyb21faXRlcmFibGU6eyRtZXRoKGIpe2NvbnN0IGM9U2suYWJzdHIuaXRlcihiKTtyZXR1cm4gbmV3IGEuY2hhaW4oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlxcXCJjaGFpbi5mcm9tX2l0ZXJhYmxlKGl0ZXJhYmxlKSAtLT4gY2hhaW4gb2JqZWN0XFxcXG5cXFxcbkFsdGVybmF0ZSBjaGFpbigpIGNvbnN0cnVjdG9yIHRha2luZyBhIHNpbmdsZSBpdGVyYWJsZSBhcmd1bWVudFxcXFxudGhhdCBldmFsdWF0ZXMgbGF6aWx5LlxcXCIsJHRleHRzaWc6bnVsbH19fSksYS5jb21iaW5hdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tYmluYXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWIsdGhpcy5pbmRpY2VzPUFycmF5KGIpLmZpbGwoKS5tYXAoKGEsYik9PmIpLHRoaXMubj1hLmxlbmd0aCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7bGV0IGEsYj0hMTtmb3IoYT10aGlzLnItMTswPD1hO2EtLSlpZih0aGlzLmluZGljZXNbYV0hPWErdGhpcy5uLXRoaXMucil7Yj0hMDticmVha31pZighYilyZXR1cm4gdm9pZCh0aGlzLnI9MCk7dGhpcy5pbmRpY2VzW2FdKys7Zm9yKGxldCBiPWErMTtiPHRoaXMucjtiKyspdGhpcy5pbmRpY2VzW2JdPXRoaXMuaW5kaWNlc1tiLTFdKzE7Y29uc3QgYz10aGlzLmluZGljZXMubWFwKGE9PnRoaXMucG9vbFthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJjb21iaW5hdGlvbnMoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnMgb2JqZWN0XFxcXG5cXFxcblJldHVybiBzdWNjZXNzaXZlIHItbGVuZ3RoIGNvbWJpbmF0aW9ucyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmFibGUuXFxcXG5cXFxcbmNvbWJpbmF0aW9ucyhyYW5nZSg0KSwgMykgLS0+ICgwLDEsMiksICgwLDEsMyksICgwLDIsMyksICgxLDIsMylcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zLnByb3RvdHlwZSxiLGMpfX19KSxhLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoYSxiKXt0aGlzLnBvb2w9YSx0aGlzLnI9Yix0aGlzLmluZGljZXM9QXJyYXkoYikuZmlsbCgwKSx0aGlzLm49YS5sZW5ndGgsdGhpcy50cCRpdGVybmV4dD0oKT0+e2lmKCF0aGlzLnJ8fHRoaXMubil7dGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dDtjb25zdCBhPXRoaXMuaW5kaWNlcy5tYXAoYT0+dGhpcy5wb29sW2FdKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9fX0saXRlcm5leHQoKXtsZXQgYSxiPSExO2ZvcihhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuaW5kaWNlc1thXSE9dGhpcy5uLTEpe2I9ITA7YnJlYWt9aWYoIWIpcmV0dXJuIHZvaWQodGhpcy5yPTApO2NvbnN0IGM9dGhpcy5pbmRpY2VzW2FdKzE7Zm9yKGxldCBiPWE7Yjx0aGlzLnI7YisrKXRoaXMuaW5kaWNlc1tiXT1jO2NvbnN0IGQ9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sc2xvdHM6e3RwJGRvYzpcXFwiY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoaXRlcmFibGUsIHIpIC0tPiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHN1Y2Nlc3NpdmUgci1sZW5ndGggY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYWJsZVxcXFxuYWxsb3dpbmcgaW5kaXZpZHVhbCBlbGVtZW50cyB0byBoYXZlIHN1Y2Nlc3NpdmUgcmVwZWF0cy5cXFxcbmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSAtLT4gQUEgQUIgQUMgQkIgQkMgQ0NcXFwiLHRwJG5ldyhiLGMpe3JldHVybiBjb21iaW5hdGlvbnNOZXcuY2FsbCh0aGlzLGEuY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQucHJvdG90eXBlLGIsYyl9fX0pLGEuY29tcHJlc3M9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY29tcHJlc3NcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjb21wcmVzcyhhLGIpe3RoaXMuZGF0YT1hLHRoaXMuc2VsZWN0b3JzPWJ9LGl0ZXJuZXh0KCl7bGV0IGE9dGhpcy5kYXRhLnRwJGl0ZXJuZXh0KCksYj10aGlzLnNlbGVjdG9ycy50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwIT09Yjspe2lmKFNrLm1pc2NldmFsLmlzVHJ1ZShiKSlyZXR1cm4gYTthPXRoaXMuZGF0YS50cCRpdGVybmV4dCgpLGI9dGhpcy5zZWxlY3RvcnMudHAkaXRlcm5leHQoKX19LHNsb3RzOnt0cCRkb2M6XFxcImNvbXByZXNzKGRhdGEsIHNlbGVjdG9ycykgLS0+IGl0ZXJhdG9yIG92ZXIgc2VsZWN0ZWQgZGF0YVxcXFxuXFxcXG5SZXR1cm4gZGF0YSBlbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRydWUgc2VsZWN0b3IgZWxlbWVudHMuXFxcXG5Gb3JtcyBhIHNob3J0ZXIgaXRlcmF0b3IgZnJvbSBzZWxlY3RlZCBkYXRhIGVsZW1lbnRzIHVzaW5nIHRoZVxcXFxuc2VsZWN0b3JzIHRvIGNob29zZSB0aGUgZGF0YSBlbGVtZW50cy5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvbXByZXNzXFxcIixbXFxcImRhdGFcXFwiLFxcXCJzZWxlY3RvcnNcXFwiXSxiLGMsW10pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmFic3RyLml0ZXIoZSksdGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb21wcmVzcyhkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb21wcmVzcy5jYWxsKGIsZCxlKSxifX19fSksYS5jb3VudD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5jb3VudFxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGNvdW50KGEsYil7dGhpcy5zdGFydD1hLHRoaXMuc3RlcD1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5zdGFydDtyZXR1cm4gdGhpcy5zdGFydD1Tay5hYnN0ci5udW1iZXJCaW5PcCh0aGlzLnN0YXJ0LHRoaXMuc3RlcCxcXFwiQWRkXFxcIiksYX0sc2xvdHM6e3RwJGRvYzpcXFwiY291bnQoc3RhcnQ9MCwgc3RlcD0xKSAtLT4gY291bnQgb2JqZWN0XFxcXG5cXFxcblJldHVybiBhIGNvdW50IG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBjb25zZWN1dGl2ZSB2YWx1ZXMuXFxcXG5FcXVpdmFsZW50IHRvOlxcXFxuXFxcXG4gICAgZGVmIGNvdW50KGZpcnN0dmFsPTAsIHN0ZXA9MSk6XFxcXG4gICAgICAgIHggPSBmaXJzdHZhbFxcXFxuICAgICAgICB3aGlsZSAxOlxcXFxuICAgICAgICAgICAgeWllbGQgeFxcXFxuICAgICAgICAgICAgeCArPSBzdGVwXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2NvbnN0W2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImNvdW50XFxcIixbXFxcInN0YXJ0XFxcIixcXFwic3RlcFxcXCJdLGIsYyxbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZCkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZSkmJiFTay5idWlsdGluLmNoZWNrQ29tcGxleChlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImEgbnVtYmVyIGlzIHJlcXVpcmVkXFxcIik7aWYodGhpcz09PWEuY291bnQucHJvdG90eXBlKXJldHVybiBuZXcgYS5jb3VudChkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5jb3VudC5jYWxsKGIsZCxlKSxifX0sJHIoKXtjb25zdCBhPVNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5zdGFydCk7bGV0IGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBiPVxcXCIxXFxcIj09PWI/XFxcIlxcXCI6XFxcIiwgXFxcIitiLG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcXFwiKFxcXCIrYStiK1xcXCIpXFxcIil9fX0pLGEuY3ljbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuY3ljbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBjeWNsZShhKXt0aGlzLml0ZXI9YSx0aGlzLnNhdmVkPVtdLHRoaXMuY29uc3VtZWQ9ITEsdGhpcy5pPTAsdGhpcy5sZW5ndGh9LGl0ZXJuZXh0KCl7bGV0IGE7aWYoIXRoaXMuY29uc3VtZWQpe2lmKGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09YSlyZXR1cm4gdGhpcy5zYXZlZC5wdXNoKGEpLGE7aWYodGhpcy5jb25zdW1lZD0hMCx0aGlzLmxlbmd0aD10aGlzLnNhdmVkLmxlbmd0aCwhdGhpcy5sZW5ndGgpcmV0dXJufXJldHVybiBhPXRoaXMuc2F2ZWRbdGhpcy5pXSx0aGlzLmk9KHRoaXMuaSsxKSV0aGlzLmxlbmd0aCxhfSxzbG90czp7dHAkZG9jOlxcXCJjeWNsZShpdGVyYWJsZSkgLS0+IGN5Y2xlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUgdW50aWwgaXQgaXMgZXhoYXVzdGVkLlxcXFxuVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS5cXFwiLHRwJG5ldyhiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKFxcXCJjeWNsZVxcXCIsYixjKTtjb25zdCBkPVNrLmFic3RyLml0ZXIoYlswXSk7aWYodGhpcz09PWEuY3ljbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS5jeWNsZShkKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuY3ljbGUuY2FsbChiLGQpLGJ9fX19KSxhLmRyb3B3aGlsZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5kcm9wd2hpbGVcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBkcm9wd2hpbGUoYSxiKXt0aGlzLnByZWRpY2F0ZT1hLHRoaXMuaXRlcj1iLHRoaXMucGFzc2VkfSxpdGVybmV4dCgpe2xldCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2Zvcig7dm9pZCAwPT09dGhpcy5wYXNzZWQmJnZvaWQgMCE9PWE7KXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pO2lmKCFTay5taXNjZXZhbC5pc1RydWUoYikpcmV0dXJuIHRoaXMucGFzc2VkPSEwLGE7YT10aGlzLml0ZXIudHAkaXRlcm5leHQoKX1yZXR1cm4gYX0sc2xvdHM6e3RwJGRvYzpcXFwiZHJvcHdoaWxlKHByZWRpY2F0ZSwgaXRlcmFibGUpIC0tPiBkcm9wd2hpbGUgb2JqZWN0XFxcXG5cXFxcbkRyb3AgaXRlbXMgZnJvbSB0aGUgaXRlcmFibGUgd2hpbGUgcHJlZGljYXRlKGl0ZW0pIGlzIHRydWUuXFxcXG5BZnRlcndhcmRzLCByZXR1cm4gZXZlcnkgZWxlbWVudCB1bnRpbCB0aGUgaXRlcmFibGUgaXMgZXhoYXVzdGVkLlxcXCIsdHAkbmV3KGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiZHJvcHdoaWxlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImRyb3B3aGlsZVxcXCIsYiwyLDIpO2NvbnN0IGQ9YlswXSxlPVNrLmFic3RyLml0ZXIoYlsxXSk7aWYodGhpcz09PWEuZHJvcHdoaWxlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZHJvcHdoaWxlKGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLmRyb3B3aGlsZS5jYWxsKGIsZCxlKSxifX19fSksYS5maWx0ZXJmYWxzZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5maWx0ZXJmYWxzZVxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGZpbHRlcmZhbHNlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtsZXQgYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKTtpZih2b2lkIDAhPT1hKXtmb3IobGV0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7U2subWlzY2V2YWwuaXNUcnVlKGIpOyl7aWYoYT10aGlzLml0ZXIudHAkaXRlcm5leHQoKSx2b2lkIDA9PT1hKXJldHVybjtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnByZWRpY2F0ZSxbYV0pfXJldHVybiBhfX0sc2xvdHM6e3RwJGRvYzpcXFwiZmlsdGVyZmFsc2UoZnVuY3Rpb24gb3IgTm9uZSwgc2VxdWVuY2UpIC0tPiBmaWx0ZXJmYWxzZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIHRob3NlIGl0ZW1zIG9mIHNlcXVlbmNlIGZvciB3aGljaCBmdW5jdGlvbihpdGVtKSBpcyBmYWxzZS5cXFxcbklmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgZmFsc2UuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYyksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJmaWx0ZXJmYWxzZVxcXCIsYiwyLDIpO2NvbnN0IGQ9U2suYnVpbHRpbi5jaGVja05vbmUoYlswXSk/U2suYnVpbHRpbi5ib29sOmJbMF0sZT1Tay5hYnN0ci5pdGVyKGJbMV0pO2lmKHRoaXM9PT1hLmZpbHRlcmZhbHNlLnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZmlsdGVyZmFsc2UoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuZmlsdGVyZmFsc2UuY2FsbChiLGQsZSksYn19fX0pLGEuX2dyb3VwZXI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMuX2dyb3VwZXJcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBfZ3JvdXBlcihhKXt0aGlzLmdyb3VwYnk9YSx0aGlzLnRndGtleT1hLnRndGtleSx0aGlzLmlkPWEuaWR9LGl0ZXJuZXh0KCl7Y29uc3QgYT1Tay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5ncm91cGJ5LmN1cnJrZXksdGhpcy50Z3RrZXksXFxcIkVxXFxcIik7aWYodGhpcy5ncm91cGJ5LmlkPT09dGhpcy5pZCYmYSl7bGV0IGE9dGhpcy5ncm91cGJ5LmN1cnJ2YWw7cmV0dXJuIHRoaXMuZ3JvdXBieS5jdXJydmFsPXRoaXMuZ3JvdXBieS5pdGVyLnRwJGl0ZXJuZXh0KCksdm9pZCAwIT09dGhpcy5ncm91cGJ5LmN1cnJ2YWwmJih0aGlzLmdyb3VwYnkuY3VycmtleT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5ncm91cGJ5LmtleWYsW3RoaXMuZ3JvdXBieS5jdXJydmFsXSkpLGF9fX0pLGEuZ3JvdXBieT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5ncm91cGJ5XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gZ3JvdXBieShhLGIpe3RoaXMuaXRlcj1hLHRoaXMua2V5Zj1iLHRoaXMuY3VycnZhbCx0aGlzLmN1cnJrZXk9dGhpcy50Z3RrZXk9bmV3IFNrLmJ1aWx0aW4ub2JqZWN0LHRoaXMuaWR9LGl0ZXJuZXh0KCl7dGhpcy5pZD17fTtmb3IobGV0IGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKTthOyl7aWYodGhpcy5jdXJydmFsPXRoaXMuaXRlci50cCRpdGVybmV4dCgpLHZvaWQgMD09PXRoaXMuY3VycnZhbClyZXR1cm47dGhpcy5jdXJya2V5PVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmtleWYsW3RoaXMuY3VycnZhbF0pLGE9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuY3VycmtleSx0aGlzLnRndGtleSxcXFwiRXFcXFwiKX10aGlzLnRndGtleT10aGlzLmN1cnJrZXk7Y29uc3QgYj1uZXcgYS5fZ3JvdXBlcih0aGlzKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMuY3VycmtleSxiXSl9LHNsb3RzOnt0cCRkb2M6XFxcImdyb3VwYnkoaXRlcmFibGUsIGtleT1Ob25lKSAtPiBtYWtlIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBjb25zZWN1dGl2ZVxcXFxua2V5cyBhbmQgZ3JvdXBzIGZyb20gdGhlIGl0ZXJhYmxlLiAgSWYgdGhlIGtleSBmdW5jdGlvbiBpcyBub3Qgc3BlY2lmaWVkIG9yXFxcXG5pcyBOb25lLCB0aGUgZWxlbWVudCBpdHNlbGYgaXMgdXNlZCBmb3IgZ3JvdXBpbmcuXFxcXG5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImdyb3VwYnlcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJrZXlcXFwiXSxiLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pLGQ9U2suYWJzdHIuaXRlcihkKSxlPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGUpP25ldyBTay5idWlsdGluLmZ1bmMoYT0+YSk6ZSx0aGlzPT09YS5ncm91cGJ5LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEuZ3JvdXBieShkLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5ncm91cGJ5LmNhbGwoYixkLGUpLGJ9fX19KSxhLmlzbGljZT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5pc2xpY2VcXFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiBpc2xpY2UoYSxiLGMsZCl7dGhpcy5pdGVyPWEsdGhpcy5wcmV2aXQ9Yix0aGlzLnN0b3A9Yyx0aGlzLnN0ZXA9ZCx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYodGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCx0aGlzLnByZXZpdD49dGhpcy5zdG9wKXtmb3IobGV0IGE9MDthPHRoaXMuc3RvcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJufWZvcihsZXQgYT0wO2E8dGhpcy5wcmV2aXQ7YSsrKXRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybiB0aGlzLml0ZXIudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0KCl7aWYodGhpcy5wcmV2aXQrdGhpcy5zdGVwPj10aGlzLnN0b3Ape2ZvcihsZXQgYT10aGlzLnByZXZpdCsxO2E8dGhpcy5zdG9wO2ErKyl0aGlzLnByZXZpdCs9dGhpcy5zdGVwLHRoaXMuaXRlci50cCRpdGVybmV4dCgpO3JldHVybn1mb3IobGV0IGE9dGhpcy5wcmV2aXQrMTthPHRoaXMucHJldml0K3RoaXMuc3RlcDthKyspdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7cmV0dXJuIHRoaXMucHJldml0Kz10aGlzLnN0ZXAsdGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCl9LHNsb3RzOnt0cCRkb2M6XFxcImlzbGljZShpdGVyYWJsZSwgc3RvcCkgLS0+IGlzbGljZSBvYmplY3RcXFxcbmlzbGljZShpdGVyYWJsZSwgc3RhcnQsIHN0b3BbLCBzdGVwXSkgLS0+IGlzbGljZSBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGFuIGl0ZXJhdG9yIHdob3NlIG5leHQoKSBtZXRob2QgcmV0dXJucyBzZWxlY3RlZCB2YWx1ZXMgZnJvbSBhblxcXFxuaXRlcmFibGUuICBJZiBzdGFydCBpcyBzcGVjaWZpZWQsIHdpbGwgc2tpcCBhbGwgcHJlY2VkaW5nIGVsZW1lbnRzO1xcXFxub3RoZXJ3aXNlLCBzdGFydCBkZWZhdWx0cyB0byB6ZXJvLiAgU3RlcCBkZWZhdWx0cyB0byBvbmUuICBJZlxcXFxuc3BlY2lmaWVkIGFzIGFub3RoZXIgdmFsdWUsIHN0ZXAgZGV0ZXJtaW5lcyBob3cgbWFueSB2YWx1ZXMgYXJlIFxcXFxuc2tpcHBlZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMuICBXb3JrcyBsaWtlIGEgc2xpY2UoKSBvbiBhIGxpc3RcXFxcbmJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLlxcXCIsdHAkbmV3KGIsYyl7dmFyIGQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcXFwiaXNsaWNlXFxcIixjKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzbGljZVxcXCIsYiwyLDQpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihiWzBdKTtsZXQgZj1iWzFdLGc9YlsyXSxoPWJbM107aWYodm9pZCAwPT09Zz8oZz1mLGY9U2suYnVpbHRpbi5ub25lLm5vbmUkLGg9U2suYnVpbHRpbi5ub25lLm5vbmUkKTp2b2lkIDA9PT1oJiYoaD1Tay5idWlsdGluLm5vbmUubm9uZSQpLCEoU2suYnVpbHRpbi5jaGVja05vbmUoZyl8fFNrLm1pc2NldmFsLmlzSW5kZXgoZykpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7ZWxzZSBpZihnPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGcpP2Q6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGcpLDA+Z3x8Zz5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIlN0b3AgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuXFxcIik7aWYoIShTay5idWlsdGluLmNoZWNrTm9uZShmKXx8U2subWlzY2V2YWwuaXNJbmRleChmKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtlbHNlIGlmKGY9U2suYnVpbHRpbi5jaGVja05vbmUoZik/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZiksMD5mfHxmPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS5cXFwiKTtpZighKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpfHxTay5taXNjZXZhbC5pc0luZGV4KGgpKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lXFxcIik7ZWxzZSBpZihoPVNrLmJ1aWx0aW4uY2hlY2tOb25lKGgpPzE6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGgpLDA+PWh8fGg+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTdGVwIGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciBOb25lLlxcXCIpO2lmKHRoaXM9PT1hLmlzbGljZS5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLmlzbGljZShlLGYsZyxoKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuaXNsaWNlLmNhbGwoYixlLGYsZyxoKSxifX19fSksYS5wZXJtdXRhdGlvbnM9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucGVybXV0YXRpb25zXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcGVybXV0YXRpb25zKGEsYil7dGhpcy5wb29sPWEsdGhpcy5yPWI7Y29uc3QgYz1hLmxlbmd0aDt0aGlzLmluZGljZXM9QXJyYXkoYykuZmlsbCgpLm1hcCgoYSxiKT0+YiksdGhpcy5jeWNsZXM9QXJyYXkoYikuZmlsbCgpLm1hcCgoYSxiKT0+Yy1iKSx0aGlzLm49Yyx0aGlzLnRwJGl0ZXJuZXh0PSgpPT57aWYoISh0aGlzLnI+dGhpcy5uKSlyZXR1cm4gdGhpcy50cCRpdGVybmV4dD10aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS50cCRpdGVybmV4dCxuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnBvb2wuc2xpY2UoMCx0aGlzLnIpKX19LGl0ZXJuZXh0KCl7Zm9yKGxldCBhPXRoaXMuci0xOzA8PWE7YS0tKWlmKHRoaXMuY3ljbGVzW2FdLS0sMD09dGhpcy5jeWNsZXNbYV0pdGhpcy5pbmRpY2VzLnB1c2godGhpcy5pbmRpY2VzLnNwbGljZShhLDEpWzBdKSx0aGlzLmN5Y2xlc1thXT10aGlzLm4tYTtlbHNle2o9dGhpcy5jeWNsZXNbYV0sW3RoaXMuaW5kaWNlc1thXSx0aGlzLmluZGljZXNbdGhpcy5uLWpdXT1bdGhpcy5pbmRpY2VzW3RoaXMubi1qXSx0aGlzLmluZGljZXNbYV1dO2NvbnN0IGI9dGhpcy5pbmRpY2VzLm1hcChhPT50aGlzLnBvb2xbYV0pLnNsaWNlKDAsdGhpcy5yKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYil9dGhpcy5yPTB9LHNsb3RzOnt0cCRkb2M6XFxcInBlcm11dGF0aW9ucyhpdGVyYWJsZVssIHJdKSAtLT4gcGVybXV0YXRpb25zIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSByLWxlbmd0aCBwZXJtdXRhdGlvbnMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhYmxlLlxcXFxuXFxcXG5wZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSwgKDAsMiksICgxLDApLCAoMSwyKSwgKDIsMCksICgyLDEpXFxcIix0cCRuZXcoYixjKXtsZXQgZCxlO1tkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJwZXJtdXRhdGlvbnNcXFwiLFtcXFwiaXRlcmFibGVcXFwiLFxcXCJyXFxcIl0sYixjLFtTay5idWlsdGluLm5vbmUubm9uZSRdKTtjb25zdCBmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGQpO2lmKGU9U2suYnVpbHRpbi5jaGVja05vbmUoZSk/Zi5sZW5ndGg6U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGUsU2suYnVpbHRpbi5PdmVyRmxvd0Vycm9yKSwwPmUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiciBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxcXCIpO2lmKHRoaXM9PT1hLnBlcm11dGF0aW9ucy5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnBlcm11dGF0aW9ucyhmLGUpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wZXJtdXRhdGlvbnMuY2FsbChiLGYsZSksYn19fX0pLGEucHJvZHVjdD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5wcm9kdWN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcHJvZHVjdChhKXt0aGlzLnBvb2xzPWEsdGhpcy5uPWEubGVuZ3RoLHRoaXMuaW5kaWNlcz1BcnJheShhLmxlbmd0aCkuZmlsbCgwKSx0aGlzLnBvb2xfc2l6ZXM9YS5tYXAoYT0+YS5sZW5ndGgpLHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt0aGlzLnRwJGl0ZXJuZXh0PXRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnRwJGl0ZXJuZXh0O2NvbnN0IGE9dGhpcy5pbmRpY2VzLm1hcCgoYSxiKT0+dGhpcy5wb29sc1tiXVt0aGlzLmluZGljZXNbYl1dKTtyZXR1cm4gYS5zb21lKGE9PnZvaWQgMD09PWEpP3ZvaWQodGhpcy5uPTApOm5ldyBTay5idWlsdGluLnR1cGxlKGEpfX0saXRlcm5leHQoKXtmb3IobGV0IGE9dGhpcy5uLTE7MDw9YSYmYTx0aGlzLm47KXRoaXMuaW5kaWNlc1thXSsrLHRoaXMuaW5kaWNlc1thXT49dGhpcy5wb29sX3NpemVzW2FdPyh0aGlzLmluZGljZXNbYV09LTEsYS0tKTphKys7aWYoIXRoaXMubnx8dGhpcy5pbmRpY2VzLmV2ZXJ5KGE9Pi0xPT09YSkpcmV0dXJuIHZvaWQodGhpcy5uPTApO2Vsc2V7Y29uc3QgYT10aGlzLmluZGljZXMubWFwKChhLGIpPT50aGlzLnBvb2xzW2JdW3RoaXMuaW5kaWNlc1tiXV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShhKX19LHNsb3RzOnt0cCRkb2M6XFxcInByb2R1Y3QoKml0ZXJhYmxlcywgcmVwZWF0PTEpIC0tPiBwcm9kdWN0IG9iamVjdFxcXFxuXFxcXG5DYXJ0ZXNpYW4gcHJvZHVjdCBvZiBpbnB1dCBpdGVyYWJsZXMuICBFcXVpdmFsZW50IHRvIG5lc3RlZCBmb3ItbG9vcHMuXFxcXG5cXFxcbkZvciBleGFtcGxlLCBwcm9kdWN0KEEsIEIpIHJldHVybnMgdGhlIHNhbWUgYXM6ICAoKHgseSkgZm9yIHggaW4gQSBmb3IgeSBpbiBCKS5cXFxcblRoZSBsZWZ0bW9zdCBpdGVyYXRvcnMgYXJlIGluIHRoZSBvdXRlcm1vc3QgZm9yLWxvb3AsIHNvIHRoZSBvdXRwdXQgdHVwbGVzXFxcXG5jeWNsZSBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGFuIG9kb21ldGVyICh3aXRoIHRoZSByaWdodG1vc3QgZWxlbWVudCBjaGFuZ2luZ1xcXFxub24gZXZlcnkgaXRlcmF0aW9uKS5cXFxcblxcXFxuVG8gY29tcHV0ZSB0aGUgcHJvZHVjdCBvZiBhbiBpdGVyYWJsZSB3aXRoIGl0c2VsZiwgc3BlY2lmeSB0aGUgbnVtYmVyXFxcXG5vZiByZXBldGl0aW9ucyB3aXRoIHRoZSBvcHRpb25hbCByZXBlYXQga2V5d29yZCBhcmd1bWVudC4gRm9yIGV4YW1wbGUsXFxcXG5wcm9kdWN0KEEsIHJlcGVhdD00KSBtZWFucyB0aGUgc2FtZSBhcyBwcm9kdWN0KEEsIEEsIEEsIEEpLlxcXFxuXFxcXG5wcm9kdWN0KCdhYicsIHJhbmdlKDMpKSAtLT4gKCdhJywwKSAoJ2EnLDEpICgnYScsMikgKCdiJywwKSAoJ2InLDEpICgnYicsMilcXFxcbnByb2R1Y3QoKDAsMSksICgwLDEpLCAoMCwxKSkgLS0+ICgwLDAsMCkgKDAsMCwxKSAoMCwxLDApICgwLDEsMSkgKDEsMCwwKSAuLi5cXFwiLHRwJG5ldyhiLGMpe2xldFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwicHJvZHVjdFxcXCIsW1xcXCJyZXBlYXRcXFwiXSxbXSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDEpXSk7aWYoZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJGbG93RXJyb3IpLDA+ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlXFxcIik7Y29uc3QgZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYlthXSkpO2NvbnN0IGY9W10uY29uY2F0KC4uLkFycmF5KGQpLmZpbGwoZSkpO2lmKHRoaXM9PT1hLnByb2R1Y3QucHJvdG90eXBlKXJldHVybiBuZXcgYS5wcm9kdWN0KGYpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS5wcm9kdWN0LmNhbGwoYixmKSxifX19fSksYS5yZXBlYXQ9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMucmVwZWF0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gcmVwZWF0KGEsYil7dGhpcy5vYmplY3Q9YSx0aGlzLnRpbWVzPWIsdm9pZCAwPT09YiYmKHRoaXMudHAkaXRlcm5leHQ9KCk9PnRoaXMub2JqZWN0KX0saXRlcm5leHQoKXtyZXR1cm4gMDx0aGlzLnRpbWVzLS0/dGhpcy5vYmplY3Q6dm9pZCAwfSxzbG90czp7dHAkZG9jOlxcXCJyZXBlYXQob2JqZWN0IFssdGltZXNdKSAtPiBjcmVhdGUgYW4gaXRlcmF0b3Igd2hpY2ggcmV0dXJucyB0aGUgb2JqZWN0XFxcXG5mb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMuICBJZiBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBvYmplY3RcXFxcbmVuZGxlc3NseS5cXFwiLHRwJG5ldyhiLGMpe2xldCBkLGU7aWYoW2QsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcInJlcGVhdFxcXCIsW1xcXCJvYmplY3RcXFwiLFxcXCJ0aW1lc1xcXCJdLGIsYyxbbnVsbF0pLGU9bnVsbD09PWU/dm9pZCAwOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChlLFNrLmJ1aWx0aW4uT3ZlckZsb3dFcnJvciksdGhpcz09PWEucmVwZWF0LnByb3RvdHlwZSlyZXR1cm4gbmV3IGEucmVwZWF0KGQsZSk7ZWxzZXtjb25zdCBiPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBhLnJlcGVhdC5jYWxsKGIsZCxlKSxifX0sJHIoKXtyZXR1cm4gb2JqZWN0X3JlcHI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLm9iamVjdCksdGltZXNfcmVwcj12b2lkIDA9PT10aGlzLnRpbWVzP1xcXCJcXFwiOlxcXCIsIFxcXCIrKDA8PXRoaXMudGltZXM/dGhpcy50aW1lczowKSxuZXcgU2suYnVpbHRpbi5zdHIoU2suYWJzdHIudHlwZU5hbWUodGhpcykrXFxcIihcXFwiK29iamVjdF9yZXByK3RpbWVzX3JlcHIrXFxcIilcXFwiKX19LG1ldGhvZHM6e19fbGVuZ2h0X2hpbnRfXzp7JG1ldGgoKXtpZih2b2lkIDA9PT10aGlzLnRpbWVzKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibGVuKCkgb2YgdW5zaXplZCBvYmplY3RcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnRpbWVzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGx9fX0pLGEuc3Rhcm1hcD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXFxcIml0ZXJ0b29scy5zdGFybWFwXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gc3Rhcm1hcChhLGIpe3RoaXMuZnVuYz1hLHRoaXMuaXRlcj1ifSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy5pdGVyLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09YSlyZXR1cm47Y29uc3QgYj1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSxjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLmZ1bmMsYik7cmV0dXJuIGN9LHNsb3RzOnt0cCRuZXcoYixjKXtsZXQgZCxlO2lmKFtkLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFxcXCJzdGFybWFwXFxcIixbXFxcImZ1bmNcXFwiLFxcXCJpdGVyYWJsZVxcXCJdLGIsYyxbXSksZT1Tay5hYnN0ci5pdGVyKGUpLGQ9U2suYnVpbHRpbi5jaGVja05vbmUoZCk/U2suYnVpbHRpbi5ib29sOmQsdGhpcz09PWEuc3Rhcm1hcC5wcm90b3R5cGUpcmV0dXJuIG5ldyBhLnN0YXJtYXAoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEuc3Rhcm1hcC5jYWxsKGIsZCxlKSxifX19fSksYS50YWtld2hpbGU9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFxcXCJpdGVydG9vbHMudGFrZXdoaWxlXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gdGFrZXdoaWxlKGEsYil7dGhpcy5wcmVkaWNhdGU9YSx0aGlzLml0ZXI9Yn0saXRlcm5leHQoKXtjb25zdCBhPXRoaXMuaXRlci50cCRpdGVybmV4dCgpO2lmKHZvaWQgMCE9PWEpe2NvbnN0IGI9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMucHJlZGljYXRlLFthXSk7aWYoU2subWlzY2V2YWwuaXNUcnVlKGIpKXJldHVybiBhO3RoaXMudHAkaXRlcm5leHQ9KCk9PnZvaWQgMH19LHNsb3RzOnt0cCRkb2M6XFxcInRha2V3aGlsZShwcmVkaWNhdGUsIGl0ZXJhYmxlKSAtLT4gdGFrZXdoaWxlIG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gc3VjY2Vzc2l2ZSBlbnRyaWVzIGZyb20gYW4gaXRlcmFibGUgYXMgbG9uZyBhcyB0aGUgXFxcXG5wcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgZm9yIGVhY2ggZW50cnkuXFxcIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJ0YWtld2hpbGVcXFwiLGMpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwidGFrZXdoaWxlXFxcIixiLDIsMik7Y29uc3QgZD1iWzBdLGU9U2suYWJzdHIuaXRlcihiWzFdKTtpZih0aGlzPT09YS50YWtld2hpbGUucHJvdG90eXBlKXJldHVybiBuZXcgYS50YWtld2hpbGUoZCxlKTtlbHNle2NvbnN0IGI9bmV3IHRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGEudGFrZXdoaWxlLmNhbGwoYixkLGUpLGJ9fX19KSxhLnRlZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9KSxhLnppcF9sb25nZXN0PVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcXFwiaXRlcnRvb2xzLnppcF9sb25nZXN0XFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gemlwX2xvbmdlc3QoYSxiKXt0aGlzLml0ZXJzPWEsdGhpcy5maWxsdmFsdWU9Yix0aGlzLmFjdGl2ZT10aGlzLml0ZXJzLmxlbmd0aH0saXRlcm5leHQoKXtpZighdGhpcy5hY3RpdmUpcmV0dXJuO2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDx0aGlzLml0ZXJzLmxlbmd0aDtkKyspe2lmKGI9dGhpcy5pdGVyc1tkXS50cCRpdGVybmV4dCgpLHZvaWQgMD09PWIpe2lmKHRoaXMuYWN0aXZlLS0sIXRoaXMuYWN0aXZlKXJldHVybjt0aGlzLml0ZXJzW2RdPW5ldyBhLnJlcGVhdCh0aGlzLmZpbGx2YWx1ZSksYj10aGlzLmZpbGx2YWx1ZX1jLnB1c2goYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGMpfSxzbG90czp7dHAkZG9jOlxcXCJ6aXBfbG9uZ2VzdChpdGVyMSBbLGl0ZXIyIFsuLi5dXSwgW2ZpbGx2YWx1ZT1Ob25lXSkgLS0+IHppcF9sb25nZXN0IG9iamVjdFxcXFxuXFxcXG5SZXR1cm4gYSB6aXBfbG9uZ2VzdCBvYmplY3Qgd2hvc2UgLl9fbmV4dF9fKCkgbWV0aG9kIHJldHVybnMgYSB0dXBsZSB3aGVyZVxcXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxcXG5tZXRob2QgY29udGludWVzIHVudGlsIHRoZSBsb25nZXN0IGl0ZXJhYmxlIGluIHRoZSBhcmd1bWVudCBzZXF1ZW5jZVxcXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLiAgV2hlbiB0aGUgc2hvcnRlciBpdGVyYWJsZXNcXFxcbmFyZSBleGhhdXN0ZWQsIHRoZSBmaWxsdmFsdWUgaXMgc3Vic3RpdHV0ZWQgaW4gdGhlaXIgcGxhY2UuICBUaGUgZmlsbHZhbHVlXFxcXG5kZWZhdWx0cyB0byBOb25lIG9yIGNhbiBiZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkIGFyZ3VtZW50LlxcXFxuXFxcIix0cCRuZXcoYixjKXtjb25zdFtkXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcXFwiemlwX2xvbmdlc3RcXFwiLFtcXFwiZmlsbHZhbHVlXFxcIl0sW10sYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkXSksZT1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoO2ErKyllLnB1c2goU2suYWJzdHIuaXRlcihiW2FdKSk7aWYodGhpcz09PWEuemlwX2xvbmdlc3QucHJvdG90eXBlKXJldHVybiBuZXcgYS56aXBfbG9uZ2VzdChlLGQpO2Vsc2V7Y29uc3QgYj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gYS56aXBfbG9uZ2VzdC5jYWxsKGIsZSxkKSxifX19fSksYS5fX2RvY19fPW5ldyBTay5idWlsdGluLnN0cihcXFwiQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHB5dGhvbiBpdGVydG9vbHMgbW9kdWxlIGluIFNrdWxwdFxcXCIpLGEuX19wYWNrYWdlX189bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKSxhfTtcIixcInNyYy9saWIvanNvbi9fX2luaXRfXy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7XFxcInVzZSBzdHJpY3RcXFwiO3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSl7U2suYnVpbHRpbi5weUNoZWNrQXJncyhcXFwiZHVtcHNcXFwiLGFyZ3VtZW50cywxLDEvMCwhMCwhMSk7dmFyIGIsYyxkLGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGY9bmV3IFNrLmJ1aWx0aW5zLmRpY3QoYSksZz0hMTtyZXR1cm4gYj17YXNjaWk6ITAsc2VwYXJhdG9yczp7aXRlbV9zZXBhcmF0b3I6XFxcIiwgXFxcIixrZXlfc2VwYXJhdG9yOlxcXCI6IFxcXCJ9fSxmPVNrLmZmaS5yZW1hcFRvSnMoZiksYz1Tay5mZmkucmVtYXBUb0pzKGVbMF0pLFxcXCJib29sZWFuXFxcIj09dHlwZW9mIGYuZW5zdXJlX2FzY2lpJiYhMT09PWYuZW5zdXJlX2FzY2lpJiYoYi5hc2NpaT0hMSksXFxcImJvb2xlYW5cXFwiPT10eXBlb2YgZi5zb3J0X2tleXMmJmYuc29ydF9rZXlzJiYoZz0hMCksZ3x8KGIuY21wPWZ1bmN0aW9uKCl7cmV0dXJuIDB9KSxcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYuc2VwYXJhdG9ycyYmMj09Zi5zZXBhcmF0b3JzLmxlbmd0aCYmKGIuc2VwYXJhdG9ycy5pdGVtX3NlcGFyYXRvcj1mLnNlcGFyYXRvcnNbMF0sYi5zZXBhcmF0b3JzLmtleV9zZXBhcmF0b3I9Zi5zZXBhcmF0b3JzWzFdKSxmLmluZGVudCYmKGIuc3BhY2U9Zi5pbmRlbnQpLGYuZGVmYXVsdCxkPXN0cmluZ2lmeShjLGIpLG5ldyBTay5idWlsdGluLnN0cihkKX07Yi5jb19rd2FyZ3M9ITAsYS5kdW1wcz1uZXcgU2suYnVpbHRpbi5mdW5jKGIpO3ZhciBjPWZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcImxvYWRzXFxcIixhcmd1bWVudHMsMSwxLzAsITAsITEpO3ZhciBiLGMsZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSksZT1uZXcgU2suYnVpbHRpbnMuZGljdChhKTtyZXR1cm4gZT1Tay5mZmkucmVtYXBUb0pzKGUpLGI9ZFswXS52LGM9SlNPTi5wYXJzZShiKSxTay5mZmkucmVtYXBUb1B5KGMpfTtyZXR1cm4gYy5jb19rd2FyZ3M9ITAsYS5sb2Fkcz1uZXcgU2suYnVpbHRpbi5mdW5jKGMpLGF9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi9zdHJpbmdpZnkuanNcIjpcIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoYixkLGUpe2Z1bmN0aW9uIG8oaCxpKXtpZighZFtoXSl7aWYoIWJbaF0pe3ZhciBmPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFpJiZmKXJldHVybiBmKGgsITApO2lmKGcpcmV0dXJuIGcoaCwhMCk7dmFyIGM9bmV3IEVycm9yKFxcXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1xcXCIraCtcXFwiJ1xcXCIpO3Rocm93IGMuY29kZT1cXFwiTU9EVUxFX05PVF9GT1VORFxcXCIsY312YXIgYT1kW2hdPXtleHBvcnRzOnt9fTtiW2hdWzBdLmNhbGwoYS5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbaF1bMV1bYV07cmV0dXJuIG8oY3x8YSl9LGEsYS5leHBvcnRzLHIsYixkLGUpfXJldHVybiBkW2hdLmV4cG9ydHN9Zm9yKHZhciBnPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGE9MDthPGUubGVuZ3RoO2ErKylvKGVbYV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24oYSxiKXt2YXIgYz1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIEpTT04/YShcXFwianNvbmlmeVxcXCIpOkpTT047Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7Ynx8KGI9e30pLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiJiYoYj17Y21wOmJ9KTt2YXIgZj1iLmNtcCYmZnVuY3Rpb24oYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlLGEpe3ZhciBiPXtrZXk6ZSx2YWx1ZTpkW2VdfSxmPXtrZXk6YSx2YWx1ZTpkW2FdfTtyZXR1cm4gYyhiLGYpfX19KGIuY21wKTtyZXR1cm4gZnVuY3Rpb24gc3RyaW5naWZ5KGEpe2lmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYXx8bnVsbD09PWEpcmV0dXJuIGMuc3RyaW5naWZ5KGEpO2lmKGQoYSkpe2Zvcih2YXIgYj1bXSxnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKHN0cmluZ2lmeShhW2ddKSk7cmV0dXJuXFxcIltcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIn1mb3IodmFyIGgsaj1lKGEpLnNvcnQoZiYmZihhKSksYj1bXSxnPTA7ZzxqLmxlbmd0aDtnKyspaD1qW2ddLGIucHVzaChzdHJpbmdpZnkoaCkrXFxcIjpcXFwiK3N0cmluZ2lmeShhW2hdKSk7cmV0dXJuXFxcIntcXFwiK2Iuam9pbihcXFwiLFxcXCIpK1xcXCJ9XFxcIn0oYSl9O3ZhciBkPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVyblxcXCJbb2JqZWN0IEFycmF5XVxcXCI9PT17fS50b1N0cmluZy5jYWxsKGEpfSxlPU9iamVjdC5rZXlzfHxmdW5jdGlvbihhKXt2YXIgYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbigpe3JldHVybiEwfSxjPVtdO2Zvcih2YXIgZCBpbiBhKWIuY2FsbChhLGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9fSx7anNvbmlmeToyfV0sMjpbZnVuY3Rpb24oYSxiLGMpe2MucGFyc2U9YShcXFwiLi9saWIvcGFyc2VcXFwiKSxjLnN0cmluZ2lmeT1hKFxcXCIuL2xpYi9zdHJpbmdpZnlcXFwiKX0se1xcXCIuL2xpYi9wYXJzZVxcXCI6MyxcXFwiLi9saWIvc3RyaW5naWZ5XFxcIjo0fV0sMzpbZnVuY3Rpb24oYSxiKXt2YXIgZCxlLGYsZyxoPXsnXFxcIic6XFxcIlxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXCIsXFxcIi9cXFwiOlxcXCIvXFxcIixiOlxcXCJcXFxcYlxcXCIsZjpcXFwiXFxcXGZcXFwiLG46XFxcIlxcXFxuXFxcIixyOlxcXCJcXFxcclxcXCIsdDpcXFwiXFxcXHRcXFwifSxqPWZ1bmN0aW9uKGEpe3Rocm93e25hbWU6XFxcIlN5bnRheEVycm9yXFxcIixtZXNzYWdlOmEsYXQ6ZCx0ZXh0OmZ9fSxrPWZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIT09ZSYmaihcXFwiRXhwZWN0ZWQgJ1xcXCIrYStcXFwiJyBpbnN0ZWFkIG9mICdcXFwiK2UrXFxcIidcXFwiKSxlPWYuY2hhckF0KGQpLGQrPTEsZX0sbD1mdW5jdGlvbigpe3ZhciBhLGI9XFxcIlxcXCI7Zm9yKFxcXCItXFxcIj09PWUmJihiPVxcXCItXFxcIixrKFxcXCItXFxcIikpO1xcXCIwXFxcIjw9ZSYmXFxcIjlcXFwiPj1lOyliKz1lLGsoKTtpZihcXFwiLlxcXCI9PT1lKWZvcihiKz1cXFwiLlxcXCI7aygpJiZcXFwiMFxcXCI8PWUmJlxcXCI5XFxcIj49ZTspYis9ZTtpZihcXFwiZVxcXCI9PT1lfHxcXFwiRVxcXCI9PT1lKWZvcihiKz1lLGsoKSwoXFxcIi1cXFwiPT09ZXx8XFxcIitcXFwiPT09ZSkmJihiKz1lLGsoKSk7XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU7KWIrPWUsaygpO3JldHVybiBhPStiLGlzRmluaXRlKGEpP2E6dm9pZCBqKFxcXCJCYWQgbnVtYmVyXFxcIil9LG09ZnVuY3Rpb24oKXt2YXIgYixjLGQsYT1TdHJpbmcuZnJvbUNoYXJDb2RlLGY9XFxcIlxcXCI7aWYoXFxcIlxcXFxcXFwiXFxcIj09PWUpZm9yKDtrKCk7KXtpZihcXFwiXFxcXFxcXCJcXFwiPT09ZSlyZXR1cm4gaygpLGY7aWYoXFxcIlxcXFxcXFxcXFxcIiE9PWUpZis9ZTtlbHNlIGlmKGsoKSxcXFwidVxcXCI9PT1lKXtmb3IoZD0wLGM9MDs0PmMmJihiPXBhcnNlSW50KGsoKSwxNiksISFpc0Zpbml0ZShiKSk7Yys9MSlkPTE2KmQrYjtmKz1hKGQpfWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBoW2VdKWYrPWhbZV07ZWxzZSBicmVha31qKFxcXCJCYWQgc3RyaW5nXFxcIil9LG49ZnVuY3Rpb24oKXtmb3IoO2UmJlxcXCIgXFxcIj49ZTspaygpfSxvPWZ1bmN0aW9uKCl7c3dpdGNoKGUpe2Nhc2VcXFwidFxcXCI6cmV0dXJuIGsoXFxcInRcXFwiKSxrKFxcXCJyXFxcIiksayhcXFwidVxcXCIpLGsoXFxcImVcXFwiKSwhMDtjYXNlXFxcImZcXFwiOnJldHVybiBrKFxcXCJmXFxcIiksayhcXFwiYVxcXCIpLGsoXFxcImxcXFwiKSxrKFxcXCJzXFxcIiksayhcXFwiZVxcXCIpLCExO2Nhc2VcXFwiblxcXCI6cmV0dXJuIGsoXFxcIm5cXFwiKSxrKFxcXCJ1XFxcIiksayhcXFwibFxcXCIpLGsoXFxcImxcXFwiKSxudWxsO31qKFxcXCJVbmV4cGVjdGVkICdcXFwiK2UrXFxcIidcXFwiKX0scD1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKFxcXCJbXFxcIj09PWUpe2lmKGsoXFxcIltcXFwiKSxuKCksXFxcIl1cXFwiPT09ZSlyZXR1cm4gayhcXFwiXVxcXCIpLGE7Zm9yKDtlOyl7aWYoYS5wdXNoKGcoKSksbigpLFxcXCJdXFxcIj09PWUpcmV0dXJuIGsoXFxcIl1cXFwiKSxhO2soXFxcIixcXFwiKSxuKCl9fWooXFxcIkJhZCBhcnJheVxcXCIpfSxxPWZ1bmN0aW9uKCl7dmFyIGEsYj17fTtpZihcXFwie1xcXCI9PT1lKXtpZihrKFxcXCJ7XFxcIiksbigpLFxcXCJ9XFxcIj09PWUpcmV0dXJuIGsoXFxcIn1cXFwiKSxiO2Zvcig7ZTspe2lmKGE9bSgpLG4oKSxrKFxcXCI6XFxcIiksT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixhKSYmaihcXFwiRHVwbGljYXRlIGtleSBcXFxcXFxcIlxcXCIrYStcXFwiXFxcXFxcXCJcXFwiKSxiW2FdPWcoKSxuKCksXFxcIn1cXFwiPT09ZSlyZXR1cm4gayhcXFwifVxcXCIpLGI7ayhcXFwiLFxcXCIpLG4oKX19aihcXFwiQmFkIG9iamVjdFxcXCIpfTtnPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKSxcXFwie1xcXCI9PT1lP3EoKTpcXFwiW1xcXCI9PT1lP3AoKTpcXFwiXFxcXFxcXCJcXFwiPT09ZT9tKCk6XFxcIi1cXFwiPT09ZT9sKCk6XFxcIjBcXFwiPD1lJiZcXFwiOVxcXCI+PWU/bCgpOm8oKX0sYi5leHBvcnRzPWZ1bmN0aW9uKGEsYil7dmFyIGM7cmV0dXJuIGY9YSxkPTAsZT1cXFwiIFxcXCIsYz1nKCksbigpLGUmJmooXFxcIlN5bnRheCBlcnJvclxcXCIpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBiP2Z1bmN0aW9uIHdhbGsoYSxjKXt2YXIgZCxlLGY9YVtjXTtpZihmJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGYpZm9yKGQgaW4gZilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZixkKSYmKGU9d2FsayhmLGQpLHZvaWQgMD09PWU/ZGVsZXRlIGZbZF06ZltkXT1lKTtyZXR1cm4gYi5jYWxsKGEsYyxmKX0oe1xcXCJcXFwiOmN9LFxcXCJcXFwiKTpjfX0se31dLDQ6W2Z1bmN0aW9uKGEsYil7ZnVuY3Rpb24gcXVvdGUoYSl7cmV0dXJuIGYubGFzdEluZGV4PTAsZi50ZXN0KGEpP1xcXCJcXFxcXFxcIlxcXCIrYS5yZXBsYWNlKGYsZnVuY3Rpb24oYil7dmFyIGE9Z1tiXTtyZXR1cm5cXFwic3RyaW5nXFxcIj09dHlwZW9mIGE/YTpcXFwiXFxcXFxcXFx1XFxcIisoXFxcIjAwMDBcXFwiK2IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KX0pK1xcXCJcXFxcXFxcIlxcXCI6XFxcIlxcXFxcXFwiXFxcIithK1xcXCJcXFxcXFxcIlxcXCJ9ZnVuY3Rpb24gc3RyKGEsYil7dmFyIGYsZyxoLGosbCxtPWMsbj1iW2FdO3N3aXRjaChuJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIG4mJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBuLnRvSlNPTiYmKG49bi50b0pTT04oYSkpLFxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlJiYobj1lLmNhbGwoYixhLG4pKSx0eXBlb2Ygbil7Y2FzZVxcXCJzdHJpbmdcXFwiOnJldHVybiBxdW90ZShuKTtjYXNlXFxcIm51bWJlclxcXCI6cmV0dXJuIGlzRmluaXRlKG4pP24rXFxcIlxcXCI6XFxcIm51bGxcXFwiO2Nhc2VcXFwiYm9vbGVhblxcXCI6Y2FzZVxcXCJudWxsXFxcIjpyZXR1cm4gbitcXFwiXFxcIjtjYXNlXFxcIm9iamVjdFxcXCI6aWYoIW4pcmV0dXJuXFxcIm51bGxcXFwiO2lmKGMrPWQsbD1bXSxcXFwiW29iamVjdCBBcnJheV1cXFwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShuKSl7Zm9yKGo9bi5sZW5ndGgsZj0wO2Y8ajtmKz0xKWxbZl09c3RyKGYsbil8fFxcXCJudWxsXFxcIjtyZXR1cm4gaD0wPT09bC5sZW5ndGg/XFxcIltdXFxcIjpjP1xcXCJbXFxcXG5cXFwiK2MrbC5qb2luKFxcXCIsXFxcXG5cXFwiK2MpK1xcXCJcXFxcblxcXCIrbStcXFwiXVxcXCI6XFxcIltcXFwiK2wuam9pbihcXFwiLFxcXCIpK1xcXCJdXFxcIixjPW0saH1pZihlJiZcXFwib2JqZWN0XFxcIj09dHlwZW9mIGUpZm9yKGo9ZS5sZW5ndGgsZj0wO2Y8ajtmKz0xKWc9ZVtmXSxcXFwic3RyaW5nXFxcIj09dHlwZW9mIGcmJihoPXN0cihnLG4pLGgmJmwucHVzaChxdW90ZShnKSsoYz9cXFwiOiBcXFwiOlxcXCI6XFxcIikraCkpO2Vsc2UgZm9yKGcgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixnKSYmKGg9c3RyKGcsbiksaCYmbC5wdXNoKHF1b3RlKGcpKyhjP1xcXCI6IFxcXCI6XFxcIjpcXFwiKStoKSk7cmV0dXJuIGg9MD09PWwubGVuZ3RoP1xcXCJ7fVxcXCI6Yz9cXFwie1xcXFxuXFxcIitjK2wuam9pbihcXFwiLFxcXFxuXFxcIitjKStcXFwiXFxcXG5cXFwiK20rXFxcIn1cXFwiOlxcXCJ7XFxcIitsLmpvaW4oXFxcIixcXFwiKStcXFwifVxcXCIsYz1tLGg7fX12YXIgYyxkLGUsZj0vW1xcXFxcXFxcXFxcXFxcXCJcXFxceDAwLVxcXFx4MWZcXFxceDdmLVxcXFx4OWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl0vZyxnPXtcXFwiXFxiXFxcIjpcXFwiXFxcXFxcXFxiXFxcIixcXFwiXFx0XFxcIjpcXFwiXFxcXFxcXFx0XFxcIixcXFwiXFxcXG5cXFwiOlxcXCJcXFxcXFxcXG5cXFwiLFxcXCJcXGZcXFwiOlxcXCJcXFxcXFxcXGZcXFwiLFxcXCJcXFxcclxcXCI6XFxcIlxcXFxcXFxcclxcXCIsJ1xcXCInOlxcXCJcXFxcXFxcXFxcXFxcXFwiXFxcIixcXFwiXFxcXFxcXFxcXFwiOlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIn07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixmKXt2YXIgZztpZihjPVxcXCJcXFwiLGQ9XFxcIlxcXCIsXFxcIm51bWJlclxcXCI9PXR5cGVvZiBmKWZvcihnPTA7ZzxmO2crPTEpZCs9XFxcIiBcXFwiO2Vsc2VcXFwic3RyaW5nXFxcIj09dHlwZW9mIGYmJihkPWYpO2lmKGU9YixiJiZcXFwiZnVuY3Rpb25cXFwiIT10eXBlb2YgYiYmKFxcXCJvYmplY3RcXFwiIT10eXBlb2YgYnx8XFxcIm51bWJlclxcXCIhPXR5cGVvZiBiLmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKFxcXCJKU09OLnN0cmluZ2lmeVxcXCIpO3JldHVybiBzdHIoXFxcIlxcXCIse1xcXCJcXFwiOmF9KX19LHt9XSw1OltmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXFxcInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0KCl7dGhyb3cgbmV3IEVycm9yKFxcXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcXFwiKX1mdW5jdGlvbiBydW5UaW1lb3V0KGEpe2lmKGM9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGEsMCk7aWYoKGM9PT1kZWZhdWx0U2V0VGltb3V0fHwhYykmJnNldFRpbWVvdXQpcmV0dXJuIGM9c2V0VGltZW91dCxzZXRUaW1lb3V0KGEsMCk7dHJ5e3JldHVybiBjKGEsMCl9Y2F0Y2goYil7dHJ5e3JldHVybiBjLmNhbGwobnVsbCxhLDApfWNhdGNoKGIpe3JldHVybiBjLmNhbGwodGhpcyxhLDApfX19ZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KGEpe2lmKGQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigoZD09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFkKSYmY2xlYXJUaW1lb3V0KXJldHVybiBkPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBkKGEpfWNhdGNoKGIpe3RyeXtyZXR1cm4gZC5jYWxsKG51bGwsYSl9Y2F0Y2goYil7cmV0dXJuIGQuY2FsbCh0aGlzLGEpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7aCYmZiYmKGg9ITEsZi5sZW5ndGg/Zz1mLmNvbmNhdChnKTppPS0xLGcubGVuZ3RoJiZkcmFpblF1ZXVlKCkpfWZ1bmN0aW9uIGRyYWluUXVldWUoKXtpZighaCl7dmFyIGE9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2g9ITA7Zm9yKHZhciBiPWcubGVuZ3RoO2I7KXtmb3IoZj1nLGc9W107KytpPGI7KWYmJmZbaV0ucnVuKCk7aT0tMSxiPWcubGVuZ3RofWY9bnVsbCxoPSExLHJ1bkNsZWFyVGltZW91dChhKX19ZnVuY3Rpb24gSXRlbShhLGIpe3RoaXMuZnVuPWEsdGhpcy5hcnJheT1ifWZ1bmN0aW9uIG5vb3AoKXt9dmFyIGMsZCxlPWIuZXhwb3J0cz17fTsoZnVuY3Rpb24oKXt0cnl7Yz1cXFwiZnVuY3Rpb25cXFwiPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2goYSl7Yz1kZWZhdWx0U2V0VGltb3V0fXRyeXtkPVxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goYSl7ZD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0pKCk7dmFyIGYsZz1bXSxoPSExLGk9LTE7ZS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgYj1BcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKDE8YXJndW1lbnRzLmxlbmd0aClmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWJbYy0xXT1hcmd1bWVudHNbY107Zy5wdXNoKG5ldyBJdGVtKGEsYikpLDEhPT1nLmxlbmd0aHx8aHx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZS50aXRsZT1cXFwiYnJvd3NlclxcXCIsZS5icm93c2VyPSEwLGUuZW52PXt9LGUuYXJndj1bXSxlLnZlcnNpb249XFxcIlxcXCIsZS52ZXJzaW9ucz17fSxlLm9uPW5vb3AsZS5hZGRMaXN0ZW5lcj1ub29wLGUub25jZT1ub29wLGUub2ZmPW5vb3AsZS5yZW1vdmVMaXN0ZW5lcj1ub29wLGUucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsZS5lbWl0PW5vb3AsZS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxlLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxlLmxpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybltdfSxlLmJpbmRpbmc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXFxcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXFxcIil9LGUuY3dkPWZ1bmN0aW9uKCl7cmV0dXJuXFxcIi9cXFwifSxlLmNoZGlyPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFxcXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcXFwiKX0sZS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0se31dLDY6W2Z1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKGMpe3ZhciBkPWEoXFxcImpzb24tc3RhYmxlLXN0cmluZ2lmeVxcXCIpO2MuYnJvd3Nlcj93aW5kb3cuc3RyaW5naWZ5PWQ6Yi5leHBvcnRzPWR9KS5jYWxsKHRoaXMsYShcXFwiX3Byb2Nlc3NcXFwiKSl9LHtfcHJvY2Vzczo1LFxcXCJqc29uLXN0YWJsZS1zdHJpbmdpZnlcXFwiOjF9XX0se30sWzZdKTtcIixcInNyYy9saWIvanNvbi90ZXN0cy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVzdHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9rZXl3b3JkLnB5XCI6XCJcXG5fX2FsbF9fID0gW1xcXCJpc2tleXdvcmRcXFwiLCBcXFwia3dsaXN0XFxcIl1cXG5cXG5rd2xpc3QgPSBbXFxuIy0tc3RhcnQga2V5d29yZHMtLVxcbiAgICAgICAgJ2FuZCcsXFxuICAgICAgICAnYXMnLFxcbiAgICAgICAgJ2Fzc2VydCcsXFxuICAgICAgICAnYnJlYWsnLFxcbiAgICAgICAgJ2NsYXNzJyxcXG4gICAgICAgICdjb250aW51ZScsXFxuICAgICAgICAnZGVmJyxcXG4gICAgICAgICdkZWwnLFxcbiAgICAgICAgJ2VsaWYnLFxcbiAgICAgICAgJ2Vsc2UnLFxcbiAgICAgICAgJ2V4Y2VwdCcsXFxuICAgICAgICAnZXhlYycsXFxuICAgICAgICAnZmluYWxseScsXFxuICAgICAgICAnZm9yJyxcXG4gICAgICAgICdmcm9tJyxcXG4gICAgICAgICdnbG9iYWwnLFxcbiAgICAgICAgJ2lmJyxcXG4gICAgICAgICdpbXBvcnQnLFxcbiAgICAgICAgJ2luJyxcXG4gICAgICAgICdpcycsXFxuICAgICAgICAnbGFtYmRhJyxcXG4gICAgICAgICdub3QnLFxcbiAgICAgICAgJ29yJyxcXG4gICAgICAgICdwYXNzJyxcXG4gICAgICAgICdwcmludCcsXFxuICAgICAgICAncmFpc2UnLFxcbiAgICAgICAgJ3JldHVybicsXFxuICAgICAgICAndHJ5JyxcXG4gICAgICAgICd3aGlsZScsXFxuICAgICAgICAnd2l0aCcsXFxuICAgICAgICAneWllbGQnLFxcbiMtLWVuZCBrZXl3b3Jkcy0tXFxuICAgICAgICBdXFxuXFxuaXNrZXl3b3JkID0gZnJvemVuc2V0KGt3bGlzdCkuX19jb250YWluc19fXFxuXFxuXCIsXCJzcmMvbGliL2xpYi1keW5sb2FkL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsaWItZHlubG9hZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYi10ay9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliLXRrIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGliMnRvMyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImZpeGVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicGdlbjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZXN0cyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL2xpbmVjYWNoZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibGluZWNhY2hlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbG9jYWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2NhbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9sb2dnaW5nL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJsb2dnaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFjcGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFjcGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hY3VybDJwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWN1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21haWxib3gucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1haWxib3ggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tYWlsY2FwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYWlsY2FwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWFya3VwYmFzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWFya3VwYmFzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21hdGguanNcIjpcImNvbnN0ICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5QSSxiPU1hdGguc3FydCxjPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGQ9TWF0aC5FLGU9TWF0aC5sb2csZj1NYXRoLmV4cCxnPU1hdGgucG93LGg9TWF0aC5sb2cyLGk9TnVtYmVyLmlzRmluaXRlLGo9TWF0aC5mbG9vcixrPU1hdGguYWJzO2NvbnN0IGw9e3BpOm5ldyBTay5idWlsdGluLmZsb2F0XyhhKSxlOm5ldyBTay5idWlsdGluLmZsb2F0XyhkKSx0YXU6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDIqYSksbmFuOm5ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pLGluZjpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMS8wKX0sbj1mdW5jdGlvbihhKXtyZXR1cm4gYT1hPzA+YT8tMToxOjA+MS9hPy0xOjEsYX0sbz0xODtyZXR1cm4gU2suYWJzdHIuc2V0VXBNb2R1bGVNZXRob2RzKFxcXCJtYXRoXFxcIixsLHthY29zOnskbWV0aDpmdW5jdGlvbiBhY29zKGEpe3ZhciBiPU1hdGguYWNvcztyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhcmMgY29zaW5lIChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB4LlxcXCJ9LGFjb3NoOnskbWV0aDpmdW5jdGlvbiBhY29zaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGM9YStiKGEqYS0xKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIG9mIHguXFxcIn0sYXNpbjp7JG1ldGg6ZnVuY3Rpb24gYXNpbihhKXt2YXIgYj1NYXRoLmFzaW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHNpbmUgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXNpbmg6eyRtZXRoOmZ1bmN0aW9uIGFzaW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYz1hK2IoYSphKzEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZShjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sYXRhbjp7JG1ldGg6ZnVuY3Rpb24gYXRhbihhKXt2YXIgYj1NYXRoLmF0YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYXJjIHRhbmdlbnQgKG1lYXN1cmVkIGluIHJhZGlhbnMpIG9mIHguXFxcIn0sYXRhbjI6eyRtZXRoOmZ1bmN0aW9uIGF0YW4yKGEsYil7dmFyIGM9TWF0aC5hdGFuMjtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMoU2suYnVpbHRpbi5hc251bSQoYSksU2suYnVpbHRpbi5hc251bSQoYikpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHksIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGFyYyB0YW5nZW50IChtZWFzdXJlZCBpbiByYWRpYW5zKSBvZiB5L3guXFxcXG5cXFxcblVubGlrZSBhdGFuKHkveCksIHRoZSBzaWducyBvZiBib3RoIHggYW5kIHkgYXJlIGNvbnNpZGVyZWQuXFxcIn0sYXRhbmg6eyRtZXRoOmZ1bmN0aW9uIGF0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj0oMSthKS8oMS1hKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUoYikvMil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sY2VpbDp7JG1ldGg6ZnVuY3Rpb24gY2VpbChhKXt2YXIgYj1NYXRoLmNlaWw7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQ/bmV3IFNrLmJ1aWx0aW4uaW50XyhiKGMpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNlaWxpbmcgb2YgeCBhcyBhbiBJbnRlZ3JhbC5cXFxcblxcXFxuVGhpcyBpcyB0aGUgc21hbGxlc3QgaW50ZWdlciA+PSB4LlxcXCJ9LGNvcHlzaWduOnskbWV0aDpmdW5jdGlvbiBjb3B5c2lnbihhLGIpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInlcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYikpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYiksZD1Tay5idWlsdGluLmFzbnVtJChhKSxlPW4oZCksZj1uKGMpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCooZSpmKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGEgZmxvYXQgd2l0aCB0aGUgbWFnbml0dWRlIChhYnNvbHV0ZSB2YWx1ZSkgb2YgeCBidXQgdGhlIHNpZ24gb2YgeS5cXFxcblxcXFxuT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBzaWduZWQgemVyb3MsIGNvcHlzaWduKDEuMCwgLTAuMClcXFxcbnJldHVybnMgLTEuMC5cXFxcblxcXCJ9LGNvczp7JG1ldGg6ZnVuY3Rpb24gY29zKGEpe3ZhciBiPU1hdGguY29zO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIGNvc2luZSBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSxjb3NoOnskbWV0aDpmdW5jdGlvbiBjb3NoKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLGE9U2suYnVpbHRpbi5hc251bSQoYSk7Y29uc3QgYj1nKGQsYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygoYisxL2IpLzIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBoeXBlcmJvbGljIGNvc2luZSBvZiB4LlxcXCJ9LGRlZ3JlZXM6eyRtZXRoOmZ1bmN0aW9uIGRlZ3JlZXMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicmFkXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPTE4MC9hKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSByYWRpYW5zIHRvIGRlZ3JlZXMuXFxcIn0sZXJmOnskbWV0aDpmdW5jdGlvbiBlcmYoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZigpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJFcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGVyZmM6eyRtZXRoOmZ1bmN0aW9uIGVyZmMoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmVyZmMoKSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiQ29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBhdCB4LlxcXCJ9LGV4cDp7JG1ldGg6ZnVuY3Rpb24gZXhwKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2xldCBiPWEudjtpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIGImJihiPWEubmIkZmxvYXQoKS52KSxiPT0xLzB8fGI9PS1JbmZpbml0eXx8aXNOYU4oYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhmKGIpKTtjb25zdCBjPWYoYik7aWYoIWlzRmluaXRlKGMpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiB4LlxcXCJ9LGV4cG0xOnskbWV0aDpmdW5jdGlvbiBleHBtMShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKC43PmsoYikpe2NvbnN0IGE9ZihiKTtpZigxPT1hKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYik7ZWxzZXtjb25zdCBjPShhLTEpKmIvZShhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpfX1lbHNle2NvbnN0IGE9ZihiKS0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSl9fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGV4cCh4KS0xLlxcXFxuXFxcXG5UaGlzIGZ1bmN0aW9uIGF2b2lkcyB0aGUgbG9zcyBvZiBwcmVjaXNpb24gaW52b2x2ZWQgaW4gdGhlIGRpcmVjdCBldmFsdWF0aW9uIG9mIGV4cCh4KS0xIGZvciBzbWFsbCB4LlxcXCJ9LGZhYnM6eyRtZXRoOmZ1bmN0aW9uIGZhYnMoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9YS52O3JldHVybiBKU0JJLl9faXNCaWdJbnQoYikmJihiPWEubmIkZmxvYXQoKS52KSxiPWsoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZmxvYXQgeC5cXFwifSxmYWN0b3JpYWw6eyRtZXRoOmZ1bmN0aW9uIGZhY3RvcmlhbChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYj1Tay5idWlsdGluLmFzbnVtJChhKTtpZihhPWooYiksYSE9Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJmYWN0b3JpYWwoKSBvbmx5IGFjY2VwdHMgaW50ZWdyYWwgdmFsdWVzXFxcIik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSBudW1iZXJzXFxcIik7bGV0IGM9MTtmb3IobGV0IGI9MjtiPD1hJiZiPD1vO2IrKyljKj1iO2lmKGE8PW8pcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyk7Yz1KU0JJLkJpZ0ludChjKTtmb3IobGV0IGI9MTk7Yjw9YTtiKyspYz1KU0JJLm11bHRpcGx5KGMsSlNCSS5CaWdJbnQoYikpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiRmluZCB4IS5cXFxcblxcXFxuUmFpc2UgYSBWYWx1ZUVycm9yIGlmIHggaXMgbmVnYXRpdmUgb3Igbm9uLWludGVncmFsLlxcXCJ9LGZsb29yOnskbWV0aDpmdW5jdGlvbiBmbG9vcihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suX19mdXR1cmVfXy5jZWlsX2Zsb29yX2ludD9uZXcgU2suYnVpbHRpbi5pbnRfKGooU2suYnVpbHRpbi5hc251bSQoYSkpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oaihTay5idWlsdGluLmFzbnVtJChhKSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmbG9vciBvZiB4IGFzIGFuIEludGVncmFsLlxcXFxuXFxcXG5UaGlzIGlzIHRoZSBsYXJnZXN0IGludGVnZXIgPD0geC5cXFwifSxmbW9kOnskbWV0aDpmdW5jdGlvbiBmbW9kKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGM9YS52LGQ9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9Yi5uYiRmbG9hdCgpLnYpLChkPT0xLzB8fGQ9PS1JbmZpbml0eSkmJmlzRmluaXRlKGMpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyk7Y29uc3QgZT1jJWQ7aWYoaXNOYU4oZSkmJiFpc05hTihjKSYmIWlzTmFOKGQpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIm1hdGggZG9tYWluIGVycm9yXFxcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhlKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gZm1vZCh4LCB5KSwgYWNjb3JkaW5nIHRvIHBsYXRmb3JtIEMuXFxcXG5cXFxcbnggJSB5IG1heSBkaWZmZXIuXFxcIn0sZnJleHA6eyRtZXRoOmZ1bmN0aW9uIGZyZXhwKGEpe3ZhciBiPU1hdGgubWF4O1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGM9U2suYnVpbHRpbi5hc251bSQoYSksZD1bYywwXTtpZigwIT09YyYmaShjKSl7Y29uc3QgYT1rKGMpO2xldCBlPWIoLTEwMjMsaihoKGEpKSsxKSxmPWEqZygyLC1lKTtmb3IoOy41PmY7KWYqPTIsZS0tO2Zvcig7MTw9ZjspZio9LjUsZSsrOzA+YyYmKGY9LWYpLGRbMF09ZixkWzFdPWV9cmV0dXJuIGRbMF09bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGRbMF0pLGRbMV09bmV3IFNrLmJ1aWx0aW4uaW50XyhkWzFdKSxuZXcgU2suYnVpbHRpbi50dXBsZShkKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgbWFudGlzc2EgYW5kIGV4cG9uZW50IG9mIHgsIGFzIHBhaXIgKG0sIGUpLlxcXFxuXFxcXG5tIGlzIGEgZmxvYXQgYW5kIGUgaXMgYW4gaW50LCBzdWNoIHRoYXQgeCA9IG0gKiAyLioqZS5cXFxcbklmIHggaXMgMCwgbSBhbmQgZSBhcmUgYm90aCAwLiAgRWxzZSAwLjUgPD0gYWJzKG0pIDwgMS4wLlxcXCJ9LGZzdW06eyRtZXRoOmZ1bmN0aW9uIGZzdW0oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1xcXCInIG9iamVjdCBpcyBub3QgaXRlcmFibGVcXFwiKTtsZXQgYj1bXTthPVNrLmFic3RyLml0ZXIoYSk7bGV0IGMsZCxlO2ZvcihsZXQgZj1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWEudHAkaXRlcm5leHQoKSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiXFxcIixcXFwicmVhbCBudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoZikpLGM9MDtsZXQgYT1mLnY7XFxcIm51bWJlclxcXCIhPXR5cGVvZiBhJiYoYT1mLm5iJGZsb2F0KCkudiksZj1hO2ZvcihsZXQgYSxnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKXtpZihhPWJbZ10sayhmKTxrKGEpKXtsZXQgYj1mO2Y9YSxhPWJ9ZD1mK2EsZT1hLShkLWYpLGUmJihiW2NdPWUsYysrKSxmPWR9Yj1iLnNsaWNlKDAsYykuY29uY2F0KFtmXSl9Y29uc3QgZj1iLnJlZHVjZShmdW5jdGlvbihjLGEpe3JldHVybiBjK2F9LDApO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHNlcSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBhbiBhY2N1cmF0ZSBmbG9hdGluZyBwb2ludCBzdW0gb2YgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBzZXEuXFxcXG5cXFxcbkFzc3VtZXMgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy5cXFwifSxnYW1tYTp7JG1ldGg6ZnVuY3Rpb24gZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmdhbW1hKCkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIkdhbW1hIGZ1bmN0aW9uIGF0IHguXFxcIn0sZ2NkOnskbWV0aDpmdW5jdGlvbiBnY2QoYyxhKXtmdW5jdGlvbiBfZ2NkKGMsYSl7cmV0dXJuIDA9PWE/YzpfZ2NkKGEsYyVhKX1mdW5jdGlvbiBfYmlnZ2NkKGMsYSl7cmV0dXJuIEpTQkkuZXF1YWwoYSxKU0JJLl9fWkVSTyk/YzpfYmlnZ2NkKGEsSlNCSS5yZW1haW5kZXIoYyxhKSl9U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYVxcXCIsXFxcImludGVnZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQoYykpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImJcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGEpKTtsZXQgYixkPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuXFxcIm51bWJlclxcXCI9PXR5cGVvZiBkJiZcXFwibnVtYmVyXFxcIj09dHlwZW9mIGU/KGQ9ayhkKSxlPWsoZSksYj1fZ2NkKGQsZSksYj0wPmI/LWI6YixuZXcgU2suYnVpbHRpbi5pbnRfKGIpKTooZD1KU0JJLkJpZ0ludChkKSxlPUpTQkkuQmlnSW50KGUpLGI9X2JpZ2djZChkLGUpLEpTQkkubGVzc1RoYW4oYixKU0JJLl9fWkVSTykmJihiPUpTQkkubXVsdGlwbHkoYixKU0JJLkJpZ0ludCgtMSkpKSxuZXcgU2suYnVpbHRpbi5pbnRfKGIudG9TdHJpbmcoKSkpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgeSwgLylcXFwiLCRkb2M6XFxcImdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIHggYW5kIHlcXFwifSxoeXBvdDp7JG1ldGg6ZnVuY3Rpb24gaHlwb3QoYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihjKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKGEqYStjKmMpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIHksIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSwgc3FydCh4KnggKyB5KnkpLlxcXCJ9LGlzY2xvc2U6eyRtZXRoOmZ1bmN0aW9uIGlzY2xvc2UoYyxkKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImlzY2xvc2VcXFwiLGMsMiwyKSxyZWxfYWJzX3ZhbHM9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXFxcImlzY2xvc2VcXFwiLFtcXFwicmVsX3RvbFxcXCIsXFxcImFic190b2xcXFwiXSxbXSxkLFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMWUtOSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApXSk7Y29uc3QgZT1jWzBdLGE9Y1sxXSxiPXJlbF9hYnNfdmFsc1swXSxmPXJlbF9hYnNfdmFsc1sxXTtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGUpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJiXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyZWxfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJhYnNfdG9sXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKTtjb25zdCBnPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGg9U2suYnVpbHRpbi5hc251bSQoYSksaT1Tay5idWlsdGluLmFzbnVtJChiKSxqPVNrLmJ1aWx0aW4uYXNudW0kKGYpO2lmKDA+aXx8MD5qKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcInRvbGVyYW5jZXMgbXVzdCBiZSBub24tbmVnYXRpdmVcXFwiKTtpZihnPT1oKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoZz09MS8wfHxnPT0tSW5maW5pdHl8fGg9PTEvMHx8aD09LUluZmluaXR5KXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2NvbnN0IGw9ayhoLWcpLG09bDw9ayhpKmgpfHxsPD1rKGkqZyl8fGw8PWo7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wobSl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgLywgYSwgYiwgKiwgcmVsX3RvbD0xZS0wOSwgYWJzX3RvbD0wLjApXFxcIiwkZG9jOlxcXCJEZXRlcm1pbmUgd2hldGhlciB0d28gZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgY2xvc2UgaW4gdmFsdWUuXFxcXG5cXFxcbiAgcmVsX3RvbFxcXFxuICAgIG1heGltdW0gZGlmZmVyZW5jZSBmb3IgYmVpbmcgY29uc2lkZXJlZCBcXFxcXFxcImNsb3NlXFxcXFxcXCIsIHJlbGF0aXZlIHRvIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG4gIGFic190b2xcXFxcbiAgICBtYXhpbXVtIGRpZmZlcmVuY2UgZm9yIGJlaW5nIGNvbnNpZGVyZWQgXFxcXFxcXCJjbG9zZVxcXFxcXFwiLCByZWdhcmRsZXNzIG9mIHRoZVxcXFxuICAgIG1hZ25pdHVkZSBvZiB0aGUgaW5wdXQgdmFsdWVzXFxcXG5cXFxcblJldHVybiBUcnVlIGlmIGEgaXMgY2xvc2UgaW4gdmFsdWUgdG8gYiwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFxcblxcXFxuRm9yIHRoZSB2YWx1ZXMgdG8gYmUgY29uc2lkZXJlZCBjbG9zZSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtXFxcXG5tdXN0IGJlIHNtYWxsZXIgdGhhbiBhdCBsZWFzdCBvbmUgb2YgdGhlIHRvbGVyYW5jZXMuXFxcXG5cXFxcbi1pbmYsIGluZiBhbmQgTmFOIGJlaGF2ZSBzaW1pbGFybHkgdG8gdGhlIElFRUUgNzU0IFN0YW5kYXJkLiAgVGhhdFxcXFxuaXMsIE5hTiBpcyBub3QgY2xvc2UgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLiAgaW5mIGFuZCAtaW5mIGFyZVxcXFxub25seSBjbG9zZSB0byB0aGVtc2VsdmVzLlxcXCJ9LGlzZmluaXRlOnskbWV0aDpmdW5jdGlvbiBpc2Zpbml0ZShhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBiPVNrLmJ1aWx0aW4uYXNudW0kKGEpO3JldHVybiBTay5idWlsdGluLmNoZWNrSW50KGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDppc0Zpbml0ZShiKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiBUcnVlIGlmIHggaXMgbmVpdGhlciBhbiBpbmZpbml0eSBub3IgYSBOYU4sIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNpbmY6eyRtZXRoOmZ1bmN0aW9uIGlzaW5mKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tJbnQoYSk/U2suYnVpbHRpbi5ib29sLmZhbHNlJDppc0Zpbml0ZShiKXx8aXNOYU4oYik/U2suYnVpbHRpbi5ib29sLmZhbHNlJDpTay5idWlsdGluLmJvb2wudHJ1ZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiB4IGlzIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW5maW5pdHksIGFuZCBGYWxzZSBvdGhlcndpc2UuXFxcIn0saXNuYW46eyRtZXRoOmZ1bmN0aW9uIGlzbmFuKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIGlzTmFOKGIpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIFRydWUgaWYgeCBpcyBhIE5hTiAobm90IGEgbnVtYmVyKSwgYW5kIEZhbHNlIG90aGVyd2lzZS5cXFwifSxsZGV4cDp7JG1ldGg6ZnVuY3Rpb24gbGRleHAoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJpXFxcIixcXFwiaW50ZWdlclxcXCIsU2suYnVpbHRpbi5jaGVja0ludChiKSk7bGV0IGM9YS52O1xcXCJudW1iZXJcXFwiIT10eXBlb2YgYyYmKGM9YS5uYiRmbG9hdCgpLnYpO2NvbnN0IGQ9U2suYnVpbHRpbi5hc251bSQoYik7aWYoYz09MS8wfHxjPT0tSW5maW5pdHl8fDA9PWN8fGlzTmFOKGMpKXJldHVybiBhO2NvbnN0IGU9YypnKDIsZCk7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXFxcIm1hdGggcmFuZ2UgZXJyb3JcXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGUpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgaSwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB4ICogKDIqKmkpLlxcXFxuXFxcXG5UaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mIGZyZXhwKCkuXFxcIn0sbGdhbW1hOnskbWV0aDpmdW5jdGlvbiBsZ2FtbWEoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtYXRoLmxnYW1tYSgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJOYXR1cmFsIGxvZ2FyaXRobSBvZiBhYnNvbHV0ZSB2YWx1ZSBvZiBHYW1tYSBmdW5jdGlvbiBhdCB4LlxcXCJ9LGxvZzp7JG1ldGg6ZnVuY3Rpb24gbG9nKGEsYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGYsZyxoPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZih2b2lkIDA9PT1iP2Y9ZDooU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiYmFzZVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksZj1Tay5idWlsdGluLmFzbnVtJChiKSksMD49Zil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxoPGMpZz1lKGgpL2UoZik7ZWxzZXtoPW5ldyBTay5idWlsdGluLnN0cihhKS4kanNzdHIoKTtjb25zdCBiPWgubGVuZ3RoLGM9cGFyc2VGbG9hdChcXFwiMC5cXFwiK2gpO2c9KGIqZSgxMCkrZShjKSkvZShmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGcpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcXFwibG9nKHgsIFtiYXNlPWVdKVxcXFxuUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgeCB0byB0aGUgZ2l2ZW4gYmFzZS5cXFxcblxcXFxuSWYgdGhlIGJhc2Ugbm90IHNwZWNpZmllZCwgcmV0dXJucyB0aGUgbmF0dXJhbCBsb2dhcml0aG0gKGJhc2UgZSkgb2YgeC5cXFwifSxsb2cxMDp7JG1ldGg6ZnVuY3Rpb24gbG9nMTAoYSl7dmFyIGI9TWF0aC5sb2cxMDtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgZCxlPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja0Zsb2F0KGEpfHxlPGMpZD1iKGUpO2Vsc2V7ZT1uZXcgU2suYnVpbHRpbi5zdHIoYSkuJGpzc3RyKCk7Y29uc3QgYz1lLmxlbmd0aCxmPXBhcnNlRmxvYXQoXFxcIjAuXFxcIitlKTtkPWMrYihmKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LGxvZzFwOnskbWV0aDpmdW5jdGlvbiBsb2cxcChhKXt2YXIgYj1OdW1iZXIuRVBTSUxPTjtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtsZXQgYz1hLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBjJiYoYz1hLm5iJGZsb2F0KCkudiksLTE+PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNle2lmKDA9PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhjKTtpZihrKGMpPGIvMilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGMpO2lmKC0uNTw9YyYmMT49Yyl7Y29uc3QgYT0xK2MsYj1lKGEpLShhLTEtYykvYTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpfWVsc2V7Y29uc3QgYT1lKDErYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiAxK3ggKGJhc2UgZSkuXFxcXG5cXFxcblRoZSByZXN1bHQgaXMgY29tcHV0ZWQgaW4gYSB3YXkgd2hpY2ggaXMgYWNjdXJhdGUgZm9yIHggbmVhciB6ZXJvLlxcXCJ9LGxvZzI6eyRtZXRoOmZ1bmN0aW9uIGxvZzIoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGIsZD1Tay5idWlsdGluLmFzbnVtJChhKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8ZDxjKWI9aChkKTtlbHNle2Q9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpLiRqc3N0cigpO2NvbnN0IGM9ZC5sZW5ndGgsZT1wYXJzZUZsb2F0KFxcXCIwLlxcXCIrZCk7Yj1jKmgoMTApK2goZSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgYmFzZSAyIGxvZ2FyaXRobSBvZiB4LlxcXCJ9LG1vZGY6eyRtZXRoOmZ1bmN0aW9uIG1vZGYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7bGV0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoIWlzRmluaXRlKGIpKXtpZihiPT0xLzApcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5mbG9hdF8oMCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIpXSk7aWYoYj09LUluZmluaXR5KXJldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0wKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKTtpZihpc05hTihiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhiKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYildKX1jb25zdCBjPW4oYik7Yj1rKGIpO2NvbnN0IGU9YypqKGIpLGY9YyooYi1qKGIpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhmKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSldKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgZnJhY3Rpb25hbCBhbmQgaW50ZWdlciBwYXJ0cyBvZiB4LlxcXFxuXFxcXG5Cb3RoIHJlc3VsdHMgY2FycnkgdGhlIHNpZ24gb2YgeCBhbmQgYXJlIGZsb2F0cy5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhhLGIpe3ZhciBjPU51bWJlci5pc0ludGVnZXI7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwieVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSk7bGV0IGQ9YS52LGU9Yi52O2lmKFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZCYmKGQ9YS5uYiRmbG9hdCgpLnYpLFxcXCJudW1iZXJcXFwiIT10eXBlb2YgZSYmKGU9Yi5uYiRmbG9hdCgpLnYpLDA9PWQmJjA+ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2Vsc2V7aWYoMT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDEpO2lmKGkoZCkmJmkoZSkmJjA+ZCYmIWMoZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtlbHNlIGlmKC0xPT1kJiYoZT09LUluZmluaXR5fHxlPT0xLzApKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9Y29uc3QgZj1nKGQsZSk7aWYoIWkoZCl8fCFpKGUpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZik7aWYoZj09MS8wfHxmPT0tSW5maW5pdHkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcXFwibWF0aCByYW5nZSBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHgqKnkgKHggdG8gdGhlIHBvd2VyIG9mIHkpLlxcXCJ9LHJhZGlhbnM6eyRtZXRoOmZ1bmN0aW9uIHJhZGlhbnMoYil7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVnXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtjb25zdCBjPWEvMTgwKlNrLmJ1aWx0aW4uYXNudW0kKGIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJDb252ZXJ0IGFuZ2xlIHggZnJvbSBkZWdyZWVzIHRvIHJhZGlhbnMuXFxcIn0scmVtYWluZGVyOnskbWV0aDpmdW5jdGlvbiByZW1haW5kZXIoYSxiKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ5XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKTtsZXQgZD1hLnYsZT1iLnY7aWYoXFxcIm51bWJlclxcXCIhPXR5cGVvZiBkJiYoZD1hLm5iJGZsb2F0KCkudiksXFxcIm51bWJlclxcXCIhPXR5cGVvZiBlJiYoZT1iLm5iJGZsb2F0KCkudiksaXNGaW5pdGUoZCkmJmlzRmluaXRlKGUpKXtsZXQgYSxiLGYsYyxnO2lmKDA9PWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibWF0aCBkb21haW4gZXJyb3JcXFwiKTtpZihhPWsoZCksYj1rKGUpLGM9YSViLGY9Yi1jLGM8ZilnPWM7ZWxzZSBpZihjPmYpZz0tZjtlbHNle2lmKGMhPWYpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3I7Zz1jLTIqKC41KihhLWMpJWIpfXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8obihkKSpnKX1pZihpc05hTihkKSlyZXR1cm4gYTtpZihpc05hTihlKSlyZXR1cm4gYjtpZihkPT0xLzB8fGQ9PS1JbmZpbml0eSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO2lmKGUhPTEvMCYmZSE9LUluZmluaXR5KXRocm93IG5ldyBTay5idWlsdGluLkFzc2VydGlvbkVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCB4LCB5LCAvKVxcXCIsJGRvYzpcXFwiRGlmZmVyZW5jZSBiZXR3ZWVuIHggYW5kIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcblxcXFxuUmV0dXJuIHggLSBuKnkgd2hlcmUgbip5IGlzIHRoZSBjbG9zZXN0IGludGVnZXIgbXVsdGlwbGUgb2YgeS5cXFxcbkluIHRoZSBjYXNlIHdoZXJlIHggaXMgZXhhY3RseSBoYWxmd2F5IGJldHdlZW4gdHdvIG11bHRpcGxlcyBvZlxcXFxueSwgdGhlIG5lYXJlc3QgZXZlbiB2YWx1ZSBvZiBuIGlzIHVzZWQuIFRoZSByZXN1bHQgaXMgYWx3YXlzIGV4YWN0LlxcXCJ9LHNpbjp7JG1ldGg6ZnVuY3Rpb24gc2luKGEpe3ZhciBiPU1hdGguc2luO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJyYWRcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLG5ldyBTay5idWlsdGluLmZsb2F0XyhiKFNrLmJ1aWx0aW4uYXNudW0kKGEpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNpbmUgb2YgeCAobWVhc3VyZWQgaW4gcmFkaWFucykuXFxcIn0sc2luaDp7JG1ldGg6ZnVuY3Rpb24gc2luaChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2NvbnN0IGI9ZyhkLGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oKGItMS9iKS8yKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyBzaW5lIG9mIHguXFxcIn0sc3FydDp7JG1ldGg6ZnVuY3Rpb24gc3FydChhKXtTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKTtjb25zdCBjPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJtYXRoIGRvbWFpbiBlcnJvclxcXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIHgsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIHguXFxcIn0sdGFuOnskbWV0aDpmdW5jdGlvbiB0YW4oYSl7dmFyIGI9TWF0aC50YW47cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInJhZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGIoU2suYnVpbHRpbi5hc251bSQoYSkpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgdGFuZ2VudCBvZiB4IChtZWFzdXJlZCBpbiByYWRpYW5zKS5cXFwifSx0YW5oOnskbWV0aDpmdW5jdGlvbiB0YW5oKGEpe1NrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpO2NvbnN0IGI9U2suYnVpbHRpbi5hc251bSQoYSk7aWYoMD09PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhiKTtjb25zdCBjPWcoZCxiKSxlPTEvYztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKChjLWUpLzIvKChjK2UpLzIpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlJldHVybiB0aGUgaHlwZXJib2xpYyB0YW5nZW50IG9mIHguXFxcIn0sdHJ1bmM6eyRtZXRoOmZ1bmN0aW9uIHRydW5jKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJ4XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLmNoZWNrSW50KGEpP2E6bmV3IFNrLmJ1aWx0aW4uaW50XygwfFNrLmJ1aWx0aW4uYXNudW0kKGEpKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgeCwgLylcXFwiLCRkb2M6XFxcIlRydW5jYXRlcyB0aGUgUmVhbCB4IHRvIHRoZSBuZWFyZXN0IEludGVncmFsIHRvd2FyZCAwLlxcXFxuXFxcXG5Vc2VzIHRoZSBfX3RydW5jX18gbWFnaWMgbWV0aG9kLlxcXCJ9fSksbH07XCIsXCJzcmMvbGliL21kNS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWQ1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWhsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1obGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbWltZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtaW1ldG9vbHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9taW1ldHlwZXMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm1pbWV0eXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL21pbWlmeS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibWltaWZ5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbW9kdWxlZmluZGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtb2R1bGVmaW5kZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9tdWx0aWZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIm11bHRpZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibXVsdGlwcm9jZXNzaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkdW1teSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL211dGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJtdXRleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldHJjLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJuZXRyYyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL25ldy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibmV3IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbm50cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibm50cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL250cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnRwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvbnR1cmwycGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwibnR1cmwycGF0aCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL251bWJlcnMucHlcIjpcIk51bWJlciA9IChpbnQsIGZsb2F0LCBjb21wbGV4KVxcbkludGVncmFsID0gaW50XFxuQ29tcGxleCA9IGNvbXBsZXhcXG5cIixcInNyYy9saWIvb3Bjb2RlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvcGNvZGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcGVyYXRvci5qc1wiOlwiZnVuY3Rpb24gJGJ1aWx0aW5tb2R1bGUoKXtyZXR1cm4gb3BlcmF0b3I9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwib3BlcmF0b3JcXFwiKSxfX2RvY19fOm5ldyBTay5idWlsdGluLnN0cihcXFwiT3BlcmF0b3IgaW50ZXJmYWNlLlxcXFxuXFxcXG5UaGlzIG1vZHVsZSBleHBvcnRzIGEgc2V0IG9mIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBqYXZhc2NyaXB0IGNvcnJlc3BvbmRpbmdcXFxcbnRvIHRoZSBpbnRyaW5zaWMgb3BlcmF0b3JzIG9mIFB5dGhvbi4gIEZvciBleGFtcGxlLCBvcGVyYXRvci5hZGQoeCwgeSlcXFxcbmlzIGVxdWl2YWxlbnQgdG8gdGhlIGV4cHJlc3Npb24geCt5LiAgVGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSB0aG9zZVxcXFxudXNlZCBmb3Igc3BlY2lhbCBtZXRob2RzOyB2YXJpYW50cyB3aXRob3V0IGxlYWRpbmcgYW5kIHRyYWlsaW5nXFxcXG4nX18nIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS5cXFwiKSxfX2FsbF9fOm5ldyBTay5idWlsdGluLmxpc3QoW1xcXCJhYnNcXFwiLFxcXCJhZGRcXFwiLFxcXCJhbmRfXFxcIixcXFwiYXR0cmdldHRlclxcXCIsXFxcImNvbmNhdFxcXCIsXFxcImNvbnRhaW5zXFxcIixcXFwiY291bnRPZlxcXCIsXFxcImRlbGl0ZW1cXFwiLFxcXCJlcVxcXCIsXFxcImZsb29yZGl2XFxcIixcXFwiZ2VcXFwiLFxcXCJnZXRpdGVtXFxcIixcXFwiZ3RcXFwiLFxcXCJpYWRkXFxcIixcXFwiaWFuZFxcXCIsXFxcImljb25jYXRcXFwiLFxcXCJpZmxvb3JkaXZcXFwiLFxcXCJpbHNoaWZ0XFxcIixcXFwiaW1hdG11bFxcXCIsXFxcImltb2RcXFwiLFxcXCJpbXVsXFxcIixcXFwiaW5kZXhcXFwiLFxcXCJpbmRleE9mXFxcIixcXFwiaW52XFxcIixcXFwiaW52ZXJ0XFxcIixcXFwiaW9yXFxcIixcXFwiaXBvd1xcXCIsXFxcImlyc2hpZnRcXFwiLFxcXCJpc19cXFwiLFxcXCJpc19ub3RcXFwiLFxcXCJpc3ViXFxcIixcXFwiaXRlbWdldHRlclxcXCIsXFxcIml0cnVlZGl2XFxcIixcXFwiaXhvclxcXCIsXFxcImxlXFxcIixcXFwibGVuZ3RoX2hpbnRcXFwiLFxcXCJsc2hpZnRcXFwiLFxcXCJsdFxcXCIsXFxcIm1hdG11bFxcXCIsXFxcIm1ldGhvZGNhbGxlclxcXCIsXFxcIm1vZFxcXCIsXFxcIm11bFxcXCIsXFxcIm5lXFxcIixcXFwibmVnXFxcIixcXFwibm90X1xcXCIsXFxcIm9yX1xcXCIsXFxcInBvc1xcXCIsXFxcInBvd1xcXCIsXFxcInJzaGlmdFxcXCIsXFxcInNldGl0ZW1cXFwiLFxcXCJzdWJcXFwiLFxcXCJ0cnVlZGl2XFxcIixcXFwidHJ1dGhcXFwiLFxcXCJ4b3JcXFwiXS5tYXAoYT0+bmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSl9LG9wZXJhdG9yLml0ZW1nZXR0ZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IuaXRlbWdldHRlclxcXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uIGl0ZW1nZXR0ZXIoYSl7dGhpcy5pdGVtcz1hLHRoaXMub25laXRlbT0xPT09YS5sZW5ndGgsdGhpcy5pdGVtPWFbMF0sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7cmV0dXJuIFNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxKSxuZXcgb3BlcmF0b3IuaXRlbWdldHRlcihhKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIml0ZW1nZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiaXRlbWdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtyZXR1cm4gdGhpcy5vbmVpdGVtP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYyx0aGlzLml0ZW0sITApOm5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMuaXRlbXMubWFwKGE9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxhKSkpfSx0cCRkb2M6XFxcIlJldHVybiBhIGNhbGxhYmxlIG9iamVjdCB0aGF0IGZldGNoZXMgdGhlIGdpdmVuIGl0ZW0ocykgZnJvbSBpdHMgb3BlcmFuZC5cXFxcbiAgICAgICAgICAgIEFmdGVyIGYgPSBpdGVtZ2V0dGVyKDIpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgclsyXS5cXFxcbiAgICAgICAgICAgIEFmdGVyIGcgPSBpdGVtZ2V0dGVyKDIsIDUsIDMpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHJbMl0sIHJbNV0sIHJbM10pXFxcIiwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudHAkbmFtZStcXFwiKC4uLilcXFwiKTt0aGlzLmluJHJlcHI9ITA7Y29uc3QgYT10aGlzLnRwJG5hbWUrXFxcIihcXFwiK3RoaXMuaXRlbXMubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiO3JldHVybiB0aGlzLmluJHJlcHI9ITEsYX19fSksb3BlcmF0b3IuYXR0cmdldHRlcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFxcXCJvcGVyYXRvci5hdHRyZ2V0dGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gYXR0cmdldHRlcihhKXt0aGlzLmF0dHJzPWEsdGhpcy5vbmVhdHRyPTE9PT1hLmxlbmd0aCx0aGlzLmF0dHI9YVswXSx0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFxcXCJhdHRyZ2V0dGVyXFxcIixiKSxTay5hYnN0ci5jaGVja0FyZ3NMZW4oXFxcImF0dHJnZXR0ZXJcXFwiLGEsMSk7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgYj1hW2RdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Iudi5pbmNsdWRlcyhcXFwiLlxcXCIpP2MucHVzaChiLiRqc3N0cigpLnNwbGl0KFxcXCIuXFxcIikubWFwKGE9Pm5ldyBTay5idWlsdGluLnN0cihhKSkpOmMucHVzaChbYl0pfXJldHVybiBuZXcgb3BlcmF0b3IuYXR0cmdldHRlcihjKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcImF0dHJnZXR0ZXJcXFwiLGIpLFNrLmFic3RyLmNoZWNrQXJnc0xlbihcXFwiYXR0cmdldHRlclxcXCIsYSwxLDEpO2NvbnN0IGM9YVswXTtpZih0aGlzLm9uZWF0dHIpcmV0dXJuIHRoaXMuYXR0ci5yZWR1Y2UoKGEsYik9PlNrLmFic3RyLmdhdHRyKGEsYiksYyk7Y29uc3QgZD10aGlzLmF0dHJzLm1hcChhPT5hLnJlZHVjZSgoYSxiKT0+U2suYWJzdHIuZ2F0dHIoYSxiKSxjKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGQpfSx0cCRkb2M6XFxcImF0dHJnZXR0ZXIoYXR0ciwgLi4uKSAtLT4gYXR0cmdldHRlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgZmV0Y2hlcyB0aGUgZ2l2ZW4gYXR0cmlidXRlKHMpIGZyb20gaXRzIG9wZXJhbmQuXFxcXG5BZnRlciBmID0gYXR0cmdldHRlcignbmFtZScpLCB0aGUgY2FsbCBmKHIpIHJldHVybnMgci5uYW1lLlxcXFxuQWZ0ZXIgZyA9IGF0dHJnZXR0ZXIoJ25hbWUnLCAnZGF0ZScpLCB0aGUgY2FsbCBnKHIpIHJldHVybnMgKHIubmFtZSwgci5kYXRlKS5cXFxcbkFmdGVyIGggPSBhdHRyZ2V0dGVyKCduYW1lLmZpcnN0JywgJ25hbWUubGFzdCcpLCB0aGUgY2FsbCBoKHIpIHJldHVybnNcXFxcbihyLm5hbWUuZmlyc3QsIHIubmFtZS5sYXN0KS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudHAkbmFtZStcXFwiKFxcXCIrdGhpcy5pdGVtcy5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSkuam9pbihcXFwiLCBcXFwiKStcXFwiKVxcXCI7cmV0dXJuIHRoaXMuaW4kcmVwcj0hMSxhfX19KSxvcGVyYXRvci5tZXRob2RjYWxsZXI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcXFwib3BlcmF0b3IubWV0aG9kY2FsbGVyXFxcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24gbWV0aG9kY2FsbGVyKGEsYixjKXt0aGlzLiRuYW1lPWEsdGhpcy5hcmdzPWIsdGhpcy5rd2FyZ3M9Y3x8W10sdGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSk7Y29uc3QgYz1hWzBdO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO3JldHVybiBuZXcgb3BlcmF0b3IubWV0aG9kY2FsbGVyKGMsYS5zbGljZSgxKSxiKX0sdHAkY2FsbChhLGIpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXFxcIm1ldGhvZGNhbGxlclxcXCIsYiksU2suYWJzdHIuY2hlY2tBcmdzTGVuKFxcXCJtZXRob2RjYWxsZXJcXFwiLGEsMSwxKTtjb25zdCBjPWFbMF07cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLmdhdHRyKGMsdGhpcy4kbmFtZSwhMCksYT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsdGhpcy5hcmdzLHRoaXMua3dhcmdzKSl9LHRwJGRvYzpcXFwibWV0aG9kY2FsbGVyKG5hbWUsIC4uLikgLS0+IG1ldGhvZGNhbGxlciBvYmplY3RcXFxcblxcXFxuUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0IHRoYXQgY2FsbHMgdGhlIGdpdmVuIG1ldGhvZCBvbiBpdHMgb3BlcmFuZC5cXFxcbkFmdGVyIGYgPSBtZXRob2RjYWxsZXIoJ25hbWUnKSwgdGhlIGNhbGwgZihyKSByZXR1cm5zIHIubmFtZSgpLlxcXFxuQWZ0ZXIgZyA9IG1ldGhvZGNhbGxlcignbmFtZScsICdkYXRlJywgZm9vPTEpLCB0aGUgY2FsbCBnKHIpIHJldHVybnNcXFxcbnIubmFtZSgnZGF0ZScsIGZvbz0xKS5cXFwiLCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy50cCRuYW1lK1xcXCIoLi4uKVxcXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1bU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLiRuYW1lKSwuLi50aGlzLmFyZ3MubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpXTtmb3IobGV0IGI9MDtiPHRoaXMua3dhcmdzLmxlbmd0aDtiKz0yKWEucHVzaCh0aGlzLmt3YXJnc1tiXStcXFwiPVxcXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmt3YXJnc1tiKzFdKSk7cmV0dXJuIGE9dGhpcy50cCRuYW1lK1xcXCIoXFxcIithLmpvaW4oXFxcIiwgXFxcIikrXFxcIilcXFwiLHRoaXMuaW4kcmVwcj0hMSxhfX19KSxTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXFxcIm9wZXJhdG9yXFxcIixvcGVyYXRvcix7bHQ6eyRtZXRoOmZ1bmN0aW9uIGx0KGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJMdFxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPCBiLlxcXCJ9LGxlOnskbWV0aDpmdW5jdGlvbiBsZShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiTHRFXFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA8PSBiLlxcXCJ9LGVxOnskbWV0aDpmdW5jdGlvbiBlcShjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiRXFcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID09IGIuXFxcIn0sbmU6eyRtZXRoOmZ1bmN0aW9uIG5lKGMsYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbChTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFxcXCJOb3RFcVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgIT0gYi5cXFwifSxnZTp7JG1ldGg6ZnVuY3Rpb24gZ2UoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0RVxcXCIpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPj0gYi5cXFwifSxndDp7JG1ldGg6ZnVuY3Rpb24gZ3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIkd0XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+IGIuXFxcIn0sbm90Xzp7JG1ldGg6ZnVuY3Rpb24gbm90XyhhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyVW5hcnlPcChhLFxcXCJOb3RcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgbm90IGEuXFxcIn0sdHJ1dGg6eyRtZXRoOmZ1bmN0aW9uIHRydXRoKGEpe3JldHVybiBTay5idWlsdGluLmJvb2woYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gVHJ1ZSBpZiBhIGlzIHRydWUsIEZhbHNlIG90aGVyd2lzZS5cXFwifSxpc186eyRtZXRoOmZ1bmN0aW9uIGlzXyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcXFwiSXNcXFwiKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIGlzIGIuXFxcIn0saXNfbm90OnskbWV0aDpmdW5jdGlvbiBpc19ub3QoYyxhKXtyZXR1cm4gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChjLGEsXFxcIklzTm90XFxcIikpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSBpcyBub3QgYi5cXFwifSxhYnM6eyRtZXRoOmZ1bmN0aW9uIGFicyhhKXtyZXR1cm4gU2suYnVpbHRpbi5hYnMoYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGFicyhhKS5cXFwifSxhZGQ6eyRtZXRoOmZ1bmN0aW9uIGFkZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArIGIuXFxcIn0sYW5kXzp7JG1ldGg6ZnVuY3Rpb24gYW5kXyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkJpdEFuZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAmIGIuXFxcIn0sZmxvb3JkaXY6eyRtZXRoOmZ1bmN0aW9uIGZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiRmxvb3JEaXZcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLy8gYi5cXFwifSxpbmRleDp7JG1ldGg6ZnVuY3Rpb24gaW5kZXgoYil7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYikpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhLl9faW5kZXhfXygpXFxcIn0saW52OnskbWV0aDpmdW5jdGlvbiBpbnYoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiSW52ZXJ0XFxcIil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIH5hLlxcXCJ9LGludmVydDp7JG1ldGg6ZnVuY3Rpb24gaW52ZXJ0KGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIkludmVydFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgfmEuXFxcIn0sbHNoaWZ0OnskbWV0aDpmdW5jdGlvbiBsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJMU2hpZnRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgPDwgYi5cXFwifSxtb2Q6eyRtZXRoOmZ1bmN0aW9uIG1vZChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1vZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAlIGIuXFxcIn0sbXVsOnskbWV0aDpmdW5jdGlvbiBtdWwoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICogYi5cXFwifSxtYXRtdWw6eyRtZXRoOmZ1bmN0aW9uIG1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIk1hdE11bHRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgQCBiLlxcXCJ9LG5lZzp7JG1ldGg6ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJVbmFyeU9wKGEsXFxcIlVTdWJcXFwiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgLWEuXFxcIn0sb3JfOnskbWV0aDpmdW5jdGlvbiBvcl8oYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRPclxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSB8IGIuXFxcIn0scG9zOnskbWV0aDpmdW5jdGlvbiBwb3MoYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlclVuYXJ5T3AoYSxcXFwiVUFkZFxcXCIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyArYS5cXFwifSxwb3c6eyRtZXRoOmZ1bmN0aW9uIHBvdyhjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKiBiLlxcXCJ9LHJzaGlmdDp7JG1ldGg6ZnVuY3Rpb24gcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlckJpbk9wKGMsYSxcXFwiUlNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhID4+IGIuXFxcIn0sc3ViOnskbWV0aDpmdW5jdGlvbiBzdWIoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJTdWJcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgLSBiLlxcXCJ9LHRydWVkaXY6eyRtZXRoOmZ1bmN0aW9uIGRpdihjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvIGIuXFxcIn0seG9yOnskbWV0aDpmdW5jdGlvbiB4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYyxhLFxcXCJCaXRYb3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgXiBiLlxcXCJ9LGNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gY29uY2F0KGMsYSl7cmV0dXJuIFNrLmFic3RyLnNlcXVlbmNlQ29uY2F0KGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICsgYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGNvbnRhaW5zOnskbWV0aDpmdW5jdGlvbiBjb250YWlucyhjLGEpe3JldHVybiBTay5idWlsdGluLmJvb2woU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEpKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGIgaW4gYSAobm90ZSByZXZlcnNlZCBvcGVyYW5kcykuXFxcIn0sY291bnRPZjp7JG1ldGg6ZnVuY3Rpb24gY291bnRPZihjLGEpe3JldHVybiBTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2YoYyxhKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBiIG9jY3VycyBpbiBhLlxcXCJ9LGRlbGl0ZW06eyRtZXRoOmZ1bmN0aW9uIGRlbGl0ZW0oYyxhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIub2JqZWN0RGVsSXRlbShjLGEsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgZGVsIGFbYl0uXFxcIn0sZ2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gZ2V0aXRlbShjLGEpe3JldHVybiBTay5hYnN0ci5vYmplY3RHZXRJdGVtKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhW2JdLlxcXCJ9LGluZGV4T2Y6eyRtZXRoOmZ1bmN0aW9uIGluZGV4T2YoYyxhKXtyZXR1cm4gU2suYWJzdHIuc2VxdWVuY2VHZXRJbmRleE9mKGMsYSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBvZiBiIGluIGEuXFxcIn0sc2V0aXRlbTp7JG1ldGg6ZnVuY3Rpb24gc2V0aXRlbShkLGEsYil7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLm9iamVjdFNldEl0ZW0oZCxhLGIsITApLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e01pbkFyZ3M6MyxNYXhBcmdzOjN9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgYywgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYVtiXSA9IGMuXFxcIn0sbGVuZ3RoX2hpbnQ6eyRtZXRoOmZ1bmN0aW9uIGxlbmd0aF9oaW50KGEsYil7aWYodm9pZCAwPT09YiliPW5ldyBTay5idWlsdGluLmludF8oMCk7ZWxzZSBpZighU2suYnVpbHRpbi5jaGVja0ludChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIidcXFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1xcXCInIG9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlclxcXCIpO3RyeXtyZXR1cm4gU2suYnVpbHRpbi5sZW4oYSl9Y2F0Y2goYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5UeXBlRXJyb3IpKXRocm93IGF9Y29uc3QgYz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50KTtpZih2b2lkIDAhPT1jKXtjb25zdCBhPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtpZihhPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpcmV0dXJuIGI7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiX19sZW5ndGhfaGludF9fIG11c3QgYmUgYW4gaW50ZWdlciwgbm90IFxcXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2Vsc2UgaWYoYS5uYiRpc25lZ2F0aXZlKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJfX2xlbmd0aF9oaW50X18oKSBzaG91bGQgcmV0dXJuID49IDBcXFwiKTtyZXR1cm4gYX1yZXR1cm4gYn0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIG9iaiwgZGVmYXVsdD0wLCAvKVxcXCIsJGRvYzpcXFwiUmV0dXJuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gb2JqLlxcXFxuXFxcXG5UaGlzIGlzIHVzZWZ1bCBmb3IgcHJlc2l6aW5nIGNvbnRhaW5lcnMgd2hlbiBidWlsZGluZyBmcm9tIGFuIGl0ZXJhYmxlLlxcXFxuXFxcXG5JZiB0aGUgb2JqZWN0IHN1cHBvcnRzIGxlbigpLCB0aGUgcmVzdWx0IHdpbGwgYmUgZXhhY3QuXFxcXG5PdGhlcndpc2UsIGl0IG1heSBvdmVyLSBvciB1bmRlci1lc3RpbWF0ZSBieSBhbiBhcmJpdHJhcnkgYW1vdW50LlxcXFxuVGhlIHJlc3VsdCB3aWxsIGJlIGFuIGludGVnZXIgPj0gMC5cXFwifSxpYWRkOnskbWV0aDpmdW5jdGlvbiBpYWRkKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkFkZFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSArPSBiLlxcXCJ9LGlhbmQ6eyRtZXRoOmZ1bmN0aW9uIGlhbmQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0QW5kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICY9IGIuXFxcIn0saWNvbmNhdDp7JG1ldGg6ZnVuY3Rpb24gaWNvbmNhdChjLGEpe2lmKHZvaWQgMCE9PWMuc3EkaW5wbGFjZV9jb25jYXQpcmV0dXJuIGMuc3EkaW5wbGFjZV9jb25jYXQoYSk7aWYodm9pZCAwIT09Yy5zcSRjb25jYXQpcmV0dXJuIGMuc3EkY29uY2F0KGEpO2lmKCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYyl8fCFTay5idWlsdGluLmNoZWNrU2VxdWVuY2UoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGMpK1xcXCIgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZFxcXCIpO3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJBZGRcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgKz0gYiwgZm9yIGEgYW5kIGIgc2VxdWVuY2VzLlxcXCJ9LGlmbG9vcmRpdjp7JG1ldGg6ZnVuY3Rpb24gaWZsb29yZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkZsb29yRGl2XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIC8vPSBiLlxcXCJ9LGlsc2hpZnQ6eyRtZXRoOmZ1bmN0aW9uIGlsc2hpZnQoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTFNoaWZ0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIDw8PSBiLlxcXCJ9LGltb2Q6eyRtZXRoOmZ1bmN0aW9uIGltb2QoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiTW9kXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICU9IGIuXFxcIn0saW11bDp7JG1ldGg6ZnVuY3Rpb24gaW11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhICo9IGIuXFxcIn0saW1hdG11bDp7JG1ldGg6ZnVuY3Rpb24gaW1hdG11bChjLGEpe3JldHVybiBTay5hYnN0ci5udW1iZXJJbnBsYWNlQmluT3AoYyxhLFxcXCJNYXRNdWx0XFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIEA9IGIuXFxcIn0saW9yOnskbWV0aDpmdW5jdGlvbiBpb3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0T3JcXFwiKX0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcXFwiKCRtb2R1bGUsIGEsIGIsIC8pXFxcIiwkZG9jOlxcXCJTYW1lIGFzIGEgfD0gYi5cXFwifSxpcG93OnskbWV0aDpmdW5jdGlvbiBpcG93KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlBvd1xcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAqKj0gYi5cXFwifSxpcnNoaWZ0OnskbWV0aDpmdW5jdGlvbiBpcnNoaWZ0KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkxSaGlmdFxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSA+Pj0gYi5cXFwifSxpc3ViOnskbWV0aDpmdW5jdGlvbiBpc3ViKGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIlN1YlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAtPSBiLlxcXCJ9LGl0cnVlZGl2OnskbWV0aDpmdW5jdGlvbiBpZGl2KGMsYSl7cmV0dXJuIFNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChjLGEsXFxcIkRpdlxcXCIpfSwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlxcXCIoJG1vZHVsZSwgYSwgYiwgLylcXFwiLCRkb2M6XFxcIlNhbWUgYXMgYSAvPSBiLlxcXCJ9LGl4b3I6eyRtZXRoOmZ1bmN0aW9uIGl4b3IoYyxhKXtyZXR1cm4gU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKGMsYSxcXFwiQml0WG9yXFxcIil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XFxcIigkbW9kdWxlLCBhLCBiLCAvKVxcXCIsJGRvYzpcXFwiU2FtZSBhcyBhIF49IGIuXFxcIn19KSxPYmplY3QuYXNzaWduKG9wZXJhdG9yLHtfX2Fic19fOm9wZXJhdG9yLmFicyxfX2FkZF9fOm9wZXJhdG9yLmFkZCxfX2FuZF9fOm9wZXJhdG9yLmFuZCxfX2NvbmNhdF9fOm9wZXJhdG9yLmNvbmNhdCxfX2NvbnRhaW5zX186b3BlcmF0b3IuY29udGFpbnMsX19kZWxpdGVtX186b3BlcmF0b3IuZGVsaXRlbSxfX2VxX186b3BlcmF0b3IuZXEsX19mbG9vcmRpdl9fOm9wZXJhdG9yLmZsb29yZGl2LF9fZ2VfXzpvcGVyYXRvci5nZSxfX2dldGl0ZW1fXzpvcGVyYXRvci5nZXRpdGVtLF9fZ3RfXzpvcGVyYXRvci5ndCxfX2lhZGRfXzpvcGVyYXRvci5pYWRkLF9faWFuZF9fOm9wZXJhdG9yLmlhbmQsX19pY29uY2F0X186b3BlcmF0b3IuaWNvbmNhdCxfX2lmbG9vcmRpdl9fOm9wZXJhdG9yLmlmbG9vcmRpdixfX2lsc2hpZnRfXzpvcGVyYXRvci5pbHNoaWZ0LF9faW1hdG11bF9fOm9wZXJhdG9yLmltYXRtdWwsX19pbW9kX186b3BlcmF0b3IuaW1vZCxfX2ltdWxfXzpvcGVyYXRvci5pbXVsLF9faW5kZXhfXzpvcGVyYXRvci5pbmRleCxfX2ludl9fOm9wZXJhdG9yLmludixfX2ludmVydF9fOm9wZXJhdG9yLmludmVydCxfX2lvcl9fOm9wZXJhdG9yLmlvcixfX2lwb3dfXzpvcGVyYXRvci5pcG93LF9faXJzaGlmdF9fOm9wZXJhdG9yLmlyc2hpZnQsX19pc3ViX186b3BlcmF0b3IuaXN1YixfX2l0cnVlZGl2X186b3BlcmF0b3IuaXRydWVkaXYsX19peG9yX186b3BlcmF0b3IuaXhvcixfX2xlX186b3BlcmF0b3IubGUsX19sc2hpZnRfXzpvcGVyYXRvci5sc2hpZnQsX19sdF9fOm9wZXJhdG9yLmx0LF9fbWF0bXVsX186b3BlcmF0b3IubWF0bXVsLF9fbW9kX186b3BlcmF0b3IubW9kLF9fbXVsX186b3BlcmF0b3IubXVsLF9fbmVfXzpvcGVyYXRvci5uZSxfX25lZ19fOm9wZXJhdG9yLm5lZyxfX25vdF9fOm9wZXJhdG9yLm5vdCxfX29yX186b3BlcmF0b3Iub3IsX19wb3NfXzpvcGVyYXRvci5wb3MsX19wb3dfXzpvcGVyYXRvci5wb3csX19yc2hpZnRfXzpvcGVyYXRvci5yc2hpZnQsX19zZXRpdGVtX186b3BlcmF0b3Iuc2V0aXRlbSxfX3N1Yl9fOm9wZXJhdG9yLnN1YixfX3RydWVkaXZfXzpvcGVyYXRvci50cnVlZGl2LF9feG9yX186b3BlcmF0b3IueG9yLF9hYnM6U2suYnVpbHRpbnMuYWJzLGRpdjpvcGVyYXRvci50cnVlZGl2LF9fZGl2X186b3BlcmF0b3IudHJ1ZWRpdn0pLG9wZXJhdG9yfVwiLFwic3JjL2xpYi9vcHRwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3B0cGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwib3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9vczJlbXhwYXRoLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJvczJlbXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwZGIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9waWNrbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBpY2tsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpY2tsZXRvb2xzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaWNrbGV0b29scyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BpcGVzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwaXBlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BrZ3V0aWwucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBrZ3V0aWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wbGF0Zm9ybS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e30sYj1cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHdpbmRvdyYmXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cubmF2aWdhdG9yO3JldHVybiBhLnB5dGhvbl9pbXBsZW1lbnRhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl9pbXBsZW1lbnRhdGlvblxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnN0cihcXFwiU2t1bHB0XFxcIil9KSxhLm5vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJub2RlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKX0pLGEudmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInZlcnNpb25cXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYS5weXRob25fdmVyc2lvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInB5dGhvbl92ZXJzaW9uXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1Tay5fX2Z1dHVyZV9fLnB5dGhvbl92ZXJzaW9uP1xcXCIzLjIuMFxcXCI6XFxcIjIuNy4wXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnN5c3RlbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInN5c3RlbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLGE9Yj93aW5kb3cubmF2aWdhdG9yLmFwcENvZGVOYW1lOlxcXCJcXFwiLG5ldyBTay5idWlsdGluLnN0cihhKX0pLGEubWFjaGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hY2hpbmVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxhPWI/d2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybTpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLnJlbGVhc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhO3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyZWxlYXNlXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCksYT1iP3dpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbjpcXFwiXFxcIixuZXcgU2suYnVpbHRpbi5zdHIoYSl9KSxhLmFyY2hpdGVjdHVyZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImFyY2hpdGVjdHVyZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoXFxcIjY0Yml0XFxcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJcXFwiKV0pfSksYS5wcm9jZXNzb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwcm9jZXNzb3JcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwwKSxuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSksYX07XCIsXCJzcmMvbGliL3BsYXRmb3JtLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGF0Zm9ybSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BsaXN0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwbGlzdGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BvcGVuMi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9wZW4yIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcG9wbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwb3BsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wb3NpeGZpbGUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBvc2l4ZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3Bvc2l4cGF0aC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicG9zaXhwYXRoIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHByaW50LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwcHJpbnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9wcm9jZXNzaW5nLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaCxhPU1hdGguUEksaj17X19uYW1lX186bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJwcm9jZXNzaW5nXFxcIil9LGs9W10sbD0hMCxtPW51bGw7cmV0dXJuIGoucHJvY2Vzc2luZz1udWxsLGoucD1udWxsLGouWD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouRz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouQT1uZXcgU2suYnVpbHRpbi5pbnRfKDYpLGouVT1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouVj1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouTlg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLk5ZPW5ldyBTay5idWlsdGluLmludF8oMTApLGouTlo9bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksai5FREdFPW5ldyBTay5idWlsdGluLmludF8oMTIpLGouU1I9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5TRz1uZXcgU2suYnVpbHRpbi5pbnRfKDE0KSxqLlNCPW5ldyBTay5idWlsdGluLmludF8oMTUpLGouU0E9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5TVz1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLlRYPW5ldyBTay5idWlsdGluLmludF8oMTgpLGouVFk9bmV3IFNrLmJ1aWx0aW4uaW50XygxOSksai5UWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlZYPW5ldyBTay5idWlsdGluLmludF8oMjEpLGouVlk9bmV3IFNrLmJ1aWx0aW4uaW50XygyMiksai5WWj1uZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxqLlZXPW5ldyBTay5idWlsdGluLmludF8oMjQpLGouQVI9bmV3IFNrLmJ1aWx0aW4uaW50XygyNSksai5BRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI2KSxqLkFCPW5ldyBTay5idWlsdGluLmludF8oMjcpLGouRFI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRHPW5ldyBTay5idWlsdGluLmludF8oNCksai5EQj1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouREE9bmV3IFNrLmJ1aWx0aW4uaW50Xyg2KSxqLlNQUj1uZXcgU2suYnVpbHRpbi5pbnRfKDI4KSxqLlNQRz1uZXcgU2suYnVpbHRpbi5pbnRfKDI5KSxqLlNQQj1uZXcgU2suYnVpbHRpbi5pbnRfKDMwKSxqLlNISU5FPW5ldyBTay5idWlsdGluLmludF8oMzEpLGouRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FRz1uZXcgU2suYnVpbHRpbi5pbnRfKDMzKSxqLkVCPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouQkVFTl9MSVQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNSksai5WRVJURVhfRklFTERfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNiksai5DRU5URVI9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLlJBRElVUz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQ09STkVSUz1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouQ09STkVSPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESUFNRVRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQkFTRUxJTkU9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLlRPUD1uZXcgU2suYnVpbHRpbi5pbnRfKDEwMSksai5CT1RUT009bmV3IFNrLmJ1aWx0aW4uaW50XygxMDIpLGouTk9STUFMPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxJWkVEPW5ldyBTay5idWlsdGluLmludF8oMSksai5JTUFHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTU9ERUw9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlNIQVBFPW5ldyBTay5idWlsdGluLmludF8oNSksai5BTUJJRU5UPW5ldyBTay5idWlsdGluLmludF8oMCksai5ESVJFQ1RJT05BTD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouU1BPVD1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouUkdCPW5ldyBTay5idWlsdGluLmludF8oMSksai5BUkdCPW5ldyBTay5idWlsdGluLmludF8oMiksai5IU0I9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkFMUEhBPW5ldyBTay5idWlsdGluLmludF8oNCksai5DTVlLPW5ldyBTay5idWlsdGluLmludF8oNSksai5USUZGPW5ldyBTay5idWlsdGluLmludF8oMCksai5UQVJHQT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouSlBFRz1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouR0lGPW5ldyBTay5idWlsdGluLmludF8oMyksai5NSVRFUj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIm1pdGVyXFxcIiksai5CRVZFTD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImJldmVsXFxcIiksai5ST1VORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInJvdW5kXFxcIiksai5TUVVBUkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJidXR0XFxcIiksai5QUk9KRUNUPW5ldyBTay5idWlsdGluLnN0cihcXFwic3F1YXJlXFxcIiksai5QMkQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkpBVkEyRD1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouV0VCR0w9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlAzRD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouT1BFTkdMPW5ldyBTay5idWlsdGluLmludF8oMiksai5QREY9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkRYRj1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1RIRVI9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLldJTkRPV1M9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLk1BWE9TWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouTElOVVg9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkVQU0lMT049bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDFlLTQpLGouTUFYX0ZMT0FUPW5ldyBTay5idWlsdGluLmZsb2F0XygzNDAyODIzNWUzMSksai5NSU5fRkxPQVQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0zNDAyODIzNWUzMSksai5NQVhfSU5UPW5ldyBTay5idWlsdGluLmludF8oMjE0NzQ4MzY0Nyksai5NSU5fSU5UPW5ldyBTay5idWlsdGluLmludF8oLTIxNDc0ODM2NDgpLGouSEFMRl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS8yKSxqLlRISVJEX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XyhhLzMpLGouUEk9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpLGouVFdPX1BJPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouVEFVPW5ldyBTay5idWlsdGluLmZsb2F0XygyKmEpLGouUVVBUlRFUl9QST1uZXcgU2suYnVpbHRpbi5mbG9hdF8oYS80KSxqLkRFR19UT19SQUQ9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvMTgwKSxqLlJBRF9UT19ERUc9bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDE4MC9hKSxqLldISVRFU1BBQ0U9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCIgXFxcXHRcXFxcblxcXFxyXFxcXGZcXFxceEEwXFxcIiksai5QT0lOVD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouUE9JTlRTPW5ldyBTay5idWlsdGluLmludF8oMiksai5MSU5FPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSU5FUz1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouVFJJQU5HTEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg4KSxqLlRSSUFOR0xFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDkpLGouVFJJQU5HTEVfRkFOPW5ldyBTay5idWlsdGluLmludF8oMTEpLGouVFJJQU5HTEVfU1RSSVA9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5RVUFEPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouUVVBRFM9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5RVUFEX1NUUklQPW5ldyBTay5idWlsdGluLmludF8oMTcpLGouUE9MWUdPTj1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBBVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyMSksai5SRUNUPW5ldyBTay5idWlsdGluLmludF8oMzApLGouRUxMSVBTRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMxKSxqLkFSQz1uZXcgU2suYnVpbHRpbi5pbnRfKDMyKSxqLlNQSEVSRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkJPWD1uZXcgU2suYnVpbHRpbi5pbnRfKDQxKSxqLkdST1VQPW5ldyBTay5idWlsdGluLmludF8oMCksai5QUklNSVRJVkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkdFT01FVFJZPW5ldyBTay5idWlsdGluLmludF8oMyksai5WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJFWklFUl9WRVJURVg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkNVUlZFX1ZFUlRFWD1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQlJFQUs9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkNMT1NFU0hBUEU9bmV3IFNrLmJ1aWx0aW4uaW50Xyg0KSxqLlJFUExBQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLkJMRU5EPW5ldyBTay5idWlsdGluLmludF8oMSksai5BREQ9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLlNVQlRSQUNUPW5ldyBTay5idWlsdGluLmludF8oNCksai5MSUdIVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouREFSS0VTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE2KSxqLkRJRkZFUkVOQ0U9bmV3IFNrLmJ1aWx0aW4uaW50XygzMiksai5FWENMVVNJT049bmV3IFNrLmJ1aWx0aW4uaW50Xyg2NCksai5NVUxUSVBMWT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyOCksai5TQ1JFRU49bmV3IFNrLmJ1aWx0aW4uaW50XygyNTYpLGouT1ZFUkxBWT1uZXcgU2suYnVpbHRpbi5pbnRfKDUxMiksai5IQVJEX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMTAyNCksai5TT0ZUX0xJR0hUPW5ldyBTay5idWlsdGluLmludF8oMjA0OCksai5ET0RHRT1uZXcgU2suYnVpbHRpbi5pbnRfKDQwOTYpLGouQlVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDgxOTIpLGouQUxQSEFfTUFTSz1uZXcgU2suYnVpbHRpbi5pbnRfKDQyNzgxOTAwODApLGouUkVEX01BU0s9bmV3IFNrLmJ1aWx0aW4uaW50XygxNjcxMTY4MCksai5HUkVFTl9NQVNLPW5ldyBTay5idWlsdGluLmludF8oNjUyODApLGouQkxVRV9NQVNLPW5ldyBTay5idWlsdGluLmludF8oMjU1KSxqLkNVU1RPTT1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGouT1JUSE9HUkFQSElDPW5ldyBTay5idWlsdGluLmludF8oMiksai5QRVJTUEVDVElWRT1uZXcgU2suYnVpbHRpbi5pbnRfKDMpLGouQVJST1c9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJkZWZhdWx0XFxcIiksai5DUk9TUz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcImNyb3NzaGFpclxcXCIpLGouSEFORD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcInBvaW50ZXJcXFwiKSxqLk1PVkU9bmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJtb3ZlXFxcIiksai5URVhUPW5ldyBTay5idWlsdGluLnN0cihcXFwidGV4dFxcXCIpLGouV0FJVD1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndhaXRcXFwiKSxqLk5PQ1VSU09SPVNrLmJ1aWx0aW4uYXNzayQoXFxcInVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBUC8vL3dBQUFDSDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUNSQUVBT3c9PScpLCBhdXRvXFxcIiksai5ESVNBQkxFX09QRU5HTF8yWF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxqLkVOQUJMRV9PUEVOR0xfMlhfU01PT1RIPW5ldyBTay5idWlsdGluLmludF8oLTEpLGouRU5BQkxFX09QRU5HTF80WF9TTU9PVEg9bmV3IFNrLmJ1aWx0aW4uaW50XygyKSxqLkVOQUJMRV9OQVRJVkVfRk9OVFM9bmV3IFNrLmJ1aWx0aW4uaW50XygzKSxqLkRJU0FCTEVfREVQVEhfVEVTVD1uZXcgU2suYnVpbHRpbi5pbnRfKDQpLGouRU5BQkxFX0RFUFRIX1RFU1Q9bmV3IFNrLmJ1aWx0aW4uaW50XygtNCksai5FTkFCTEVfREVQVEhfU09SVD1uZXcgU2suYnVpbHRpbi5pbnRfKDUpLGouRElTQUJMRV9ERVBUSF9TT1JUPW5ldyBTay5idWlsdGluLmludF8oLTUpLGouRElTQUJMRV9PUEVOR0xfRVJST1JfUkVQT1JUPW5ldyBTay5idWlsdGluLmludF8oNiksai5FTkFCTEVfT1BFTkdMX0VSUk9SX1JFUE9SVD1uZXcgU2suYnVpbHRpbi5pbnRfKC02KSxqLkVOQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKDcpLGouRElTQUJMRV9BQ0NVUkFURV9URVhUVVJFUz1uZXcgU2suYnVpbHRpbi5pbnRfKC03KSxqLkhJTlRfQ09VTlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMCksai5PUEVOPW5ldyBTay5idWlsdGluLmludF8oMSksai5DTE9TRT1uZXcgU2suYnVpbHRpbi5pbnRfKDIpLGouQkxVUj1uZXcgU2suYnVpbHRpbi5pbnRfKDExKSxqLkdSQVk9bmV3IFNrLmJ1aWx0aW4uaW50XygxMiksai5JTlZFUlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxMyksai5PUEFRVUU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNCksai5QT1NURVJJWkU9bmV3IFNrLmJ1aWx0aW4uaW50XygxNSksai5USFJFU0hPTEQ9bmV3IFNrLmJ1aWx0aW4uaW50XygxNiksai5FUk9ERT1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkRJTEFURT1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkJBQ0tTUEFDRT1uZXcgU2suYnVpbHRpbi5pbnRfKDgpLGouVEFCPW5ldyBTay5idWlsdGluLmludF8oOSksai5FTlRFUj1uZXcgU2suYnVpbHRpbi5pbnRfKDEwKSxqLlJFVFVSTj1uZXcgU2suYnVpbHRpbi5pbnRfKDEzKSxqLkVTQz1uZXcgU2suYnVpbHRpbi5pbnRfKDI3KSxqLkRFTEVURT1uZXcgU2suYnVpbHRpbi5pbnRfKDEyNyksai5DT0RFRD1uZXcgU2suYnVpbHRpbi5pbnRfKDY1NTM1KSxqLlNISUZUPW5ldyBTay5idWlsdGluLmludF8oMTYpLGouQ09OVFJPTD1uZXcgU2suYnVpbHRpbi5pbnRfKDE3KSxqLkFMVD1uZXcgU2suYnVpbHRpbi5pbnRfKDE4KSxqLkNBUFNMSz1uZXcgU2suYnVpbHRpbi5pbnRfKDIwKSxqLlBHVVA9bmV3IFNrLmJ1aWx0aW4uaW50XygzMyksai5QR0ROPW5ldyBTay5idWlsdGluLmludF8oMzQpLGouRU5EPW5ldyBTay5idWlsdGluLmludF8oMzUpLGouSE9NRT1uZXcgU2suYnVpbHRpbi5pbnRfKDM2KSxqLkxFRlQ9bmV3IFNrLmJ1aWx0aW4uaW50XygzNyksai5VUD1uZXcgU2suYnVpbHRpbi5pbnRfKDM4KSxqLlJJR0hUPW5ldyBTay5idWlsdGluLmludF8oMzkpLGouRE9XTj1uZXcgU2suYnVpbHRpbi5pbnRfKDQwKSxqLkYxPW5ldyBTay5idWlsdGluLmludF8oMTEyKSxqLkYyPW5ldyBTay5idWlsdGluLmludF8oMTEzKSxqLkYzPW5ldyBTay5idWlsdGluLmludF8oMTE0KSxqLkY0PW5ldyBTay5idWlsdGluLmludF8oMTE1KSxqLkY1PW5ldyBTay5idWlsdGluLmludF8oMTE2KSxqLkY2PW5ldyBTay5idWlsdGluLmludF8oMTE3KSxqLkY3PW5ldyBTay5idWlsdGluLmludF8oMTE4KSxqLkY4PW5ldyBTay5idWlsdGluLmludF8oMTE5KSxqLkY5PW5ldyBTay5idWlsdGluLmludF8oMTIwKSxqLkYxMD1uZXcgU2suYnVpbHRpbi5pbnRfKDEyMSksai5GMTE9bmV3IFNrLmJ1aWx0aW4uaW50XygxMjIpLGouRjEyPW5ldyBTay5idWlsdGluLmludF8oMTIzKSxqLk5VTUxLPW5ldyBTay5idWlsdGluLmludF8oMTQ0KSxqLk1FVEE9bmV3IFNrLmJ1aWx0aW4uaW50XygxNTcpLGouSU5TRVJUPW5ldyBTay5idWlsdGluLmludF8oMTU1KSxqLlNJTkNPU19MRU5HVEg9bmV3IFNrLmJ1aWx0aW4uaW50Xyg3MjApLGouUFJFQ0lTSU9OQj1uZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxqLlBSRUNJU0lPTkY9bmV3IFNrLmJ1aWx0aW4uaW50XygzMjc2OCksai5QUkVDX01BWFZBTD1uZXcgU2suYnVpbHRpbi5pbnRfKDMyNzY3KSxqLlBSRUNfQUxQSEFfU0hJRlQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyg5KSxqLlBSRUNfUkVEX1NISUZUPW5ldyBTay5idWlsdGluLmludF8oMSksai5OT1JNQUxfTU9ERV9BVVRPPW5ldyBTay5idWlsdGluLmludF8oMCksai5OT1JNQUxfTU9ERV9TSEFQRT1uZXcgU2suYnVpbHRpbi5pbnRfKDEpLGouTk9STUFMX01PREVfVkVSVEVYPW5ldyBTay5idWlsdGluLmludF8oMiksai5NQVhfTElHSFRTPW5ldyBTay5idWlsdGluLmludF8oOCksai5saW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmxpbmUoYS52LGIudixjLnYsZC52KX0pLGouZWxsaXBzZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2oucHJvY2Vzc2luZy5lbGxpcHNlKGEudixiLnYsYy52LGQudil9KSxqLnRleHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLnRleHQoYS52LGIudixjLnYpfSksai5wb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7ai5wcm9jZXNzaW5nLnBvaW50KGEudixiLnYpfSksai5hcmM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmFyYyhhLnYsYi52LGMudixkLnYsZS52LGYudil9KSxqLnF1YWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgpe2oucHJvY2Vzc2luZy5xdWFkKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpfSksai5yZWN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGU/ai5wcm9jZXNzaW5nLnJlY3QoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcucmVjdChhLnYsYi52LGMudixkLnYsZS52KX0pLGoudHJpYW5nbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnRyaWFuZ2xlKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmV6aWVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGksayxsLG0pe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXIoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5hbHBoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5hbHBoYShhLnYsYy52LGQudikpfSksai5hbWJpZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9qLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52KTpqLnByb2Nlc3NpbmcuYW1iaWVudChhLnYsYy52LGQudil9KSxqLmFtYmllbnRMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5hbWJpZW50TGlnaHQoYS52LGIudixjLnYsZC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGY/ai5wcm9jZXNzaW5nLmFtYmllbnRMaWdodChhLnYsYi52LGMudixkLnYsZS52KTpqLnByb2Nlc3NpbmcuYW1iaWVudExpZ2h0KGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGouYmVnaW5DYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5iZWdpbkNhbWVyYSgpfSksai5iZWdpblNoYXBlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhJiYoYT1qLlBPTFlHT04pLGoucHJvY2Vzc2luZy5iZWdpblNoYXBlKGEudil9KSxqLmJlemllckRldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2E9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhPzIwOmEudixqLnByb2Nlc3NpbmcuYmV6aWVyRGV0YWlsKGEpfSksai5iZXppZXJQb2ludD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGUsYSxiLGMsZCl7ai5wcm9jZXNzaW5nLmJlemllclBvaW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5iZXppZXJUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuYmV6aWVyVGFuZ2VudChlLnYsYS52LGIudixjLnYsZC52KX0pLGouYmV6aWVyVmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZz9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGg/ai5wcm9jZXNzaW5nLmJlemllclZlcnRleChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgaT9qLnByb2Nlc3NpbmcuYmV6aWVyVmVydGV4KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5iZXppZXJWZXJ0ZXgoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYpfSksai5ibGVuZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGspe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5ibGVuZChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudik6ai5wcm9jZXNzaW5nLmJsZW5kKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudil9KSxqLmJsZW5kQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7dmFyIGU9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oMCksbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7cmV0dXJuIGUudj1qLnByb2Nlc3NpbmcuYmxlbmRDb2xvcihhLnYsYi52LGQudiksZX0pLGouYnJpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5icmlnaHRuZXNzKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmJyaWdodG5lc3MoYS52LGMudikpOm5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuYnJpZ2h0bmVzcyhhLnYsYy52LGQudikpfSksai5jYW1lcmE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBhP2oucHJvY2Vzc2luZy5jYW1lcmEoKTpqLnByb2Nlc3NpbmcuY2FtZXJhKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY29uc3RyYWluPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmNvbnN0cmFpbihhLnYsYi52LGMudikpfSksai5jb3B5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe290aGVyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxvdGhlciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfP2oucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYpOmoucHJvY2Vzc2luZy5jb3B5KGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KX0pLGouY3JlYXRlRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gZS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcuY3JlYXRlRm9udChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmNyZWF0ZUZvbnQoYS52LGIudixjLnYpOmoucHJvY2Vzc2luZy5jcmVhdGVGb250KGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlR3JhcGhpY3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QR3JhcGhpY3MpO3JldHVybiBlLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5jcmVhdGVHcmFwaGljcyhhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLmNyZWF0ZUdyYXBoaWNzKGEudixiLnYsYy52LGQudiksZX0pLGouY3JlYXRlSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUEltYWdlKTtyZXR1cm4gZC52PWoucHJvY2Vzc2luZy5jcmVhdGVJbWFnZShhLnYsYi52LGMudiksZH0pLGouY3Vyc29yPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuY3Vyc29yKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5jdXJzb3IoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnNvcihhLnYsYi52KTpqLnByb2Nlc3NpbmcuY3Vyc29yKGEudixiLnYsYy52KX0pLGouY3VydmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSxrLGwsbSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBpP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGs/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGw/ai5wcm9jZXNzaW5nLmN1cnZlKGEudixiLnYsYy52LGQudixlLnYsZi52LGcudixoLnYsaS52LGsudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBtP2oucHJvY2Vzc2luZy5jdXJ2ZShhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52LGkudixrLnYsbC52KTpqLnByb2Nlc3NpbmcuY3VydmUoYS52LGIudixjLnYsZC52LGUudixmLnYsZy52LGgudixpLnYsay52LGwudixtLnYpfSksai5jdXJ2ZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZURldGFpbChhLnYpfSksai5jdXJ2ZVBvaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVQb2ludChlLnYsYS52LGIudixjLnYsZC52KX0pLGouY3VydmVUYW5nZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSxhLGIsYyxkKXtqLnByb2Nlc3NpbmcuY3VydmVUYW5nZW50KGUudixhLnYsYi52LGMudixkLnYpfSksai5jdXJ2ZVRpZ2h0bmVzcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5jdXJ2ZVRpZ2h0bmVzcyhhLnYpfSksai5jdXJ2ZVZlcnRleD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmN1cnZlVmVydGV4KGEudixiLnYpOmoucHJvY2Vzc2luZy5jdXJ2ZVZlcnRleChhLnYsYi52LGMudil9KSxqLmRheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmRheSgpKX0pLGouZGVncmVlcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRlZ3JlZXMoYS52KSl9KSxqLmRpcmVjdGlvbmFsTGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmRpcmVjdGlvbmFsTGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5kaXN0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLmRpc3QoYS52LGIudixjLnYsZC52KSk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBmP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcuZGlzdChhLnYsYi52LGMudixkLnYsZS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5kaXN0KGEudixiLnYsYy52LGQudixlLnYsZi52KSl9KSxqLmVtaXNzaXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcuZW1pc3NpdmUoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLmVtaXNzaXZlKGEudixiLnYpOmoucHJvY2Vzc2luZy5lbWlzc2l2ZShhLnYsYi52LGMudil9KSxqLmVuZENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLmVuZENhbWVyYSgpfSksai5lbmRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9qLnByb2Nlc3NpbmcuZW5kU2hhcGUoKTpqLnByb2Nlc3NpbmcuZW5kU2hhcGUoYS52KX0pLGouZmlsdGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLmZpbHRlcihhLnYpOmoucHJvY2Vzc2luZy5maWx0ZXIoYS52LGIudil9KSxqLmZydXN0dW09bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLmZydXN0dW0oYSxiLGMsZCxlLGYpfSksai5oaW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmhpbnQoYSl9KSxqLmhvdXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ob3VyKCkpfSksai5odWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5odWUoYS52KSl9KSxqLmltYWdlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5pbWFnZU1vZGUoYS52KX0pLGoubGVycD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5sZXJwKGEudixiLnYsYy52KSl9KSxqLmxlcnBDb2xvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixkKXt2YXIgZT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5jb2xvcixbbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldKTtyZXR1cm4gZS52PWoucHJvY2Vzc2luZy5sZXJwQ29sb3IoYS52LGIudixkLnYpLGV9KSxqLmxpZ2h0RmFsbG9mZj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3NpbmcubGlnaHRGYWxsb2ZmKGEudixiLnYsYy52KX0pLGoubGlnaHRzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcubGlnaHRzKCl9KSxqLmxpZ2h0U3BlY3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7ai5wcm9jZXNzaW5nLmxpZ2h0U3BlY3VsYXIoYS52LGIudixjLnYpfSksai5sb2FkQnl0ZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcubG9hZEJ5dGVzKGEudikpfSksai5sb2FkRm9udD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBGb250KTtyZXR1cm4gYi52PWoucHJvY2Vzc2luZy5sb2FkRm9udChhLnYpLGJ9KSxqLmxvYWRTaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBTaGFwZVNWRyxbbmV3IFNrLmJ1aWx0aW4uc3RyKFxcXCJzdHJpbmdcXFwiKSxhXSk7cmV0dXJuIGJ9KSxqLmxvYWRTdHJpbmdzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3Qoai5wcm9jZXNzaW5nLmxvYWRTdHJpbmdzKGEudikpfSksai5tYWc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGEsYil7cmV0dXJuXFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubWFnKGQudixhLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hZyhkLnYsYS52LGIudikpfSksai5tYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1hcChhLnYsYi52LGMudixkLnYsZS52KSl9KSxqLm1pbGxpcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1pbGxpcygpKX0pLGoubWludXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcubWludXRlKCkpfSksai5tb2RlbFg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3NpbmcubW9kZWxYKGEudixiLnYsYy52KSl9KSxqLm1vZGVsWT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5tb2RlbFkoYS52LGIudixjLnYpKX0pLGoubW9kZWxaPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm1vZGVsWihhLnYsYi52LGMudikpfSksai5tb250aD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLm1vbnRoKCkpfSksai5ub0N1cnNvcj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLm5vQ3Vyc29yKCl9KSxqLm5vaXNlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudikpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlKGEudixiLnYsYy52KSl9KSxqLm5vaXNlRGV0YWlsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtqLnByb2Nlc3Npbmcubm9pc2VEZXRhaWwoYS52LGIudil9KSxqLm5vaXNlU2VlZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vaXNlU2VlZChhLnYpKX0pLGoubm9MaWdodHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0xpZ2h0cygpfSksai5ub3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLm5vcm0oYS52LGIudixjLnYpKX0pLGoubm9ybWFsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2oucHJvY2Vzc2luZy5ub3JtYWwoYS52LGIudixjLnYpfSksai5ub1RpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1RpbnQoKX0pLGoub3J0aG89bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLm9ydGhvKGEudixiLnYsYy52LGQudixlLnYsZi52KX0pLGoucGVyc3BlY3RpdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKCk6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3NpbmcucGVyc3BlY3RpdmUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5wZXJzcGVjdGl2ZShhLnYsYi52LGMudik6ai5wcm9jZXNzaW5nLnBlcnNwZWN0aXZlKGEudixiLnYsYy52LGQudil9KSxqLnBvaW50TGlnaHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUsZil7ai5wcm9jZXNzaW5nLnBvaW50TGlnaHQoYS52LGIudixjLnYsZC52LGUudixmLnYpfSksai5wcmludENhbWVyYT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnByaW50Q2FtZXJhKCl9KSxqLnByaW50bG49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucHJpbnRsbihhLnYpfSksai5wcmludFByb2plY3Rpb249bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5wcmludFByb2plY3Rpb24oKX0pLGoucmFkaWFucz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhZGlhbnMoYS52KSl9KSxqLnJhbmRvbVNlZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb21TZWVkKGEudikpfSksai5yYW5kb209bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVyblxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnJhbmRvbSgpKTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52KSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5yYW5kb20oYS52LGIudikpfSksai5yZXF1ZXN0SW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnJlcXVlc3RJbWFnZShhLnYpOmoucHJvY2Vzc2luZy5yZXF1ZXN0SW1hZ2UoYS52LGIudiksY30pLGouc2F0dXJhdGlvbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNhdHVyYXRpb24oYS52KSl9KSxqLnNhdmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2F2ZShhLnYpfSksai5zYXZlRnJhbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGE/ai5wcm9jZXNzaW5nLnNhdmVGcmFtZSgpOmoucHJvY2Vzc2luZy5zYXZlRnJhbWUoYS52KX0pLGouc2F2ZVN0cmluZ3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2oucHJvY2Vzc2luZy5zYXZlU3RyaW5ncyhhLnYsYi52KX0pLGouc2NyZWVuWD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zY3JlZW5YKGEudixiLnYsYy52KSl9KSxqLnNjcmVlblk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhqLnByb2Nlc3Npbmcuc2NyZWVuWShhLnYsYi52LGMudikpfSksai5zY3JlZW5aPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnNjcmVlblooYS52LGIudixjLnYpKX0pLGouc2Vjb25kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcuc2Vjb25kKCkpfSksai5zaGFwZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zaGFwZShhLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9qLnByb2Nlc3Npbmcuc2hhcGUoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYpOmoucHJvY2Vzc2luZy5zaGFwZShhLnYsYi52LGMudixkLnYsZS52KX0pLGouc2hhcGVNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnNoYXBlTW9kZShhLnYpfSksai5zaGluaW5lc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc2hpbmluZXNzKGEudil9KSxqLnNwZWN1bGFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3Npbmcuc3BlY3VsYXIoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnNwZWN1bGFyKGEudixiLnYpOmoucHJvY2Vzc2luZy5zcGVjdWxhcihhLnYsYi52LGMudil9KSxqLnNwb3RMaWdodD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7ai5wcm9jZXNzaW5nLnNwb3RMaWdodChhLnYsYi52LGMudixkLnYsZS52LGYudixnLnYsaC52KX0pLGouc3E9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy5zcShhKSl9KSxqLnN0YXR1cz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5zdGF0dXMoYS52KX0pLGoudGV4dEFsaWduPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRleHRBbGlnbihhLnYpOmoucHJvY2Vzc2luZy50ZXh0QWxpZ24oYS52LGIudil9KSxqLnRleHRBc2NlbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oai5wcm9jZXNzaW5nLnRleHRBc2NlbnQoKSl9KSxqLnRleHREZXNjZW50PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0RGVzY2VudCgpKX0pLGoudGV4dEZvbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe1xcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9qLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52KTpqLnByb2Nlc3NpbmcudGV4dEZvbnQoYS52LGIudil9KSxqLnRleHRMZWFkaW5nPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRMZWFkaW5nKGEudil9KSxqLnRleHRNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRNb2RlKGEudil9KSxqLnRleHRTaXplPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnRleHRTaXplKGEudil9KSxqLnRleHR1cmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcudGV4dHVyZShhLnYpfSksai50ZXh0dXJlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy50ZXh0dXJlTW9kZShhLnYpfSksai50ZXh0V2lkdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGoucHJvY2Vzc2luZy50ZXh0V2lkdGgoYS52KSl9KSxqLnRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/ai5wcm9jZXNzaW5nLnRpbnQoYS52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnRpbnQoYS52LGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2oucHJvY2Vzc2luZy50aW50KGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcudGludChhLnYsYi52LGMudixkLnYpfSksai51cGRhdGVQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy51cGRhdGVQaXhlbHMoKX0pLGoudmVydGV4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLnZlcnRleChhLnYsYi52LGMudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBlP2oucHJvY2Vzc2luZy52ZXJ0ZXgoYS52LGIudixjLnYsZC52KTpqLnByb2Nlc3NpbmcudmVydGV4KGEudixiLnYsYy52LGQudixlLnYpfSksai55ZWFyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcueWVhcigpKX0pLGouYm94PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLmJveChhLnYpfSksai5zcGhlcmU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3BoZXJlKGEudil9KSxqLnNwaGVyZURldGFpbD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP2oucHJvY2Vzc2luZy5zcGhlcmVEZXRhaWwoYS52KTpqLnByb2Nlc3Npbmcuc3BoZXJlRGV0YWlsKGEudixiLnYpfSksai5iYWNrZ3JvdW5kPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGQpe1xcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksai5wcm9jZXNzaW5nLmJhY2tncm91bmQoYS52LGMsZCl9KSxqLmZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3NpbmcuZmlsbChhLnYsYyxkLGUpfSksai5zdHJva2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGMmJihjPWMudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBkJiYoZD1kLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZSYmKGU9ZS52KSxqLnByb2Nlc3Npbmcuc3Ryb2tlKGEudixjLGQsZSl9KSxqLm5vU3Ryb2tlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3Npbmcubm9TdHJva2UoKX0pLGouY29sb3JNb2RlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtiPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj8yNTU6Yi52LFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgYyYmKGM9Yy52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGQmJihkPWQudiksXFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBlJiYoZT1lLnYpLGoucHJvY2Vzc2luZy5jb2xvck1vZGUoYS52LGIsYyxkLGUpfSksai5ub0ZpbGw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub0ZpbGwoKX0pLGoubG9vcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7aWYobnVsbD09PWoucHJvY2Vzc2luZyl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXFxcImxvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMCxqLnByb2Nlc3NpbmcubG9vcCgpfSksai5ub0xvb3A9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2lmKG51bGw9PT1qLnByb2Nlc3NpbmcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uRXhjZXB0aW9uKFxcXCJub0xvb3AoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJ1bigpXFxcIik7bD0hMSxqLnByb2Nlc3Npbmcubm9Mb29wKCl9KSxqLmZyYW1lUmF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5mcmFtZVJhdGUoYS52KX0pLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxqLmhlaWdodD1uZXcgU2suYnVpbHRpbi5pbnRfKDApLGoucmVuZGVyTW9kZT1qLlAyRCxqLnNpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjJiYoYz1qLlAyRCksai5wcm9jZXNzaW5nLnNpemUoYS52LGIudixjLnYpLGoud2lkdGg9bmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3Npbmcud2lkdGgpLGouaGVpZ2h0PW5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmhlaWdodCksai5yZW5kZXJNb2RlPWN9KSxqLmV4aXRwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcuZXhpdCgpfSksai5tb3VzZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVgpfSksai5tb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5tb3VzZVkpfSksai5wbW91c2VYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucG1vdXNlWCl9KSxqLnBtb3VzZVk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5wbW91c2VZKX0pLGoucmVjdE1vZGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3NpbmcucmVjdE1vZGUoYS52KX0pLGouc3Ryb2tlV2VpZ2h0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnN0cm9rZVdlaWdodChhLnYpfSksai5zbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5zbW9vdGgoKX0pLGoubm9TbW9vdGg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5ub1Ntb290aCgpfSksai5lbGxpcHNlTW9kZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5lbGxpcHNlTW9kZShhLnYpfSksai5zdHJva2VDYXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlQ2FwKGEudil9KSxqLnN0cm9rZUpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcuc3Ryb2tlSm9pbihhLnYpfSksai5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlKGEudil9KSxqLnJvdGF0ZVg9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtqLnByb2Nlc3Npbmcucm90YXRlWChhLnYpfSksai5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7ai5wcm9jZXNzaW5nLnJvdGF0ZVkoYS52KX0pLGoucm90YXRlWj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2oucHJvY2Vzc2luZy5yb3RhdGVaKGEudil9KSxqLnNjYWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy5zY2FsZShhLnYsYixjKX0pLGoudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe2I9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiPzE6Yi52LGM9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBjPzE6Yy52LGoucHJvY2Vzc2luZy50cmFuc2xhdGUoYS52LGIsYyl9KSxqLnBvcE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnBvcE1hdHJpeCgpfSksai5wdXNoTWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtqLnByb2Nlc3NpbmcucHVzaE1hdHJpeCgpfSksai5hcHBseU1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGEsYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwxNik7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyliW2FdPVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYlthXT8wOmJbYV0udjtqLnByb2Nlc3NpbmcuYXBwbHlNYXRyaXguYXBwbHkoai5wcm9jZXNzaW5nLGIpfSksai5yZXNldE1hdHJpeD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7ai5wcm9jZXNzaW5nLnJlc2V0TWF0cml4KCl9KSxqLnByaW50TWF0cml4PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShqLnByb2Nlc3NpbmcucHJpbnRNYXRyaXgoKSl9KSxqLnJ1bj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU2suY2FudmFzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXFxcIlByb2Nlc3NpbmcgbW9kdWxlOiBDYW52YXMgZWxlbWVudCBub3Qgc3BlY2lmaWVkXFxcIik7aWYod2luZG93LlByb2Nlc3NpbmcubG9nZ2VyPXtsb2c6ZnVuY3Rpb24oYSl7U2subWlzY2V2YWwucHJpbnRfKGEpfX0sbT13aW5kb3cuUHJvY2Vzc2luZy5nZXRJbnN0YW5jZUJ5SWQoU2suY2FudmFzKSxtJiZtLmV4aXQoKSxqLnA9bmV3IHdpbmRvdy5Qcm9jZXNzaW5nKGEsZnVuY3Rpb24gc2tldGNoUHJvYyhhKXtqLnByb2Nlc3Npbmc9YSxhLmRyYXc9ZnVuY3Rpb24oKXt2YXIgYj0hMTtmb3IodmFyIGMgaW4gaykwPT09a1tjXS53aWR0aCYmKGI9ITApO2lmKCEwPT1iKXJldHVybiEwPT09bD92b2lkIDA6dm9pZCBhLmxvb3AoKTtpZighMT09PWwmJmEubm9Mb29wKCksai5mcmFtZUNvdW50PWEuZnJhbWVDb3VudCxTay5nbG9iYWxzLmRyYXcpdHJ5e1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5nbG9iYWxzLmRyYXcpfWNhdGNoKGEpe1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGEpfX07dmFyIGI9W1xcXCJzZXR1cFxcXCIsXFxcIm1vdXNlTW92ZWRcXFwiLFxcXCJtb3VzZUNsaWNrZWRcXFwiLFxcXCJtb3VzZURyYWdnZWRcXFwiLFxcXCJtb3VzZU1vdmVkXFxcIixcXFwibW91c2VPdXRcXFwiLFxcXCJtb3VzZU92ZXJcXFwiLFxcXCJtb3VzZVByZXNzZWRcXFwiLFxcXCJtb3VzZVJlbGVhc2VkXFxcIixcXFwia2V5UHJlc3NlZFxcXCIsXFxcImtleVJlbGVhc2VkXFxcIixcXFwia2V5VHlwZWRcXFwiXTtmb3IodmFyIGMgaW4gYilTay5nbG9iYWxzW2JbY11dJiYoYVtiW2NdXT1uZXcgRnVuY3Rpb24oXFxcInRyeSB7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmdsb2JhbHNbJ1xcXCIrYltjXStcXFwiJ10pO30gY2F0Y2goZSkge1NrLnVuY2F1Z2h0RXhjZXB0aW9uKGUpO31cXFwiKSl9KSwwPT09ai53aWR0aC52JiYwPT09ai5oZWlnaHQudil7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLnNpemUsW25ldyBTay5idWlsdGluLmludF8oYiksbmV3IFNrLmJ1aWx0aW4uaW50XyhjKSxqLnJlbmRlck1vZGVdKX19KSxnPWZ1bmN0aW9uKGEsYil7Yi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5tb3VzZVgpOlxcXCJ5XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VZKTpcXFwicHhcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VYKTpcXFwicHlcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5wbW91c2VZKTpcXFwicHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLmJvb2woai5wcm9jZXNzaW5nLl9fbW91c2VQcmVzc2VkKTpcXFwiYnV0dG9uXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcubW91c2VCdXR0b24pOnZvaWQgMH0pfSxqLk1vdXNlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixnLFxcXCJNb3VzZVxcXCIsW10pLGoubW91c2U9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouTW91c2UpLGY9ZnVuY3Rpb24oYSxiKXtiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJrZXlcXFwiPT09Yik/bmV3IFNrLmJ1aWx0aW4uc3RyKGoucHJvY2Vzc2luZy5rZXkudG9TdHJpbmcoKSk6XFxcImtleUNvZGVcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGoucHJvY2Vzc2luZy5rZXlDb2RlKTpcXFwia2V5UHJlc3NlZFxcXCI9PT1iP25ldyBTay5idWlsdGluLnN0cihqLnByb2Nlc3Npbmcua2V5UHJlc3NlZCk6dm9pZCAwfSl9LGouS2V5Ym9hcmQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGYsXFxcIktleWJvYXJkXFxcIixbXSksai5rZXlib2FyZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5LZXlib2FyZCksZT1mdW5jdGlvbihhLGIpe2IuX19nZXRhdHRyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybihiPVNrLmZmaS5yZW1hcFRvSnMoYiksXFxcImZyYW1lQ291bnRcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3NpbmcuZnJhbWVDb3VudCk6XFxcImZyYW1lUmF0ZVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmZyYW1lUmF0ZSk6XFxcImhlaWdodFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOlxcXCJvbmxpbmVcXFwiPT09Yj9uZXcgU2suYnVpbHRpbi5ib29sKGoucHJvY2Vzc2luZy5vbmxpbmUpOlxcXCJmb2N1c2VkXFxcIj09PWI/bmV3IFNrLmJ1aWx0aW4uYm9vbChqLnByb2Nlc3NpbmcuZm9jdXNlZCk6dm9pZCAwfSl9LGouRW52aXJvbm1lbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGUsXFxcIkVudmlyb25tZW50XFxcIixbXSksai5lbnZpcm9ubWVudD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5FbnZpcm9ubWVudCksZD1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnBpeGVscz1udWxsfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwiaGVpZ2h0XFxcIj09PWIpP1NrLmJ1aWx0aW4uYXNzayQoai5wcm9jZXNzaW5nLmhlaWdodCk6XFxcIndpZHRoXFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChqLnByb2Nlc3Npbmcud2lkdGgpOihcXFwicGl4ZWxzXFxcIj09PWImJm51bGw9PWEucGl4ZWxzJiYoYS5waXhlbHM9bmV3IFNrLmJ1aWx0aW4ubGlzdChqLnByb2Nlc3NpbmcucGl4ZWxzLnRvQXJyYXkoKSkpLGEucGl4ZWxzKX0pfSxqLlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZCxcXFwiU2NyZWVuXFxcIixbXSksai5zY3JlZW49U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouU2NyZWVuKSxqLmxvYWRQaXhlbHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe2oucHJvY2Vzc2luZy5sb2FkUGl4ZWxzKCl9KSxjPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQsZSl7XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiBjJiYoYz1jLnYpLFxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2YgZCYmKGQ9ZC52KSxcXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIGUmJihlPWUudiksYS52PWoucHJvY2Vzc2luZy5jb2xvcihiLnYsYyxkLGUpfSl9LGouY29sb3I9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGMsXFxcImNvbG9yXFxcIixbXSksai5yZWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcucmVkKGEudikpfSksai5ncmVlbj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ncmVlbihhLnYpKX0pLGouYmx1ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGoucHJvY2Vzc2luZy5ibHVlKGEudikpfSksYj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEltYWdlOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYz9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYpOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBJbWFnZShiLnYsYy52LGQudil9KSxiLl9fZ2V0YXR0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1Tay5mZmkucmVtYXBUb0pzKGIpLFxcXCJ3aWR0aFxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LndpZHRoKTpcXFwiaGVpZ2h0XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYuaGVpZ2h0KTp2b2lkIDB9KX0sai5sb2FkSW1hZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1qLnByb2Nlc3NpbmcubG9hZEltYWdlKGEudik7ay5wdXNoKGIpO3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBJbWFnZSk7cmV0dXJuIGMudj1iLGN9KSxqLmltYWdlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/ai5wcm9jZXNzaW5nLmltYWdlKGEudixiLnYsYy52KTpqLnByb2Nlc3NpbmcuaW1hZ2UoYS52LGIudixjLnYsZC52LGUudil9KSxqLmdldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9ai5wcm9jZXNzaW5nLmdldChhLnYsYi52KTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouY29sb3IsW25ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLnJlZChjKSksbmV3IFNrLmJ1aWx0aW4uaW50XyhqLnByb2Nlc3NpbmcuZ3JlZW4oYykpLG5ldyBTay5idWlsdGluLmludF8oai5wcm9jZXNzaW5nLmJsdWUoYykpXSl9KSxqLnNldD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXtqLnByb2Nlc3Npbmcuc2V0KGEudixiLnYsYy52KX0pLGg9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7YS52PVxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgYj9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3I6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP25ldyBqLnByb2Nlc3NpbmcuUFZlY3RvcihiLnYsYy52KTpuZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwieFxcXCI9PT1iKT9Tay5idWlsdGluLmFzc2skKGEudi54KTpcXFwieVxcXCI9PT1iP1NrLmJ1aWx0aW4uYXNzayQoYS52LnkpOlxcXCJ6XFxcIj09PWI/U2suYnVpbHRpbi5hc3NrJChhLnYueik6dm9pZCAwfSksYi5nZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYi52PWEudi5nZXQoKSxifSksYi5zZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/YS52LnNldChiLnYsYy52KTphLnYuc2V0KGIudixjLnYsZC52KX0pLGIubWFnPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYXNzayQoYS52Lm1hZygpKX0pLGIuYWRkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoai5QVmVjdG9yKTtyZXR1cm4gYy52PWEudi5hZGQoYi52KSxjfSksYi5zdWI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LnN1YihiLnYpLGN9KSxiLm11bHQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52Lm11bHQoYi52KSxjfSksYi5kaXY9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShqLlBWZWN0b3IpO3JldHVybiBjLnY9YS52LmRpdihiLnYpLGN9KSxiLmRpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLmFzc2skKGEudi5kaXN0KGIudikpfSksYi5kb3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/U2suYnVpbHRpbi5hc3NrJChhLnYuZG90KGIudikpOlNrLmJ1aWx0aW4uYXNzayQoYS52LmRvdChiLnYsYy52LGQudikpfSksYi5jcm9zcz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFZlY3Rvcik7cmV0dXJuIGMudj1hLnYuY3Jvc3MoYi52KSxjfSksYi5ub3JtYWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYubm9ybWFsaXplKCl9KSxiLmxpbWl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYubGltaXQoYi52KX0pLGIuYW5nbGVCZXR3ZWVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChhLnYuYW5nbGVCZXR3ZWVuKGIudikpfSksYi5hcnJheT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEudi5hcnJheSgpKX0pfSxmb250Q2xhc3M9ZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBiP25ldyBqLnByb2Nlc3NpbmcuUEZvbnQ6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudil9KSxiLmxpc3Q9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYubGlzdCgpKX0pfSxncmFwaGljc0NsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yOlxcXCJ1bmRlZmluZWRcXFwiPT10eXBlb2YgZD9uZXcgai5wcm9jZXNzaW5nLlBWZWN0b3IoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QVmVjdG9yKGIudixjLnYsZC52KX0pLGIuYmVnaW5EcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmJlZ2luRHJhdygpfSksYi5lbmREcmF3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmVuZERyYXcoKX0pfSxzaGFwZUNsYXNzPWZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2Eudj1cXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGI/bnVsbDpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52KTpcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGQ/bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudik6bmV3IGoucHJvY2Vzc2luZy5QU2hhcGVTVkcoYi52LGMudixkLnYpfSksYi5fX2dldGF0dHJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7cmV0dXJuKGI9U2suZmZpLnJlbWFwVG9KcyhiKSxcXFwid2lkdGhcXFwiPT09Yik/U2suYnVpbHRpbi5hc3NrJChhLnYud2lkdGgpOlxcXCJoZWlnaHRcXFwiPT09Yj9Tay5idWlsdGluLmFzc2skKGEudi5oZWlnaHQpOnZvaWQgMH0pLGIuaXNWaXNpYmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYS52LmlzVmlzaWJsZSgpKX0pLGIuc2V0VmlzaWJsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnNldFZpc2libGUoYi52KX0pLGIuZGlzYWJsZVN0eWxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LmRpc2FibGVTdHlsZSgpfSksYi5lbmFibGVTdHlsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Eudi5lbmFibGVTdHlsZSgpfSksYi5nZXRDaGlsZD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LmdldENoaWxkKGIudik7aWYobnVsbCE9Yyl7dmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGouUFNoYXBlU1ZHKTtyZXR1cm4gZC52PWMsZH1yZXR1cm4gbnVsbH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCl7XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi50cmFuc2xhdGUoYi52LGMudik6YS52LnRyYW5zbGF0ZShiLnYsYy52LGQudil9KSxiLnJvdGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52LnJvdGF0ZShiLnYpfSksYi5yb3RhdGVYPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnYucm90YXRlWChiLnYpfSksYi5yb3RhdGVZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS52LnJvdGF0ZVkoYW5nbGUudil9KSxiLnJvdGF0ZVo9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnYucm90YXRlWihhbmdsZS52KX0pLGIuc2NhbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtcXFwidW5kZWZpbmVkXFxcIj09dHlwZW9mIGM/YS52LnNjYWxlKGIudik6XFxcInVuZGVmaW5lZFxcXCI9PXR5cGVvZiBkP2Eudi5zY2FsZShiLnYsYy52KTphLnYuc2NhbGUoYi52LGMudixkLnYpfSl9LGouUEZvbnQ9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLGZvbnRDbGFzcyxcXFwiUEZvbnRcXFwiLFtdKSxqLlBHcmFwaGljcz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosZ3JhcGhpY3NDbGFzcyxcXFwiUEdyYXBoaWNzXFxcIixbXSksai5QU2hhcGVTVkc9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhqLHNoYXBlQ2xhc3MsXFxcIlBTaGFwZVNWR1xcXCIsW10pLGouUFZlY3Rvcj1Tay5taXNjZXZhbC5idWlsZENsYXNzKGosaCxcXFwiUFZlY3RvclxcXCIsW10pLGouUEltYWdlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoaixiLFxcXCJQSW1hZ2VcXFwiLFtdKSxqfTtcIixcInNyYy9saWIvcHJvZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHJvZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3BzdGF0cy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHN0YXRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHR5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJwdHkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weV9jb21waWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweV9jb21waWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvcHljbGJyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJweWNsYnIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicHlkb2MgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9weWRvY190b3BpY3MucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInB5ZG9jX3RvcGljcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL19faW5pdF9fLnB5XCI6XCJcIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvX19pbml0X18ucHlcIjpcIlxcbiNfX2FsbF9fID0gW1xcXCJzdGFja1xcXCJdXFxuXFxuXFxuZnJvbSAuc3RhY2sgaW1wb3J0IFN0YWNrXFxuZnJvbSAucXVldWUgaW1wb3J0IFF1ZXVlXFxuZnJvbSAuZGVxdWUgaW1wb3J0IERlcXVlXFxuXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL2RlcXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgZGVxdWUucHlcXG5cXG5cXG5jbGFzcyBEZXF1ZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIGFkZEZyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFkZFJlYXIoc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmluc2VydCgwLCBpdGVtKVxcblxcbiAgICBkZWYgcmVtb3ZlRnJvbnQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlUmVhcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvYmFzaWMvcXVldWUucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jXFxuIyBxdWV1ZS5weVxcblxcblxcbmNsYXNzIFF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzRW1wdHkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcyA9PSBbXVxcblxcbiAgICBkZWYgZW5xdWV1ZShzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiBkZXF1ZXVlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2Jhc2ljL3N0YWNrLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuI1xcbiMgc3RhY2sucHlcXG5cXG5cXG5jbGFzcyBTdGFjazpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMgPT0gW11cXG5cXG4gICAgZGVmIHB1c2goc2VsZiwgaXRlbSk6XFxuICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKVxcblxcbiAgICBkZWYgcG9wKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKClcXG5cXG4gICAgZGVmIHBlZWsoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tsZW4oc2VsZi5pdGVtcykgLSAxXVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCJcXG5cXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIC5hZGpHcmFwaCBpbXBvcnQgVmVydGV4XFxuZnJvbSAucHJpb3JpdHlRdWV1ZSBpbXBvcnQgUHJpb3JpdHlRdWV1ZVxcblwiLFwic3JjL2xpYi9weXRob25kcy9ncmFwaHMvYWRqR3JhcGgucHlcIjpcIiNcXG4jICBhZGpHcmFwaFxcbiNcXG4jICBDcmVhdGVkIGJ5IEJyYWQgTWlsbGVyIG9uIDIwMDUtMDItMjQuXFxuIyAgQ29weXJpZ2h0IChjKSAyMDA1IEJyYWQgTWlsbGVyLCBEYXZpZCBSYW51bSwgTHV0aGVyIENvbGxlZ2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXFxuI1xcblxcbmltcG9ydCBzeXNcXG5pbXBvcnQgb3NcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5jbGFzcyBHcmFwaDpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi52ZXJ0aWNlcyA9IHt9XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gMFxcbiAgICAgICAgXFxuICAgIGRlZiBhZGRWZXJ0ZXgoc2VsZixrZXkpOlxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IHNlbGYubnVtVmVydGljZXMgKyAxXFxuICAgICAgICBuZXdWZXJ0ZXggPSBWZXJ0ZXgoa2V5KVxcbiAgICAgICAgc2VsZi52ZXJ0aWNlc1trZXldID0gbmV3VmVydGV4XFxuICAgICAgICByZXR1cm4gbmV3VmVydGV4XFxuICAgIFxcbiAgICBkZWYgZ2V0VmVydGV4KHNlbGYsbik6XFxuICAgICAgICBpZiBuIGluIHNlbGYudmVydGljZXM6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYudmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi52ZXJ0aWNlc1xcbiAgICBcXG4gICAgZGVmIGFkZEVkZ2Uoc2VsZixmLHQsY29zdD0wKTpcXG4gICAgICAgICAgICBpZiBmIG5vdCBpbiBzZWxmLnZlcnRpY2VzOlxcbiAgICAgICAgICAgICAgICBudiA9IHNlbGYuYWRkVmVydGV4KGYpXFxuICAgICAgICAgICAgaWYgdCBub3QgaW4gc2VsZi52ZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFkZFZlcnRleCh0KVxcbiAgICAgICAgICAgIHNlbGYudmVydGljZXNbZl0uYWRkTmVpZ2hib3Ioc2VsZi52ZXJ0aWNlc1t0XSxjb3N0KVxcbiAgICBcXG4gICAgZGVmIGdldFZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi52ZXJ0aWNlcy5rZXlzKCkpXFxuICAgICAgICBcXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi52ZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGV4OlxcbiAgICBkZWYgX19pbml0X18oc2VsZixudW0pOlxcbiAgICAgICAgc2VsZi5pZCA9IG51bVxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUbyA9IHt9XFxuICAgICAgICBzZWxmLmNvbG9yID0gJ3doaXRlJ1xcbiAgICAgICAgc2VsZi5kaXN0ID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYucHJlZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuZGlzYyA9IDBcXG4gICAgICAgIHNlbGYuZmluID0gMFxcblxcbiAgICAjIGRlZiBfX2x0X18oc2VsZixvKTpcXG4gICAgIyAgICAgcmV0dXJuIHNlbGYuaWQgPCBvLmlkXFxuICAgIFxcbiAgICBkZWYgYWRkTmVpZ2hib3Ioc2VsZixuYnIsd2VpZ2h0PTApOlxcbiAgICAgICAgc2VsZi5jb25uZWN0ZWRUb1tuYnJdID0gd2VpZ2h0XFxuICAgICAgICBcXG4gICAgZGVmIHNldENvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIHNldERpc3RhbmNlKHNlbGYsZCk6XFxuICAgICAgICBzZWxmLmRpc3QgPSBkXFxuXFxuICAgIGRlZiBzZXRQcmVkKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWQgPSBwXFxuXFxuICAgIGRlZiBzZXREaXNjb3Zlcnkoc2VsZixkdGltZSk6XFxuICAgICAgICBzZWxmLmRpc2MgPSBkdGltZVxcbiAgICAgICAgXFxuICAgIGRlZiBzZXRGaW5pc2goc2VsZixmdGltZSk6XFxuICAgICAgICBzZWxmLmZpbiA9IGZ0aW1lXFxuICAgICAgICBcXG4gICAgZGVmIGdldEZpbmlzaChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmZpblxcbiAgICAgICAgXFxuICAgIGRlZiBnZXREaXNjb3Zlcnkoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5kaXNjXFxuICAgICAgICBcXG4gICAgZGVmIGdldFByZWQoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wcmVkXFxuICAgICAgICBcXG4gICAgZGVmIGdldERpc3RhbmNlKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdFxcbiAgICAgICAgXFxuICAgIGRlZiBnZXRDb2xvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbG9yXFxuICAgIFxcbiAgICBkZWYgZ2V0Q29ubmVjdGlvbnMoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0ZWRUby5rZXlzKClcXG4gICAgICAgIFxcbiAgICBkZWYgZ2V0V2VpZ2h0KHNlbGYsbmJyKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3RlZFRvW25icl1cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRpc2MgXFxcIiArIHN0cihzZWxmLmRpc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3QgXFxcIiArIHN0cihzZWxmLmRpc3QpICsgXFxcIjpwcmVkIFxcXFxuXFxcXHRbXFxcIiArIHN0cihzZWxmLnByZWQpKyBcXFwiXVxcXFxuXFxcIlxcbiAgICBcXG4gICAgZGVmIGdldElkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cXG5jbGFzcyBhZGpHcmFwaFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50R3JhcGggPSBHcmFwaCgpXFxuICAgICAgICBcXG4gICAgZGVmIHRlc3RNYWtlR3JhcGgoc2VsZik6XFxuICAgICAgICBnRmlsZSA9IG9wZW4oXFxcInRlc3QuZGF0XFxcIilcXG4gICAgICAgIGZvciBsaW5lIGluIGdGaWxlOlxcbiAgICAgICAgICAgIGZWZXJ0ZXgsIHRWZXJ0ZXggPSBsaW5lLnNwbGl0KCd8JylcXG4gICAgICAgICAgICBmVmVydGV4ID0gaW50KGZWZXJ0ZXgpXFxuICAgICAgICAgICAgdFZlcnRleCA9IGludCh0VmVydGV4KVxcbiAgICAgICAgICAgIHNlbGYudEdyYXBoLmFkZEVkZ2UoZlZlcnRleCx0VmVydGV4KVxcbiAgICAgICAgZm9yIGkgaW4gc2VsZi50R3JhcGg6XFxuICAgICAgICAgICAgYWRqID0gaS5nZXRBZGooKVxcbiAgICAgICAgICAgIGZvciBrIGluIGFkajpcXG4gICAgICAgICAgICAgICAgcHJpbnQoaSwgaylcXG5cXG4gICAgICAgIFxcbmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6XFxuICAgIHVuaXR0ZXN0Lm1haW4oKVxcbiAgICAgICAgICAgICAgXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL2dyYXBocy9wcmlvcml0eVF1ZXVlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1XFxuIyBcXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG4jIHRoaXMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IGhlYXAgdGFrZXMga2V5IHZhbHVlIHBhaXJzLFxcbiMgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgYWxsIGNvbXBhcmFibGVcXG5cXG5jbGFzcyBQcmlvcml0eVF1ZXVlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBBcnJheSA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSAwXFxuXFxuICAgIGRlZiBidWlsZEhlYXAoc2VsZixhbGlzdCk6XFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gbGVuKGFsaXN0KVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkgPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiBhbGlzdDpcXG4gICAgICAgICAgICBzZWxmLmhlYXBBcnJheS5hcHBlbmQoaSlcXG4gICAgICAgIGkgPSBsZW4oYWxpc3QpIC8vIDIgICAgICAgICAgICBcXG4gICAgICAgIHdoaWxlIChpID4gMCk6XFxuICAgICAgICAgICAgc2VsZi5wZXJjRG93bihpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgcGVyY0Rvd24oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi5jdXJyZW50U2l6ZTpcXG4gICAgICAgICAgICBtYyA9IHNlbGYubWluQ2hpbGQoaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBBcnJheVtpXVswXSA+IHNlbGYuaGVhcEFycmF5W21jXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaV1cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSBzZWxmLmhlYXBBcnJheVttY11cXG4gICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbWNdID0gdG1wXFxuICAgICAgICAgICAgaSA9IG1jXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgbWluQ2hpbGQoc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgcmV0dXJuIC0xXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGkqMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFwQXJyYXlbaSoyXVswXSA8IHNlbGYuaGVhcEFycmF5W2kqMisxXVswXTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpKjIrMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzBdIDwgc2VsZi5oZWFwQXJyYXlbaS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5oZWFwQXJyYXlbaS8vMl1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBBcnJheVtpLy8yXSA9IHNlbGYuaGVhcEFycmF5W2ldXFxuICAgICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbaV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaS8vMlxcbiBcXG4gICAgZGVmIGFkZChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXkuYXBwZW5kKGspXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSArIDFcXG4gICAgICAgIHNlbGYucGVyY1VwKHNlbGYuY3VycmVudFNpemUpXFxuXFxuICAgIGRlZiBkZWxNaW4oc2VsZik6XFxuICAgICAgICByZXR2YWwgPSBzZWxmLmhlYXBBcnJheVsxXVsxXVxcbiAgICAgICAgc2VsZi5oZWFwQXJyYXlbMV0gPSBzZWxmLmhlYXBBcnJheVtzZWxmLmN1cnJlbnRTaXplXVxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IHNlbGYuY3VycmVudFNpemUgLSAxXFxuICAgICAgICBzZWxmLmhlYXBBcnJheS5wb3AoKVxcbiAgICAgICAgc2VsZi5wZXJjRG93bigxKVxcbiAgICAgICAgcmV0dXJuIHJldHZhbFxcbiAgICAgICAgXFxuICAgIGRlZiBpc0VtcHR5KHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5jdXJyZW50U2l6ZSA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblxcbiAgICBkZWYgZGVjcmVhc2VLZXkoc2VsZix2YWwsYW10KTpcXG4gICAgICAgICMgdGhpcyBpcyBhIGxpdHRsZSB3aWVyZCwgYnV0IHdlIG5lZWQgdG8gZmluZCB0aGUgaGVhcCB0aGluZyB0byBkZWNyZWFzZSBieVxcbiAgICAgICAgIyBsb29raW5nIGF0IGl0cyB2YWx1ZVxcbiAgICAgICAgZG9uZSA9IEZhbHNlXFxuICAgICAgICBpID0gMVxcbiAgICAgICAgbXlLZXkgPSAwXFxuICAgICAgICB3aGlsZSBub3QgZG9uZSBhbmQgaSA8PSBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcEFycmF5W2ldWzFdID09IHZhbDpcXG4gICAgICAgICAgICAgICAgZG9uZSA9IFRydWVcXG4gICAgICAgICAgICAgICAgbXlLZXkgPSBpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxXFxuICAgICAgICBpZiBteUtleSA+IDA6XFxuICAgICAgICAgICAgc2VsZi5oZWFwQXJyYXlbbXlLZXldID0gKGFtdCxzZWxmLmhlYXBBcnJheVtteUtleV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5wZXJjVXAobXlLZXkpXFxuICAgICAgICAgICAgXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2dHgpOlxcbiAgICAgICAgZm9yIHBhaXIgaW4gc2VsZi5oZWFwQXJyYXk6XFxuICAgICAgICAgICAgaWYgcGFpclsxXSA9PSB2dHg6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2VcXG4gICAgICAgIFxcbmNsYXNzIFRlc3RCaW5IZWFwKHVuaXR0ZXN0LlRlc3RDYXNlKTpcXG4gICAgZGVmIHNldFVwKHNlbGYpOlxcbiAgICAgICAgc2VsZi50aGVIZWFwID0gUHJpb3JpdHlRdWV1ZSgpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgyLCd4JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCgzLCd5JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg1LCd6JykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg2LCdhJykpXFxuICAgICAgICBzZWxmLnRoZUhlYXAuYWRkKCg0LCdkJykpXFxuXFxuXFxuICAgIGRlZiB0ZXN0SW5zZXJ0KHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5jdXJyZW50U2l6ZSA9PSA1XFxuXFxuICAgIGRlZiB0ZXN0RGVsbWluKHNlbGYpOlxcbiAgICAgICAgYXNzZXJ0IHNlbGYudGhlSGVhcC5kZWxNaW4oKSA9PSAneCdcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ3knXFxuICAgIFxcbiAgICBkZWYgdGVzdERlY0tleShzZWxmKTpcXG4gICAgICAgIHNlbGYudGhlSGVhcC5kZWNyZWFzZUtleSgnZCcsMSlcXG4gICAgICAgIGFzc2VydCBzZWxmLnRoZUhlYXAuZGVsTWluKCkgPT0gJ2QnXFxuICAgICAgICBcXG5pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOlxcbiAgICB1bml0dGVzdC5tYWluKClcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvX19pbml0X18ucHlcIjpcIlxcbmZyb20gLmJpbmFyeVRyZWUgaW1wb3J0IEJpbmFyeVRyZWVcXG5mcm9tIC5iYWxhbmNlIGltcG9ydCBBVkxUcmVlXFxuZnJvbSAuYnN0IGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSAuYmluaGVhcCBpbXBvcnQgQmluSGVhcFxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25kcy90cmVlcy9iYWxhbmNlLnB5XCI6XCIjIS9iaW4vZW52IHB5dGhvbjMuMVxcbiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG4jIFxcblxcbmZyb20gLmJzdCBpbXBvcnQgQmluYXJ5U2VhcmNoVHJlZSwgVHJlZU5vZGVcXG5cXG5jbGFzcyBBVkxUcmVlKEJpbmFyeVNlYXJjaFRyZWUpOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGhhc19rZXkoaylcXG4gICAgICAgICAgICAgICAgICBpdGVtcygpIFxcbiAgICAgICAgICAgICAgICAgIGtleXMoKSBcXG4gICAgICAgICAgICAgICAgICB2YWx1ZXMoKVxcbiAgICAgICAgICAgICAgICAgIHB1dChrLHYpXFxuICAgICcnJ1xcblxcblxcbiAgICBkZWYgX3B1dChzZWxmLGtleSx2YWwsY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudE5vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LHZhbCxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUubGVmdENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkID0gVHJlZU5vZGUoa2V5LHZhbCxwYXJlbnQ9Y3VycmVudE5vZGUpXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQmFsYW5jZShjdXJyZW50Tm9kZS5yaWdodENoaWxkKSAgICAgICAgICAgICAgICBcXG5cXG4gICAgZGVmIHVwZGF0ZUJhbGFuY2Uoc2VsZixub2RlKTpcXG4gICAgICAgIGlmIG5vZGUuYmFsYW5jZUZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlRmFjdG9yIDwgLTE6XFxuICAgICAgICAgICAgc2VsZi5yZWJhbGFuY2Uobm9kZSlcXG4gICAgICAgICAgICByZXR1cm5cXG4gICAgICAgIGlmIG5vZGUucGFyZW50ICE9IE5vbmU6XFxuICAgICAgICAgICAgaWYgbm9kZS5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlRmFjdG9yICs9IDFcXG4gICAgICAgICAgICBlbGlmIG5vZGUuaXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgLT0gMVxcblxcbiAgICAgICAgICAgIGlmIG5vZGUucGFyZW50LmJhbGFuY2VGYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVCYWxhbmNlKG5vZGUucGFyZW50KVxcblxcbiAgICBkZWYgcmViYWxhbmNlKHNlbGYsbm9kZSk6XFxuICAgICAgICBpZiBub2RlLmJhbGFuY2VGYWN0b3IgPCAwOlxcbiAgICAgICAgICAgIGlmIG5vZGUucmlnaHRDaGlsZC5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBMUiBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUucmlnaHRDaGlsZClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVMZWZ0KG5vZGUpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgIyBzaW5nbGUgbGVmdFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZSlcXG4gICAgICAgIGVsaWYgbm9kZS5iYWxhbmNlRmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmxlZnRDaGlsZC5iYWxhbmNlRmFjdG9yIDwgMDpcXG4gICAgICAgICAgICAgICAgIyBEbyBhbiBSTCBSb3RhdGlvblxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUxlZnQobm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlUmlnaHQobm9kZSlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAjIHNpbmdsZSByaWdodFxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZVJpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVMZWZ0KHNlbGYscm90Um9vdCk6XFxuICAgICAgICBuZXdSb290ID0gcm90Um9vdC5yaWdodENoaWxkXFxuICAgICAgICByb3RSb290LnJpZ2h0Q2hpbGQgPSBuZXdSb290LmxlZnRDaGlsZFxcbiAgICAgICAgaWYgbmV3Um9vdC5sZWZ0Q2hpbGQgIT0gTm9uZTpcXG4gICAgICAgICAgICBuZXdSb290LmxlZnRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgIG5ld1Jvb3QubGVmdENoaWxkID0gcm90Um9vdFxcbiAgICAgICAgcm90Um9vdC5wYXJlbnQgPSBuZXdSb290XFxuICAgICAgICByb3RSb290LmJhbGFuY2VGYWN0b3IgPSByb3RSb290LmJhbGFuY2VGYWN0b3IgKyAxIC0gbWluKG5ld1Jvb3QuYmFsYW5jZUZhY3RvciwgMClcXG4gICAgICAgIG5ld1Jvb3QuYmFsYW5jZUZhY3RvciA9IG5ld1Jvb3QuYmFsYW5jZUZhY3RvciArIDEgKyBtYXgocm90Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcblxcblxcbiAgICBkZWYgcm90YXRlUmlnaHQoc2VsZixyb3RSb290KTpcXG4gICAgICAgIG5ld1Jvb3QgPSByb3RSb290LmxlZnRDaGlsZFxcbiAgICAgICAgcm90Um9vdC5sZWZ0Q2hpbGQgPSBuZXdSb290LnJpZ2h0Q2hpbGRcXG4gICAgICAgIGlmIG5ld1Jvb3QucmlnaHRDaGlsZCAhPSBOb25lOlxcbiAgICAgICAgICAgIG5ld1Jvb3QucmlnaHRDaGlsZC5wYXJlbnQgPSByb3RSb290XFxuICAgICAgICBuZXdSb290LnBhcmVudCA9IHJvdFJvb3QucGFyZW50XFxuICAgICAgICBpZiByb3RSb290LmlzUm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IG5ld1Jvb3RcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgcm90Um9vdC5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgcm90Um9vdC5wYXJlbnQucmlnaHRDaGlsZCA9IG5ld1Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RSb290LnBhcmVudC5sZWZ0Q2hpbGQgPSBuZXdSb290XFxuICAgICAgICBuZXdSb290LnJpZ2h0Q2hpbGQgPSByb3RSb290XFxuICAgICAgICByb3RSb290LnBhcmVudCA9IG5ld1Jvb3RcXG4gICAgICAgIHJvdFJvb3QuYmFsYW5jZUZhY3RvciA9IHJvdFJvb3QuYmFsYW5jZUZhY3RvciAtIDEgLSBtYXgobmV3Um9vdC5iYWxhbmNlRmFjdG9yLCAwKVxcbiAgICAgICAgbmV3Um9vdC5iYWxhbmNlRmFjdG9yID0gbmV3Um9vdC5iYWxhbmNlRmFjdG9yIC0gMSArIG1pbihyb3RSb290LmJhbGFuY2VGYWN0b3IsIDApXFxuICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMvdHJlZXMvYmluYXJ5VHJlZS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIEludHJvZHVjdGlvbiB0byBEYXRhIFN0cnVjdHVyZXMgYW5kIEFsZ29yaXRobXMgaW4gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAwNVxcbiMgXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG4gICAgXFxcIlxcXCJcXFwiICAgIFxcbiAgICBkZWYgX19pbml0X18oc2VsZixyb290T2JqKTpcXG4gICAgICAgIHNlbGYua2V5ID0gcm9vdE9ialxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBOb25lXFxuICAgICAgICBzZWxmLnJpZ2h0Q2hpbGQgPSBOb25lXFxuXFxuICAgIGRlZiBpbnNlcnRMZWZ0KHNlbGYsbmV3Tm9kZSk6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQmluYXJ5VHJlZShuZXdOb2RlKVxcbiAgICAgICAgICAgIHQubGVmdCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSB0XFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0UmlnaHQoc2VsZixuZXdOb2RlKTpcXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZCA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgdCA9IEJpbmFyeVRyZWUobmV3Tm9kZSlcXG4gICAgICAgICAgICB0LnJpZ2h0ID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkID0gdFxcblxcbiAgICBkZWYgaXNMZWFmKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuICgobm90IHNlbGYubGVmdENoaWxkKSBhbmQgKG5vdCBzZWxmLnJpZ2h0Q2hpbGQpKVxcblxcbiAgICBkZWYgZ2V0UmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG5cXG4gICAgZGVmIGdldExlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgc2V0Um9vdFZhbChzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmtleSA9IG9ialxcblxcbiAgICBkZWYgZ2V0Um9vdFZhbChzZWxmLCk6XFxuICAgICAgICByZXR1cm4gc2VsZi5rZXlcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5pbm9yZGVyKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5pbm9yZGVyKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLmtleSlcXG5cXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5rZXkpXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICBzZWxmLmxlZnRDaGlsZC5wcmVvcmRlcigpXFxuICAgICAgICBpZiBzZWxmLnJpZ2h0Q2hpbGQ6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnByZW9yZGVyKClcXG5cXG4gICAgZGVmIHByaW50ZXhwKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5sZWZ0Q2hpbGQ6XFxuICAgICAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnByaW50ZXhwKClcXG4gICAgICAgIHByaW50KHNlbGYua2V5KVxcbiAgICAgICAgaWYgc2VsZi5yaWdodENoaWxkOlxcbiAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wcmludGV4cCgpXFxuICAgICAgICAgICAgcHJpbnQoJyknKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyZXZhbChzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmxlZnRDaGlsZDpcXG4gICAgICAgICAgICByZXMxID0gc2VsZi5sZWZ0Q2hpbGQucG9zdG9yZGVyZXZhbCgpICAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIGlmIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5yaWdodENoaWxkLnBvc3RvcmRlcmV2YWwoKSAjLy8gXFxcXGxhYmVse3BlcmlnaHR9XFxuICAgICAgICBpZiByZXMxIGFuZCByZXMyOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyc1tzZWxmLmtleV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYua2V5XFxuXFxuZGVmIGlub3JkZXIodHJlZSk6XFxuICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgIGlub3JkZXIodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgICAgIHByaW50KHRyZWUuZ2V0Um9vdFZhbCgpKVxcbiAgICAgICAgaW5vcmRlcih0cmVlLmdldFJpZ2h0Q2hpbGQoKSlcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIGlmIHRyZWUubGVmdENoaWxkOlxcbiAgICAgICAgcHJpbnQoJygnKVxcbiAgICAgICAgcHJpbnRleHAodHJlZS5nZXRMZWZ0Q2hpbGQoKSlcXG4gICAgcHJpbnQodHJlZS5nZXRSb290VmFsKCkpXFxuICAgIGlmIHRyZWUucmlnaHRDaGlsZDpcXG4gICAgICAgIHByaW50ZXhwKHRyZWUuZ2V0UmlnaHRDaGlsZCgpKVxcbiAgICAgICAgcHJpbnQoJyknKSBcXG5cXG5kZWYgcHJpbnRleHAodHJlZSk6XFxuICAgIHNWYWwgPSBcXFwiXFxcIlxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgc1ZhbCA9ICcoJyArIHByaW50ZXhwKHRyZWUuZ2V0TGVmdENoaWxkKCkpXFxuICAgICAgICBzVmFsID0gc1ZhbCArIHN0cih0cmVlLmdldFJvb3RWYWwoKSlcXG4gICAgICAgIHNWYWwgPSBzVmFsICsgcHJpbnRleHAodHJlZS5nZXRSaWdodENoaWxkKCkpICsgJyknXFxuICAgIHJldHVybiBzVmFsXFxuXFxuZGVmIHBvc3RvcmRlcmV2YWwodHJlZSk6XFxuICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICByZXMxID0gTm9uZVxcbiAgICByZXMyID0gTm9uZVxcbiAgICBpZiB0cmVlOlxcbiAgICAgICAgcmVzMSA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRMZWZ0Q2hpbGQoKSkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgcmVzMiA9IHBvc3RvcmRlcmV2YWwodHJlZS5nZXRSaWdodENoaWxkKCkpICMvLyBcXFxcbGFiZWx7cGVyaWdodH1cXG4gICAgICAgIGlmIHJlczEgYW5kIHJlczI6XFxuICAgICAgICAgICAgcmV0dXJuIG9wZXJzW3RyZWUuZ2V0Um9vdFZhbCgpXShyZXMxLHJlczIpICMvLyBcXFxcbGFiZWx7cGVldmFsfVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gdHJlZS5nZXRSb290VmFsKClcXG5cXG5kZWYgaGVpZ2h0KHRyZWUpOlxcbiAgICBpZiB0cmVlID09IE5vbmU6XFxuICAgICAgICByZXR1cm4gLTFcXG4gICAgZWxzZTpcXG4gICAgICAgIHJldHVybiAxICsgbWF4KGhlaWdodCh0cmVlLmxlZnRDaGlsZCksaGVpZ2h0KHRyZWUucmlnaHRDaGlsZCkpXFxuXFxuIyB0ID0gQmluYXJ5VHJlZSg3KVxcbiMgdC5pbnNlcnRMZWZ0KDMpXFxuIyB0Lmluc2VydFJpZ2h0KDkpXFxuIyBpbm9yZGVyKHQpXFxuIyBpbXBvcnQgb3BlcmF0b3JcXG4jIHggPSBCaW5hcnlUcmVlKCcqJylcXG4jIHguaW5zZXJ0TGVmdCgnKycpXFxuIyBsID0geC5nZXRMZWZ0Q2hpbGQoKVxcbiMgbC5pbnNlcnRMZWZ0KDQpXFxuIyBsLmluc2VydFJpZ2h0KDUpXFxuIyB4Lmluc2VydFJpZ2h0KDcpXFxuIyBwcmludChwcmludGV4cCh4KSlcXG4jIHByaW50KHBvc3RvcmRlcmV2YWwoeCkpXFxuIyBwcmludChoZWlnaHQoeCkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JpbmhlYXAucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBJbnRyb2R1Y3Rpb24gdG8gRGF0YSBTdHJ1Y3R1cmVzIGFuZCBBbGdvcml0aG1zIGluIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMDVcXG4jIFxcblxcbiMgdGhpcyBoZWFwIHRha2VzIGtleSB2YWx1ZSBwYWlycywgd2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUga2V5cyBhcmUgaW50ZWdlcnNcXG5jbGFzcyBCaW5IZWFwOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmhlYXBMaXN0ID0gWzBdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gMFxcblxcblxcbiAgICBkZWYgYnVpbGRIZWFwKHNlbGYsYWxpc3QpOlxcbiAgICAgICAgaSA9IGxlbihhbGlzdCkgLy8gMlxcbiAgICAgICAgc2VsZi5jdXJyZW50U2l6ZSA9IGxlbihhbGlzdClcXG4gICAgICAgIHNlbGYuaGVhcExpc3QgPSBbMF0gKyBhbGlzdFs6XVxcbiAgICAgICAgcHJpbnQobGVuKHNlbGYuaGVhcExpc3QpLCBpKVxcbiAgICAgICAgd2hpbGUgKGkgPiAwKTpcXG4gICAgICAgICAgICBwcmludChzZWxmLmhlYXBMaXN0LCBpKVxcbiAgICAgICAgICAgIHNlbGYucGVyY0Rvd24oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgIHByaW50KHNlbGYuaGVhcExpc3QsaSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIHBlcmNEb3duKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYuY3VycmVudFNpemU6XFxuICAgICAgICAgICAgbWMgPSBzZWxmLm1pbkNoaWxkKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5oZWFwTGlzdFtpXSA+IHNlbGYuaGVhcExpc3RbbWNdOlxcbiAgICAgICAgICAgICAgICB0bXAgPSBzZWxmLmhlYXBMaXN0W2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaV0gPSBzZWxmLmhlYXBMaXN0W21jXVxcbiAgICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W21jXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBtY1xcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIG1pbkNoaWxkKHNlbGYsaSk6XFxuICAgICAgICBpZiBpICogMiArIDEgPiBzZWxmLmN1cnJlbnRTaXplOlxcbiAgICAgICAgICAgIHJldHVybiBpICogMlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhlYXBMaXN0W2kgKiAyXSA8IHNlbGYuaGVhcExpc3RbaSAqIDIgKyAxXTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgKiAyICsgMVxcblxcbiAgICBkZWYgcGVyY1VwKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSBpIC8vIDIgPiAwOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGVhcExpc3RbaV0gPCBzZWxmLmhlYXBMaXN0W2kvLzJdOlxcbiAgICAgICAgICAgICAgIHRtcCA9IHNlbGYuaGVhcExpc3RbaSAvLyAyXVxcbiAgICAgICAgICAgICAgIHNlbGYuaGVhcExpc3RbaSAvLyAyXSA9IHNlbGYuaGVhcExpc3RbaV1cXG4gICAgICAgICAgICAgICBzZWxmLmhlYXBMaXN0W2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkgLy8gMlxcbiBcXG4gICAgZGVmIGluc2VydChzZWxmLGspOlxcbiAgICAgICAgc2VsZi5oZWFwTGlzdC5hcHBlbmQoaylcXG4gICAgICAgIHNlbGYuY3VycmVudFNpemUgPSBzZWxmLmN1cnJlbnRTaXplICsgMVxcbiAgICAgICAgc2VsZi5wZXJjVXAoc2VsZi5jdXJyZW50U2l6ZSlcXG5cXG4gICAgZGVmIGRlbE1pbihzZWxmKTpcXG4gICAgICAgIHJldHZhbCA9IHNlbGYuaGVhcExpc3RbMV1cXG4gICAgICAgIHNlbGYuaGVhcExpc3RbMV0gPSBzZWxmLmhlYXBMaXN0W3NlbGYuY3VycmVudFNpemVdXFxuICAgICAgICBzZWxmLmN1cnJlbnRTaXplID0gc2VsZi5jdXJyZW50U2l6ZSAtIDFcXG4gICAgICAgIHNlbGYuaGVhcExpc3QucG9wKClcXG4gICAgICAgIHNlbGYucGVyY0Rvd24oMSlcXG4gICAgICAgIHJldHVybiByZXR2YWxcXG4gICAgICAgIFxcbiAgICBkZWYgaXNFbXB0eShzZWxmKTpcXG4gICAgICAgIGlmIGN1cnJlbnRTaXplID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzL3RyZWVzL2JzdC5weVwiOlwiIyEvYmluL2VudiBweXRob24zLjFcXG4jIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgSW50cm9kdWN0aW9uIHRvIERhdGEgU3RydWN0dXJlcyBhbmQgQWxnb3JpdGhtcyBpbiBQeXRob25cXG4jIENvcHlyaWdodCAyMDA1LCAyMDEwXFxuIyBcXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICAnJydcXG4gICAgQXV0aG9yOiAgQnJhZCBNaWxsZXJcXG4gICAgRGF0ZTogIDEvMTUvMjAwNVxcbiAgICBEZXNjcmlwdGlvbjogIEltbGVtZW50IGEgYmluYXJ5IHNlYXJjaCB0cmVlIHdpdGggdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VcXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbnM6ICBcXG4gICAgICAgICAgICAgICAgICBfX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHhcXG4gICAgICAgICAgICAgICAgICBfX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV1cXG4gICAgICAgICAgICAgICAgICBfX2luaXRfXygpXFxuICAgICAgICAgICAgICAgICAgX19sZW5fXygpIDw9PT4gbGVuKHgpXFxuICAgICAgICAgICAgICAgICAgX19zZXRpdGVtX18oayx2KSA8PT0+IHhba10gPSB2XFxuICAgICAgICAgICAgICAgICAgY2xlYXIoKVxcbiAgICAgICAgICAgICAgICAgIGdldChrKVxcbiAgICAgICAgICAgICAgICAgIGl0ZW1zKCkgXFxuICAgICAgICAgICAgICAgICAga2V5cygpIFxcbiAgICAgICAgICAgICAgICAgIHZhbHVlcygpXFxuICAgICAgICAgICAgICAgICAgcHV0KGssdilcXG4gICAgICAgICAgICAgICAgICBpblxcbiAgICAgICAgICAgICAgICAgIGRlbCA8PT0+IFxcbiAgICAnJydcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5yb290ID0gTm9uZVxcbiAgICAgICAgc2VsZi5zaXplID0gMFxcbiAgICBcXG4gICAgZGVmIHB1dChzZWxmLGtleSx2YWwpOlxcbiAgICAgICAgaWYgc2VsZi5yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLHNlbGYucm9vdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yb290ID0gVHJlZU5vZGUoa2V5LHZhbClcXG4gICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSArIDFcXG5cXG4gICAgZGVmIF9wdXQoc2VsZixrZXksdmFsLGN1cnJlbnROb2RlKTpcXG4gICAgICAgIGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSx2YWwsY3VycmVudE5vZGUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksdmFsLGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZCA9IFRyZWVOb2RlKGtleSx2YWwscGFyZW50PWN1cnJlbnROb2RlKVxcbiAgICAgICAgICAgIFxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZixrLHYpOlxcbiAgICAgICAgc2VsZi5wdXQoayx2KVxcblxcbiAgICBkZWYgZ2V0KHNlbGYsa2V5KTpcXG4gICAgICAgIGlmIHNlbGYucm9vdDpcXG4gICAgICAgICAgICByZXMgPSBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdClcXG4gICAgICAgICAgICBpZiByZXM6XFxuICAgICAgICAgICAgICAgIHJldHVybiByZXMucGF5bG9hZFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBcXG4gICAgZGVmIF9nZXQoc2VsZixrZXksY3VycmVudE5vZGUpOlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnROb2RlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnROb2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlXFxuICAgICAgICBlbGlmIGtleSA8IGN1cnJlbnROb2RlLmtleTpcXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KGtleSxjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgXFxuICAgICAgICBcXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHJlcyA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgICAgICBcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLl9nZXQoa2V5LHNlbGYucm9vdCk6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuICAgICAgICBcXG4gICAgZGVmIGxlbmd0aChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnNpemVcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJvb3QuX19pdGVyX18oKVxcbiAgICBcXG4gICAgZGVmIGRlbGV0ZShzZWxmLGtleSk6XFxuICAgICAgICBpZiBzZWxmLnNpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVUb1JlbW92ZSA9IHNlbGYuX2dldChrZXksc2VsZi5yb290KVxcbiAgICAgICAgICAgIGlmIG5vZGVUb1JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUobm9kZVRvUmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUtMVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG4gICAgICAgIGVsaWYgc2VsZi5zaXplID09IDEgYW5kIHNlbGYucm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYucm9vdCA9IE5vbmVcXG4gICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwga2V5IG5vdCBpbiB0cmVlJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsa2V5KTpcXG4gICAgICAgIHNlbGYuZGVsZXRlKGtleSlcXG4gICAgXFxuICAgIGRlZiByZW1vdmUoc2VsZixjdXJyZW50Tm9kZSk6XFxuICAgICAgICBpZiBjdXJyZW50Tm9kZS5pc0xlYWYoKTogI2xlYWZcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZSA9PSBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5oYXNCb3RoQ2hpbGRyZW4oKTogI2ludGVyaW9yXFxuICAgICAgICAgICAgc3VjYyA9IGN1cnJlbnROb2RlLmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgIHN1Y2Muc3BsaWNlT3V0KClcXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5rZXkgPSBzdWNjLmtleVxcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLnBheWxvYWQgPSBzdWNjLnBheWxvYWRcXG4gICAgICAgIGVsc2U6ICMgdGhpcyBub2RlIGhhcyBvbmUgY2hpbGRcXG4gICAgICAgICAgICBpZiBjdXJyZW50Tm9kZS5oYXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgaWYgY3VycmVudE5vZGUuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5sZWZ0Q2hpbGQgPSBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5wYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcmVudC5yaWdodENoaWxkID0gY3VycmVudE5vZGUubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yZXBsYWNlTm9kZURhdGEoY3VycmVudE5vZGUubGVmdENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQucGF5bG9hZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5sZWZ0Q2hpbGQubGVmdENoaWxkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmxlZnRDaGlsZC5yaWdodENoaWxkKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyZW50LmxlZnRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5pc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGQucGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50XFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5wYXJlbnQucmlnaHRDaGlsZCA9IGN1cnJlbnROb2RlLnJpZ2h0Q2hpbGRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnJlcGxhY2VOb2RlRGF0YShjdXJyZW50Tm9kZS5yaWdodENoaWxkLmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5yaWdodENoaWxkLnBheWxvYWQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5sZWZ0Q2hpbGQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucmlnaHRDaGlsZC5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZXIoc2VsZi5yb290KVxcblxcbiAgICBkZWYgX2lub3JkZXIoc2VsZix0cmVlKTpcXG4gICAgICAgIGlmIHRyZWUgIT0gTm9uZTpcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5yaWdodENoaWxkKVxcblxcbiAgICBkZWYgcG9zdG9yZGVyKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wb3N0b3JkZXIoc2VsZiwgdHJlZSk6XFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUubGVmdENoaWxkKVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5KSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZXIoc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLHNlbGYucm9vdClcXG5cXG4gICAgZGVmIF9wcmVvcmRlcihzZWxmLHRyZWUpOlxcbiAgICAgICAgaWYgdHJlZTpcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSkgICAgICAgICAgICBcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmxlZnRDaGlsZClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLnJpZ2h0Q2hpbGQpXFxuXFxuICAgICAgICAgICAgICAgIFxcbmNsYXNzIFRyZWVOb2RlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZixrZXksdmFsLGxlZnQ9Tm9uZSxyaWdodD1Ob25lLHBhcmVudD1Ob25lKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWxcXG4gICAgICAgIHNlbGYubGVmdENoaWxkID0gbGVmdFxcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmlnaHRcXG4gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50XFxuICAgICAgICBzZWxmLmJhbGFuY2VGYWN0b3IgPSAwXFxuICAgICAgICBcXG4gICAgZGVmIGhhc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmxlZnRDaGlsZFxcblxcbiAgICBkZWYgaGFzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGRcXG4gICAgXFxuICAgIGRlZiBpc0xlZnRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQubGVmdENoaWxkID09IHNlbGZcXG5cXG4gICAgZGVmIGlzUmlnaHRDaGlsZChzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnBhcmVudCBhbmQgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9PSBzZWxmXFxuXFxuICAgIGRlZiBpc1Jvb3Qoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IHNlbGYucGFyZW50XFxuXFxuICAgIGRlZiBpc0xlYWYoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGQpXFxuXFxuICAgIGRlZiBoYXNBbnlDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgb3Igc2VsZi5sZWZ0Q2hpbGRcXG5cXG4gICAgZGVmIGhhc0JvdGhDaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJpZ2h0Q2hpbGQgYW5kIHNlbGYubGVmdENoaWxkXFxuICAgIFxcbiAgICBkZWYgcmVwbGFjZU5vZGVEYXRhKHNlbGYsa2V5LHZhbHVlLGxjLHJjKTpcXG4gICAgICAgIHNlbGYua2V5ID0ga2V5XFxuICAgICAgICBzZWxmLnBheWxvYWQgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5sZWZ0Q2hpbGQgPSBsY1xcbiAgICAgICAgc2VsZi5yaWdodENoaWxkID0gcmNcXG4gICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5sZWZ0Q2hpbGQucGFyZW50ID0gc2VsZlxcbiAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgc2VsZi5yaWdodENoaWxkLnBhcmVudCA9IHNlbGZcXG4gICAgICAgIFxcbiAgICBkZWYgZmluZFN1Y2Nlc3NvcihzZWxmKTpcXG4gICAgICAgIHN1Y2MgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhhc1JpZ2h0Q2hpbGQoKTpcXG4gICAgICAgICAgICBzdWNjID0gc2VsZi5yaWdodENoaWxkLmZpbmRNaW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLnBhcmVudDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgICAgICAgICAgc3VjYyA9IHNlbGYucGFyZW50LmZpbmRTdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNjXFxuXFxuXFxuICAgIGRlZiBzcGxpY2VPdXQoc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmlzTGVhZigpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaXNMZWZ0Q2hpbGQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJpZ2h0Q2hpbGQgPSBOb25lXFxuICAgICAgICBlbGlmIHNlbGYuaGFzQW55Q2hpbGRyZW4oKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5sZWZ0Q2hpbGQgPSBzZWxmLmxlZnRDaGlsZFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmlnaHRDaGlsZCA9IHNlbGYubGVmdENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYubGVmdENoaWxkLnBhcmVudCA9IHNlbGYucGFyZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQubGVmdENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5yaWdodENoaWxkID0gc2VsZi5yaWdodENoaWxkXFxuICAgICAgICAgICAgICAgIHNlbGYucmlnaHRDaGlsZC5wYXJlbnQgPSBzZWxmLnBhcmVudFxcblxcbiAgICBkZWYgZmluZE1pbihzZWxmKTpcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmXFxuICAgICAgICB3aGlsZSBjdXJyZW50Lmhhc0xlZnRDaGlsZCgpOlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmxlZnRDaGlsZFxcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVGhlIHN0YW5kYXJkIGlub3JkZXIgdHJhdmVyc2FsIG9mIGEgYmluYXJ5IHRyZWUuXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmOlxcbiAgICAgICAgICAgIGlmIHNlbGYuaGFzTGVmdENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYubGVmdENoaWxkOlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYua2V5XFxuICAgICAgICAgICAgaWYgc2VsZi5oYXNSaWdodENoaWxkKCk6XFxuICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIHNlbGYucmlnaHRDaGlsZDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG4gICAgICAgICAgICBcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy5iYXNpYyBpbXBvcnQgU3RhY2ssIFF1ZXVlLCBEZXF1ZVxcbmZyb20gcHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgR3JhcGgsIFZlcnRleFxcbmZyb20gcHl0aG9uZHMzLnNlYXJjaGluZyBpbXBvcnQgSGFzaFRhYmxlXFxuZnJvbSBweXRob25kczMudHJlZXMgaW1wb3J0IChcXG4gICAgQmluYXJ5VHJlZSxcXG4gICAgQVZMVHJlZSxcXG4gICAgQmluYXJ5U2VhcmNoVHJlZSxcXG4gICAgQmluYXJ5SGVhcCxcXG4gICAgUHJpb3JpdHlRdWV1ZSxcXG4pXFxuXFxuX19hbGxfXyA9IFtcXG4gICAgXFxcIlN0YWNrXFxcIixcXG4gICAgXFxcIlF1ZXVlXFxcIixcXG4gICAgXFxcIkRlcXVlXFxcIixcXG4gICAgXFxcIkdyYXBoXFxcIixcXG4gICAgXFxcIlZlcnRleFxcXCIsXFxuICAgIFxcXCJIYXNoVGFibGVcXFwiLFxcbiAgICBcXFwiQmluYXJ5VHJlZVxcXCIsXFxuICAgIFxcXCJBVkxUcmVlXFxcIixcXG4gICAgXFxcIkJpbmFyeVNlYXJjaFRyZWVcXFwiLFxcbiAgICBcXFwiQmluYXJ5SGVhcFxcXCIsXFxuICAgIFxcXCJCaW5hcnlUcmVlXFxcIixcXG4gICAgXFxcIlByaW9yaXR5UXVldWVcXFwiLFxcbl1cXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmJhc2ljIGltcG9ydCBzdGF0ZW1lbnRcXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5zdGFjayBpbXBvcnQgU3RhY2tcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5xdWV1ZSBpbXBvcnQgUXVldWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5kZXF1ZSBpbXBvcnQgRGVxdWVcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgT3JkZXJlZExpc3RcXG5mcm9tIHB5dGhvbmRzMy5iYXNpYy5saW5rZWRfbGlzdCBpbXBvcnQgVW5vcmRlcmVkTGlzdFxcblxcbl9fYWxsX18gPSBbXFxcIlN0YWNrXFxcIiwgXFxcIlF1ZXVlXFxcIiwgXFxcIkRlcXVlXFxcIiwgXFxcIk9yZGVyZWRMaXN0XFxcIiwgXFxcIlVub3JkZXJlZExpc3RcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvZGVxdWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgRGVxdWU6XFxuICAgIFxcXCJcXFwiXFxcIlF1ZXVlIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IGRlcXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBkZXF1ZSBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgYWRkX2Zyb250KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBhZGRfcmVhcihzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuaW5zZXJ0KDAsIGl0ZW0pXFxuXFxuICAgIGRlZiByZW1vdmVfZnJvbnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBmcm9udCBvZiB0aGUgZGVxdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlX3JlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSByZWFyIG9mIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgwKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkZXF1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pdGVtcylcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL2Jhc2ljL2xpbmtlZF9saXN0LnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcblxcbmNsYXNzIExpbmtlZExpc3ROb2RlOlxcbiAgICBcXFwiXFxcIlxcXCJBIG5vZGUgb2YgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZV9kYXRhKTpcXG4gICAgICAgIHNlbGYuX2RhdGEgPSBub2RlX2RhdGFcXG4gICAgICAgIHNlbGYuX25leHQgPSBOb25lXFxuXFxuICAgIGRlZiBnZXRfZGF0YShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBub2RlIGRhdGFcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kYXRhXFxuXFxuICAgIGRlZiBzZXRfZGF0YShzZWxmLCBub2RlX2RhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgZGF0YVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fZGF0YSA9IG5vZGVfZGF0YVxcblxcbiAgICBkYXRhID0gcHJvcGVydHkoZ2V0X2RhdGEsIHNldF9kYXRhKVxcblxcbiAgICBkZWYgZ2V0X25leHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbmV4dCBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbmV4dFxcblxcbiAgICBkZWYgc2V0X25leHQoc2VsZiwgbm9kZV9uZXh0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBuZXh0IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX25leHQgPSBub2RlX25leHRcXG5cXG4gICAgbmV4dCA9IHByb3BlcnR5KGdldF9uZXh0LCBzZXRfbmV4dClcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzdHIoc2VsZi5fZGF0YSlcXG5cXG5cXG5jbGFzcyBMaW5rZWRMaXN0OlxcbiAgICBcXFwiXFxcIlxcXCJMaW5rZWQgTGlzdCBjbGFzcyBpbXBsZW1lbnRhdGlvblxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhZCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gMFxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJcyB0aGUgbGlzdCBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWQgaXMgTm9uZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgdGhlIGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb3VudFxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxpc3QgYXMgYSBzdHJpbmdcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpc3Rfc3RyID0gXFxcIltcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZi5faGVhZFxcblxcbiAgICAgICAgd2hpbGUgY3VycmVudDpcXG4gICAgICAgICAgICBsaXN0X3N0ciArPSBzdHIoY3VycmVudClcXG4gICAgICAgICAgICBpZiBjdXJyZW50Lm5leHQ6XFxuICAgICAgICAgICAgICAgIGxpc3Rfc3RyICs9IFxcXCIsIFxcXCJcXG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0XFxuICAgICAgICBsaXN0X3N0ciArPSBcXFwiXVxcXCJcXG4gICAgICAgIHJldHVybiBsaXN0X3N0clxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG4gICAgZGVmIHNlYXJjaChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZWFyY2ggZm9yIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhc3NcXG5cXG5cXG5jbGFzcyBVbm9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJVbm9yZGVyZWQgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGFuIHVub3JkZXJlZCBsaW5rZWQgbGlzdFxcXCJcXFwiXFxcIlxcbiAgICAgICAgTGlua2VkTGlzdC5fX2luaXRfXyhzZWxmKVxcblxcbiAgICBkZWYgYWRkKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbm9kZSA9IExpbmtlZExpc3ROb2RlKHZhbHVlKVxcbiAgICAgICAgbmV3X25vZGUuc2V0X25leHQoc2VsZi5faGVhZClcXG4gICAgICAgIHNlbGYuX2hlYWQgPSBuZXdfbm9kZVxcbiAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDFcXG5cXG4gICAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG4gICAgICAgIHByZXYgPSBOb25lXFxuXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnQuZGF0YSA9PSB2YWx1ZTpcXG4gICAgICAgICAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5faGVhZCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gY3VycmVudC5uZXh0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgLSAxXFxuICAgICAgICAgICAgICAgIHJldHVyblxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcbiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSBsaXN0XFxcIi5mb3JtYXQodmFsdWUpKVxcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuX2hlYWRcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQ6XFxuICAgICAgICAgICAgaWYgY3VycmVudC5kYXRhID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZVxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRcXG4gICAgICAgIHJldHVybiBGYWxzZVxcblxcblxcbmNsYXNzIE9yZGVyZWRMaXN0KExpbmtlZExpc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJPcmRlcmVkIGxpbmtlZCBsaXN0IGltcGxlbWVudGF0aW9uXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBPcmRlcmVkIGxpbmtlZCBsaXN0XFxcIlxcXCJcXFwiXFxuICAgICAgICBMaW5rZWRMaXN0Ll9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGN1cnJlbnQgPSBzZWxmLl9oZWFkXFxuICAgICAgICBwcmV2ID0gTm9uZVxcbiAgICAgICAgbmV3X25vZGUgPSBMaW5rZWRMaXN0Tm9kZSh2YWx1ZSlcXG5cXG4gICAgICAgIHdoaWxlIGN1cnJlbnQgYW5kIGN1cnJlbnQuZGF0YSA8IHZhbHVlOlxcbiAgICAgICAgICAgIHByZXYgPSBjdXJyZW50XFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dFxcblxcbiAgICAgICAgaWYgcHJldiBpcyBOb25lOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBzZWxmLl9oZWFkXFxuICAgICAgICAgICAgc2VsZi5faGVhZCA9IG5ld19ub2RlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG5ld19ub2RlLm5leHQgPSBjdXJyZW50XFxuICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3X25vZGVcXG4gICAgICAgIHNlbGYuX2NvdW50ID0gc2VsZi5fY291bnQgKyAxXFxuXFxuICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmVtb3ZlIGEgbm9kZSB3aXRoIGEgc3BlY2lmaWMgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgICMgVGhpcyBpcyBhbiBleGVyY2lzZVxcbiAgICAgICAgcGFzc1xcblxcbiAgICBkZWYgc2VhcmNoKHNlbGYsIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNlYXJjaCBmb3IgYSBub2RlIHdpdGggYSBzcGVjaWZpYyB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgIyBUaGlzIGlzIGFuIGV4ZXJjaXNlXFxuICAgICAgICBwYXNzXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9iYXNpYy9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBRdWV1ZTpcXG4gICAgXFxcIlxcXCJcXFwiUXVldWUgaW1wbGVtZW50YXRpb24gYXMgYSBsaXN0XFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgcXVldWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2l0ZW1zID0gW11cXG5cXG4gICAgZGVmIGlzX2VtcHR5KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faXRlbXMpXFxuXFxuICAgIGRlZiBlbnF1ZXVlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcy5pbnNlcnQoMCwgaXRlbSlcXG5cXG4gICAgZGVmIGRlcXVldWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHF1ZXVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvYmFzaWMvc3RhY2sucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgU3RhY2s6XFxuICAgIFxcXCJcXFwiXFxcIlN0YWNrIGltcGxlbWVudGF0aW9uIGFzIGEgbGlzdFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pdGVtcyA9IFtdXFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBzdGFjayBpcyBlbXB0eVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCBib29sKHNlbGYuX2l0ZW1zKVxcblxcbiAgICBkZWYgcHVzaChzZWxmLCBpdGVtKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpdGVtIHRvIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pXFxuXFxuICAgIGRlZiBwb3Aoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdGFja1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiBwZWVrKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSB2YWx1ZSBvZiB0aGUgdG9wIGl0ZW0gaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5faXRlbXNbLTFdXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHN0YWNrXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2l0ZW1zKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvZ3JhcGhzL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLmdyYXBocyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuZ3JhcGhzLmFkamFjZW5jeV9ncmFwaCBpbXBvcnQgR3JhcGhcXG5mcm9tIHB5dGhvbmRzMy5ncmFwaHMuYWRqYWNlbmN5X2dyYXBoIGltcG9ydCBWZXJ0ZXhcXG5cXG5fX2FsbF9fID0gW1xcXCJHcmFwaFxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9ncmFwaHMvYWRqYWNlbmN5X2dyYXBoLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcbmltcG9ydCBzeXNcXG5cXG5cXG5jbGFzcyBWZXJ0ZXg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIHZlcnRleCBjbGFzc1xcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBuZXcgdmVydGV4XFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX25laWdoYm9ycyA9IHt9XFxuICAgICAgICBzZWxmLl9jb2xvciA9IFxcXCJ3aGl0ZVxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc3RhbmNlID0gc3lzLm1heHNpemVcXG4gICAgICAgIHNlbGYuX3ByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgc2VsZi5fZGlzY292ZXJ5X3RpbWUgPSAwXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSAwXFxuXFxuICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTGVzcyB0aGFuIG9wZXJhdG9yIHJlcXVpcmVkIGZvciBoZWFwaWZ5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5rZXkgPCBvdGhlci5rZXlcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgdmVydGV4IGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBrZXkgPSBwcm9wZXJ0eShnZXRfa2V5KVxcblxcbiAgICBkZWYgZ2V0X25laWdoYm9yKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgZGlzdGFuY2UgKGVkZ2Ugd2VpZ2h0KSB0byBhbiBhZGphY2VudCBub2RlIChuZWlnaGJvcilcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9uZWlnaGJvcnMuZ2V0KG90aGVyLCBOb25lKVxcblxcbiAgICBkZWYgc2V0X25laWdoYm9yKHNlbGYsIG90aGVyLCB3ZWlnaHQ9MCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIGRpc3RhbmNlIChhZGQgYW4gZWRnZSkgdG8gYW4gYWRqYWNlbnQgbm9kZSAobmVpZ2hib3IpXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9uZWlnaGJvcnNbb3RoZXJdID0gd2VpZ2h0XFxuXFxuICAgIGRlZiBnZXRfbmVpZ2hib3JzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGFsbCBhZGphY2VudCBub2RlcyAobmVpZ2hib3JzKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX25laWdoYm9ycy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9jb2xvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jb2xvclxcblxcbiAgICBkZWYgc2V0X2NvbG9yKHNlbGYsIGNvbG9yKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB2ZXJ0ZXggY29sb3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3JcXG5cXG4gICAgY29sb3IgPSBwcm9wZXJ0eShnZXRfY29sb3IsIHNldF9jb2xvcilcXG5cXG4gICAgZGVmIGdldF9kaXN0YW5jZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBkaXN0YW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3RhbmNlXFxuXFxuICAgIGRlZiBzZXRfZGlzdGFuY2Uoc2VsZiwgZGlzdGFuY2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IGRpc3RhbmNlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9kaXN0YW5jZSA9IGRpc3RhbmNlXFxuXFxuICAgIGRpc3RhbmNlID0gcHJvcGVydHkoZ2V0X2Rpc3RhbmNlLCBzZXRfZGlzdGFuY2UpXFxuXFxuICAgIGRlZiBnZXRfcHJldmlvdXMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgcHJldmlvdXNcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9wcmV2aW91c1xcblxcbiAgICBkZWYgc2V0X3ByZXZpb3VzKHNlbGYsIHByZXZpb3VzKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBwcmV2aW91c1xcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcHJldmlvdXMgPSBwcmV2aW91c1xcblxcbiAgICBwcmV2aW91cyA9IHByb3BlcnR5KGdldF9wcmV2aW91cywgc2V0X3ByZXZpb3VzKVxcblxcbiAgICBkZWYgZ2V0X2Rpc2NvdmVyeV90aW1lKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGRpc2NvdmVyeSB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGVmIHNldF9kaXNjb3ZlcnlfdGltZShzZWxmLCBkaXNjb3ZlcnlfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGlzY292ZXJ5IHRpbWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rpc2NvdmVyeV90aW1lID0gZGlzY292ZXJ5X3RpbWVcXG5cXG4gICAgZGlzY292ZXJ5X3RpbWUgPSBwcm9wZXJ0eShnZXRfZGlzY292ZXJ5X3RpbWUsIHNldF9kaXNjb3ZlcnlfdGltZSlcXG5cXG4gICAgZGVmIGdldF9jbG9zaW5nX3RpbWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2luZ190aW1lXFxuXFxuICAgIGRlZiBzZXRfY2xvc2luZ190aW1lKHNlbGYsIGNsb3NpbmdfdGltZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgY2xvc2luZyB0aW1lXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUgPSBjbG9zaW5nX3RpbWVcXG5cXG4gICAgY2xvc2luZ190aW1lID0gcHJvcGVydHkoZ2V0X2Nsb3NpbmdfdGltZSwgc2V0X2Nsb3NpbmdfdGltZSlcXG5cXG4gICAgZGVmIF9fc3RyX18oc2VsZik6XFxuICAgICAgICByZXR1cm4gXFxcIns6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fHs6Xjh9fCB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgIHNlbGYuX2tleSxcXG4gICAgICAgICAgICBzZWxmLl9jb2xvcixcXG4gICAgICAgICAgICBzZWxmLl9kaXN0YW5jZSxcXG4gICAgICAgICAgICBzZWxmLl9kaXNjb3ZlcnlfdGltZSxcXG4gICAgICAgICAgICBzZWxmLl9jbG9zaW5nX3RpbWUsXFxuICAgICAgICAgICAgc2VsZi5fcHJldmlvdXMsXFxuICAgICAgICApXFxuXFxuXFxuY2xhc3MgR3JhcGg6XFxuICAgIFxcXCJcXFwiXFxcIkdyYXBoIGFzIGFuIGFkamFjZW5jeSBtYXRyaXhcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fdmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fZWRnZXMgPSB7fVxcbiAgICAgICAgc2VsZi5fdGltZSA9IDBcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3ZlcnRpY2VzLnZhbHVlcygpKVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdyYXBoJ3Mgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl92ZXJ0aWNlcylcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHcmFwaCdzIHNpemVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBsZW4oc2VsZi5fdmVydGljZXMpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImluIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3ZlcnRpY2VzXFxuXFxuICAgIGRlZiBnZXRfdmVydGV4KHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSB2ZXJ0ZXggaW4gdGhlIGdyYXBoIG5hbWVkIHZlcnRfa2V5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fdmVydGljZXMuZ2V0KGtleSwgTm9uZSlcXG5cXG4gICAgZGVmIHNldF92ZXJ0ZXgoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhbiBpbnN0YW5jZSBvZiBWZXJ0ZXggdG8gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl92ZXJ0aWNlc1trZXldID0gVmVydGV4KGtleSlcXG5cXG4gICAgZGVmIGFkZF9lZGdlKHNlbGYsIGZyb21fdmVydGV4LCB0b192ZXJ0ZXgsIHdlaWdodD0wKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCBhIHdlaWdodGVkIGFuZCBkaXJlY3RlZCBlZGdlIHRvIHRoZSBncmFwaFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgZnJvbV92ZXJ0ZXggbm90IGluIHNlbGYuX3ZlcnRpY2VzOlxcbiAgICAgICAgICAgIHNlbGYuc2V0X3ZlcnRleChmcm9tX3ZlcnRleClcXG4gICAgICAgIGlmIHRvX3ZlcnRleCBub3QgaW4gc2VsZi5fdmVydGljZXM6XFxuICAgICAgICAgICAgc2VsZi5zZXRfdmVydGV4KHRvX3ZlcnRleClcXG4gICAgICAgIHNlbGYuX3ZlcnRpY2VzW2Zyb21fdmVydGV4XS5zZXRfbmVpZ2hib3Ioc2VsZi5fdmVydGljZXNbdG9fdmVydGV4XSwgd2VpZ2h0KVxcbiAgICAgICAgc2VsZi5fZWRnZXNbKGZyb21fdmVydGV4LCB0b192ZXJ0ZXgpXSA9IHdlaWdodFxcblxcbiAgICBkZWYgZ2V0X3ZlcnRpY2VzKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl92ZXJ0aWNlcy5rZXlzKClcXG5cXG4gICAgZGVmIGdldF9lZGdlcyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbGlzdCBvZiBhbGwgZWRnZXMgaW4gdGhlIGdyYXBoXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fZWRnZXMua2V5cygpXFxuXFxuICAgIGRlZiByZXNldF9kaXN0YW5jZXMoc2VsZiwgZGVmYXVsdF9kaXN0YW5jZT1zeXMubWF4c2l6ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXNldCBkaXN0YW5jZXMgdG8gdGVzdCBEaWprc3RyYSdzXFxcIlxcXCJcXFwiXFxuICAgICAgICBmb3IgdmVydGV4IGluIHNlbGY6XFxuICAgICAgICAgICAgdmVydGV4LmRpc3RhbmNlID0gZGVmYXVsdF9kaXN0YW5jZVxcblxcbiAgICBkZWYgYmZzKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkJyZWFkdGggRmlyc3QgU2VhcmNoXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydC5kaXN0YW5jZSA9IDBcXG4gICAgICAgIHN0YXJ0LnByZXZpb3VzID0gTm9uZVxcbiAgICAgICAgdmVydF9xdWV1ZSA9IFtzdGFydF1cXG4gICAgICAgIHdoaWxlIHZlcnRfcXVldWU6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ID0gdmVydF9xdWV1ZS5wb3AoMClcXG4gICAgICAgICAgICBmb3IgbmVpZ2ggaW4gY3VycmVudF92ZXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICAgICAgaWYgbmVpZ2guY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICAgICAgICAgICAgICBuZWlnaC5kaXN0YW5jZSA9IGN1cnJlbnRfdmVydC5kaXN0YW5jZSArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5laWdoLnByZXZpb3VzID0gY3VycmVudF92ZXJ0XFxuICAgICAgICAgICAgICAgICAgICB2ZXJ0X3F1ZXVlLmFwcGVuZChuZWlnaClcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuXFxuICAgIGRlZiBkZnMoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJEZXB0aCBGaXJzdCBzZWFyY2hcXFwiXFxcIlxcXCJcXG4gICAgICAgIGZvciB2ZXJ0ZXggaW4gc2VsZjpcXG4gICAgICAgICAgICBpZiB2ZXJ0ZXguY29sb3IgPT0gXFxcIndoaXRlXFxcIjpcXG4gICAgICAgICAgICAgICAgc2VsZi5kZnNfdmlzaXQodmVydGV4KVxcblxcbiAgICBkZWYgZGZzX3Zpc2l0KHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRGUyBoZWxwZXIgZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmNvbG9yID0gXFxcImdyYXlcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmRpc2NvdmVyeV90aW1lID0gc2VsZi5fdGltZVxcbiAgICAgICAgZm9yIG5leHRfdmVydGV4IGluIHN0YXJ0LmdldF9uZWlnaGJvcnMoKTpcXG4gICAgICAgICAgICBpZiBuZXh0X3ZlcnRleC5jb2xvciA9PSBcXFwid2hpdGVcXFwiOlxcbiAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5zZXRfcHJldmlvdXMoc3RhcnQpXFxuICAgICAgICAgICAgICAgIHNlbGYuZGZzX3Zpc2l0KG5leHRfdmVydGV4KVxcbiAgICAgICAgc3RhcnQuY29sb3IgPSBcXFwiYmxhY2tcXFwiXFxuICAgICAgICBzZWxmLl90aW1lID0gc2VsZi5fdGltZSArIDFcXG4gICAgICAgIHN0YXJ0LmNsb3NpbmdfdGltZSA9IHNlbGYuX3RpbWVcXG5cXG4gICAgZGVmIHRyYXZlcnNlKHNlbGYsIHNyYywgZHN0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyYXZlcnNlIGEgZ3JhcGhcXFwiXFxcIlxcXCJcXG4gICAgICAgIHBhdGggPSBbXVxcbiAgICAgICAgY3VycmVudCA9IHNlbGYuZ2V0X3ZlcnRleChkc3QpXFxuICAgICAgICB3aGlsZSBjdXJyZW50OlxcbiAgICAgICAgICAgIHBhdGguYXBwZW5kKGN1cnJlbnQpXFxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucHJldmlvdXNcXG4gICAgICAgIHByaW50KFxcbiAgICAgICAgICAgIFxcXCJQYXRoIGZyb20ge30gdG8ge30gKHt9KToge31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KHNyYykua2V5LFxcbiAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZHN0KS5rZXksXFxuICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChkc3QpLmRpc3RhbmNlLFxcbiAgICAgICAgICAgICAgICBcXFwiIFxcXCIuam9pbih2ZXJ0ZXgua2V5IGZvciB2ZXJ0ZXggaW4gcmV2ZXJzZWQocGF0aCkpLFxcbiAgICAgICAgICAgIClcXG4gICAgICAgIClcXG5cXG4gICAgZGVmIGRpamtzdHJhKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkRpamtzdHJhJ3Mgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgbm90X3lldF92aXNpdGVkID0gW1tzdGFydC5kaXN0YW5jZSwgc3RhcnRdXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfeWV0X3Zpc2l0ZWQpXFxuICAgICAgICB3aGlsZSBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgY3VycmVudF92ZXJ0ZXggPSBoZWFwcS5oZWFwcG9wKG5vdF95ZXRfdmlzaXRlZClbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5kaXN0YW5jZSArIGN1cnJlbnRfdmVydGV4LmdldF9uZWlnaGJvcihcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4XFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgaWYgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2U6XFxuICAgICAgICAgICAgICAgICAgICBuZXh0X3ZlcnRleC5kaXN0YW5jZSA9IG5ld19kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICAgICAgbmV4dF92ZXJ0ZXgucHJldmlvdXMgPSBjdXJyZW50X3ZlcnRleFxcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZm9yIHZlcnRleCBpbiBub3RfeWV0X3Zpc2l0ZWQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmVydGV4WzFdLmtleSA9PSBuZXh0X3ZlcnRleC5rZXk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleFswXSA9IG5leHRfdmVydGV4LmRpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBpZnkobm90X3lldF92aXNpdGVkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWVcXG4gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZDpcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90X3lldF92aXNpdGVkLCBbbmV4dF92ZXJ0ZXguZGlzdGFuY2UsIG5leHRfdmVydGV4XVxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIGJlbGxtYW5fZm9yZChzZWxmLCBzdGFydCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJCZWxsbWFuLUZvcmQgc2hvcnRlc3QgcGF0aCBhbGdvcml0aG1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHN0YXJ0LmRpc3RhbmNlID0gMFxcbiAgICAgICAgZm9yIF8gaW4gcmFuZ2UobGVuKHNlbGYuX3ZlcnRpY2VzKSk6XFxuICAgICAgICAgICAgZm9yIGVkZ2UgaW4gc2VsZi5fZWRnZXM6XFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICA8IHNlbGYuZ2V0X3ZlcnRleChlZGdlWzFdKS5kaXN0YW5jZVxcbiAgICAgICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMV0pLmRpc3RhbmNlID0gKFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ZlcnRleChlZGdlWzBdKS5kaXN0YW5jZSArIHNlbGYuX2VkZ2VzW2VkZ2VdXFxuICAgICAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkucHJldmlvdXMgPSBzZWxmLmdldF92ZXJ0ZXgoZWRnZVswXSlcXG4gICAgICAgIGZvciBlZGdlIGluIHNlbGYuX2VkZ2VzOlxcbiAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgc2VsZi5nZXRfdmVydGV4KGVkZ2VbMF0pLmRpc3RhbmNlICsgc2VsZi5fZWRnZXNbZWRnZV1cXG4gICAgICAgICAgICAgICAgPCBzZWxmLmdldF92ZXJ0ZXgoZWRnZVsxXSkuZGlzdGFuY2VcXG4gICAgICAgICAgICApOlxcbiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJHcmFwaCBjb250YWlucyBhIG5lZ2F0aXZlLXdlaWdodCBjeWNsZVxcXCIpXFxuXFxuICAgIGRlZiBwcmltKHNlbGYsIHN0YXJ0KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByaW0ncyBzcGFubmluZyB0cmVlIGFsZ29yaXRobVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3RhcnQuZGlzdGFuY2UgPSAwXFxuICAgICAgICBub3RfaW5fYV90cmVlID0gW1t2ZXJ0ZXguZGlzdGFuY2UsIHZlcnRleF0gZm9yIHZlcnRleCBpbiBzZWxmXVxcbiAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgd2hpbGUgbm90X2luX2FfdHJlZTpcXG4gICAgICAgICAgICBjdXJyZW50X3ZlcnRleCA9IGhlYXBxLmhlYXBwb3Aobm90X2luX2FfdHJlZSlbMV1cXG4gICAgICAgICAgICBmb3IgbmV4dF92ZXJ0ZXggaW4gY3VycmVudF92ZXJ0ZXguZ2V0X25laWdoYm9ycygpOlxcbiAgICAgICAgICAgICAgICBuZXdfZGlzdGFuY2UgPSBjdXJyZW50X3ZlcnRleC5nZXRfbmVpZ2hib3IobmV4dF92ZXJ0ZXgpXFxuICAgICAgICAgICAgICAgIGlmIChcXG4gICAgICAgICAgICAgICAgICAgIGFueShpdGVtWzFdID09IG5leHRfdmVydGV4IGZvciBpdGVtIGluIG5vdF9pbl9hX3RyZWUpXFxuICAgICAgICAgICAgICAgICAgICBhbmQgbmV3X2Rpc3RhbmNlIDwgbmV4dF92ZXJ0ZXguZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgKTpcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LnByZXZpb3VzID0gY3VycmVudF92ZXJ0ZXhcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfdmVydGV4LmRpc3RhbmNlID0gbmV3X2Rpc3RhbmNlXFxuICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBub3RfaW5fYV90cmVlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW1bMV0gPT0gbmV4dF92ZXJ0ZXg6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0gPSBuZXdfZGlzdGFuY2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcHEuaGVhcGlmeShub3RfaW5fYV90cmVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcblwiLFwic3JjL2xpYi9weXRob25kczMvaW50cm8vX19pbml0X18ucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5weXRob25kczMuaW50cm8gaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLmludHJvLm9vcCBpbXBvcnQgRnJhY3Rpb25cXG5cXG5fX2FsbF9fID0gW1xcXCJGcmFjdGlvblxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9pbnRyby9vb3AucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuZGVmIGdjZChudW1iZXIxLCBudW1iZXIyKTpcXG4gICAgXFxcIlxcXCJcXFwiSGVscGVyIGZ1bmN0aW9uIHRvIHNpbXBsaWZ5IGZyYWN0aW9uc1xcXCJcXFwiXFxcIlxcbiAgICBpZiBub3QgaXNpbnN0YW5jZShudW1iZXIxLCBpbnQpIG9yIG5vdCBpc2luc3RhbmNlKG51bWJlcjIsIGludCk6XFxuICAgICAgICByYWlzZSBUeXBlRXJyb3IoXFxcIk51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgbXVzdCBiZSBpbnRlZ2Vyc1xcXCIpXFxuICAgIHdoaWxlIG51bWJlcjEgJSBudW1iZXIyOlxcbiAgICAgICAgbnVtYmVyMSwgbnVtYmVyMiA9IG51bWJlcjIsIG51bWJlcjEgJSBudW1iZXIyXFxuICAgIHJldHVybiBudW1iZXIyXFxuXFxuXFxuY2xhc3MgRnJhY3Rpb246XFxuICAgIFxcXCJcXFwiXFxcIkZyYWN0aW9uIGNsYXNzXFxcIlxcXCJcXFwiXFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdfbnVtZXIsIG5ld19kZW5vbSk6XFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgY29tbW9uID0gZ2NkKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcbiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjpcXG4gICAgICAgICAgICByYWlzZVxcbiAgICAgICAgc2VsZi5fbnVtZXIgPSBuZXdfbnVtZXIgLy8gY29tbW9uXFxuICAgICAgICBzZWxmLl9kZW5vbSA9IG5ld19kZW5vbSAvLyBjb21tb25cXG5cXG4gICAgQHByb3BlcnR5XFxuICAgIGRlZiBudW1lcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9udW1lclxcblxcbiAgICBAbnVtZXIuc2V0dGVyXFxuICAgIGRlZiBzZXRfbnVtZXIoc2VsZiwgbmV3X251bWVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBudW1lcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX251bWVyID0gbmV3X251bWVyXFxuXFxuICAgIGRlZiBnZXRfZGVub20oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9kZW5vbVxcblxcbiAgICBkZWYgc2V0X2Rlbm9tKHNlbGYsIG5ld19kZW5vbSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJTZXQgZGVuaW1pbmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2Rlbm9tID0gbmV3X2Rlbm9tXFxuXFxuICAgICMgQW5vdGhlciB3YXkgdG8gY3JlYXRlIGFuIGF0dHJpYnV0ZVxcbiAgICBkZW5vbSA9IHByb3BlcnR5KGdldF9kZW5vbSwgc2V0X2Rlbm9tKVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgc3RyaW5nIHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9udW1lciA+IHNlbGYuX2Rlbm9tOlxcbiAgICAgICAgICAgIHJldHVybiBcXFwie30ge30ve31cXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgc2VsZi5fbnVtZXIgLy8gc2VsZi5fZGVub20sIHNlbGYuX251bWVyICUgc2VsZi5fZGVub20sIHNlbGYuX2Rlbm9tXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgcmV0dXJuIFxcXCJ7fS97fVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fcmVwcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRnJhY3Rpb24gcmVwcmVzZW50YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBcXFwiRnJhY3Rpb24oe30sIHt9KVxcXCIuZm9ybWF0KHNlbGYuX251bWVyLCBzZWxmLl9kZW5vbSlcXG5cXG4gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJFcXVhbGl0eSBjb21wYXJpc29uXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fbnVtZXIgKiBvdGhlci5kZW5vbSA9PSBvdGhlci5udW1lciAqIHNlbGYuX2Rlbm9tXFxuXFxuICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFkZCB0d28gZnJhY3Rpb25zXFxcIlxcXCJcXFwiXFxuICAgICAgICBuZXdfbnVtZXIgPSBzZWxmLl9udW1lciAqIG90aGVyLmRlbm9tICsgc2VsZi5fZGVub20gKiBvdGhlci5udW1lclxcbiAgICAgICAgbmV3X2Rlbm9tID0gc2VsZi5fZGVub20gKiBvdGhlci5kZW5vbVxcbiAgICAgICAgcmV0dXJuIEZyYWN0aW9uKG5ld19udW1lciwgbmV3X2Rlbm9tKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvc2VhcmNoaW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNlYXJjaCBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMuc2VhcmNoaW5nLmhhc2hfdGFibGUgaW1wb3J0IEhhc2hUYWJsZVxcblxcbl9fYWxsX18gPSBbXFxcIkhhc2hUYWJsZVxcXCJdXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zZWFyY2hpbmcvaGFzaF90YWJsZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5cXG5jbGFzcyBIYXNoVGFibGU6XFxuICAgIFxcXCJcXFwiXFxcIkhhc2ggVGFibGUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemU9MTYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgaGFzaCB0YWJsZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNpemVcXG4gICAgICAgIHNlbGYuX3Nsb3RzID0gW05vbmVdICogc2VsZi5fc2l6ZVxcbiAgICAgICAgc2VsZi5fZGF0YSA9IFtOb25lXSAqIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2dldF9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5KVxcblxcbiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBkYXRhKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2ljIF9fc2V0X19cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYucHV0KGtleSwgZGF0YSlcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNYWdpYyBfX2xlbl9fXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZSAtIHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIk1hZ2luIGluXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3Nsb3RzXFxuXFxuICAgIGRlZiBfaGFzaF9mdW5jdGlvbihzZWxmLCBrZXksIHNpemUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIGhhc2ggZnVuY3Rpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBrZXkgJSBzaXplXFxuXFxuICAgIGRlZiBfcmVoYXNoKHNlbGYsIG9sZF9oYXNoLCBzaXplLCBzdGVwPTEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2ltcGxlIHJlaGFzaCBmdW5jdGlvblxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIChvbGRfaGFzaCArIHN0ZXApICUgc2l6ZVxcblxcbiAgICBkZWYgaXNfZW1wdHkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgdGFibGUgaXMgZW1wdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplID09IHNlbGYuX3Nsb3RzLmNvdW50KE5vbmUpXFxuXFxuICAgIGRlZiBzaXplKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdGFibGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9zaXplIC0gc2VsZi5fc2xvdHMuY291bnQoTm9uZSlcXG5cXG4gICAgZGVmIHB1dChzZWxmLCBrZXksIGRhdGEpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGFuIGl0ZW0gdG8gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBoYXNoX3ZhbHVlID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuXFxuICAgICAgICBpZiBzZWxmLl9zbG90c1toYXNoX3ZhbHVlXSBpcyBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX3Nsb3RzW2hhc2hfdmFsdWVdID0ga2V5XFxuICAgICAgICAgICAgc2VsZi5fZGF0YVtoYXNoX3ZhbHVlXSA9IGRhdGFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5fc2xvdHNbaGFzaF92YWx1ZV0gPT0ga2V5OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW2hhc2hfdmFsdWVdID0gZGF0YSAgIyByZXBsYWNlXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaiA9IDBcXG4gICAgICAgICAgICAgICAgbmV4dF9zbG90ID0gc2VsZi5fcmVoYXNoKGhhc2hfdmFsdWUsIGxlbihzZWxmLl9zbG90cyksIGopXFxuICAgICAgICAgICAgICAgIHdoaWxlIChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Nsb3RzW25leHRfc2xvdF0gaXMgbm90IE5vbmVcXG4gICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdICE9IGtleVxcbiAgICAgICAgICAgICAgICAgICAgYW5kIGogPCBzZWxmLl9zaXplXFxuICAgICAgICAgICAgICAgICk6XFxuICAgICAgICAgICAgICAgICAgICBqID0gaiArIDFcXG4gICAgICAgICAgICAgICAgICAgIG5leHRfc2xvdCA9IHNlbGYuX3JlaGFzaChoYXNoX3ZhbHVlLCBsZW4oc2VsZi5fc2xvdHMpLCBqKVxcblxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdIGlzIE5vbmU6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zbG90c1tuZXh0X3Nsb3RdID0ga2V5XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhW25leHRfc2xvdF0gPSBkYXRhXFxuICAgICAgICAgICAgICAgIGVsaWYgaiA9PSBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKFxcXCJIYXNoIFRhYmxlIGlzIGZ1bGxcXFwiKVxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YVtuZXh0X3Nsb3RdID0gZGF0YSAgIyByZXBsYWNlXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCBhbiBpdGVtIGZyb20gdGhlIHRhYmxlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzdGFydF9zbG90ID0gc2VsZi5faGFzaF9mdW5jdGlvbihrZXksIGxlbihzZWxmLl9zbG90cykpXFxuICAgICAgICBwb3NpdGlvbiA9IHN0YXJ0X3Nsb3RcXG4gICAgICAgIGogPSAwXFxuXFxuICAgICAgICB3aGlsZSBzZWxmLl9zbG90c1twb3NpdGlvbl0gaXMgbm90IE5vbmUgYW5kIGogPCBzZWxmLl9zaXplOlxcbiAgICAgICAgICAgIGlmIHNlbGYuX3Nsb3RzW3Bvc2l0aW9uXSA9PSBrZXk6XFxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhW3Bvc2l0aW9uXVxcbiAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5fcmVoYXNoKHN0YXJ0X3Nsb3QsIGxlbihzZWxmLl9zbG90cyksIGopXFxuXFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwie30gaXMgbm90IGluIHRoZSB0YWJsZVxcXCIuZm9ybWF0KGtleSkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy9zb3J0aW5nL19faW5pdF9fLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxucHl0aG9uZHMzLnNvcnRpbmcgaW1wb3J0IHN0YXRlbWVudFxcblxcXCJcXFwiXFxcIlxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBidWJibGVfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzZWxlY3Rfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBpbnNlcnRfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBzaGVsbF9zb3J0XFxuZnJvbSBweXRob25kczMuc29ydGluZy5zb3J0aW5nX2FsZ29yaXRobXMgaW1wb3J0IG1lcmdlX3NvcnRcXG5mcm9tIHB5dGhvbmRzMy5zb3J0aW5nLnNvcnRpbmdfYWxnb3JpdGhtcyBpbXBvcnQgcXVpY2tfc29ydFxcbmZyb20gcHl0aG9uZHMzLnNvcnRpbmcuc29ydGluZ19hbGdvcml0aG1zIGltcG9ydCBoZWFwX3NvcnRcXG5cIixcInNyYy9saWIvcHl0aG9uZHMzL3NvcnRpbmcvc29ydGluZ19hbGdvcml0aG1zLnB5XCI6XCIjIS91c3IvYmluL2VudiBweXRob24zXFxuXFxcIlxcXCJcXFwiXFxuQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuUHJvYmxlbSBTb2x2aW5nIHdpdGggQWxnb3JpdGhtcyBhbmQgRGF0YSBTdHJ1Y3R1cmVzIHVzaW5nIFB5dGhvblxcbkNvcHlyaWdodCAyMDA1XFxuVXBkYXRlZCBieSBSb21hbiBZYXNpbm92c2t5eSwgMjAxN1xcblxcXCJcXFwiXFxcIlxcblxcbmltcG9ydCBoZWFwcVxcblxcblxcbmRlZiBidWJibGVfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJCdWJibGUgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZShsZW4obHN0KSAtIDEsIDAsIC0xKTpcXG4gICAgICAgIGV4Y2hhbmdlcyA9IEZhbHNlXFxuICAgICAgICBmb3IgaiBpbiByYW5nZShpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPiBsc3RbaiArIDFdOlxcbiAgICAgICAgICAgICAgICBleGNoYW5nZXMgPSBUcnVlXFxuICAgICAgICAgICAgICAgIGxzdFtqXSwgbHN0W2ogKyAxXSA9IGxzdFtqICsgMV0sIGxzdFtqXVxcbiAgICAgICAgaWYgbm90IGV4Y2hhbmdlczpcXG4gICAgICAgICAgICBicmVha1xcblxcblxcbmRlZiBzZWxlY3Rfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTZWxlY3Rpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUobHN0KTpcXG4gICAgICAgIG1pbl9pZHggPSBsZW4obHN0KSAtIDFcXG4gICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihsc3QpKTpcXG4gICAgICAgICAgICBpZiBsc3Rbal0gPCBsc3RbbWluX2lkeF06XFxuICAgICAgICAgICAgICAgIG1pbl9pZHggPSBqXFxuICAgICAgICBpZiBtaW5faWR4ICE9IGk6XFxuICAgICAgICAgICAgbHN0W21pbl9pZHhdLCBsc3RbaV0gPSBsc3RbaV0sIGxzdFttaW5faWR4XVxcblxcblxcbmRlZiBpbnNlcnRfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJJbnNlcnRpb24gc29ydFxcXCJcXFwiXFxcIlxcbiAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obHN0KSk6XFxuICAgICAgICBjdXJfdmFsID0gbHN0W2ldXFxuICAgICAgICBjdXJfcG9zID0gaVxcblxcbiAgICAgICAgd2hpbGUgY3VyX3BvcyA+IDAgYW5kIGxzdFtjdXJfcG9zIC0gMV0gPiBjdXJfdmFsOlxcbiAgICAgICAgICAgIGxzdFtjdXJfcG9zXSA9IGxzdFtjdXJfcG9zIC0gMV1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIDFcXG4gICAgICAgIGxzdFtjdXJfcG9zXSA9IGN1cl92YWxcXG5cXG5cXG5kZWYgc2hlbGxfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJTaGVsbCBzb3J0XFxcIlxcXCJcXFwiXFxuICAgIHN1Ymxpc3RfY291bnQgPSBsZW4obHN0KSAvLyAzXFxuICAgIHdoaWxlIHN1Ymxpc3RfY291bnQgPiAwOlxcbiAgICAgICAgZm9yIHBvc19zdGFydCBpbiByYW5nZShzdWJsaXN0X2NvdW50KTpcXG4gICAgICAgICAgICBfZ2FwX2luc2VydF9zb3J0KGxzdCwgcG9zX3N0YXJ0LCBzdWJsaXN0X2NvdW50KVxcbiAgICAgICAgc3VibGlzdF9jb3VudCA9IHN1Ymxpc3RfY291bnQgLy8gMlxcblxcblxcbmRlZiBfZ2FwX2luc2VydF9zb3J0KGxzdCwgc3RhcnQsIGdhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlNoZWxsIHNvcnQgaGVscGVyIGZ1bmN0aW9uXFxcIlxcXCJcXFwiXFxuICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0ICsgZ2FwLCBsZW4obHN0KSwgZ2FwKTpcXG4gICAgICAgIGN1cl92YWwgPSBsc3RbaV1cXG4gICAgICAgIGN1cl9wb3MgPSBpXFxuICAgICAgICB3aGlsZSBjdXJfcG9zID49IGdhcCBhbmQgbHN0W2N1cl9wb3MgLSBnYXBdID4gY3VyX3ZhbDpcXG4gICAgICAgICAgICBsc3RbY3VyX3Bvc10gPSBsc3RbY3VyX3BvcyAtIGdhcF1cXG4gICAgICAgICAgICBjdXJfcG9zID0gY3VyX3BvcyAtIGdhcFxcbiAgICAgICAgbHN0W2N1cl9wb3NdID0gY3VyX3ZhbFxcblxcblxcbmRlZiBtZXJnZV9zb3J0KGxzdCk6XFxuICAgIFxcXCJcXFwiXFxcIk1lcmdlIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgaWYgbGVuKGxzdCkgPiAxOlxcbiAgICAgICAgbWlkID0gbGVuKGxzdCkgLy8gMlxcbiAgICAgICAgbGVmdF9oYWxmID0gbHN0WzptaWRdXFxuICAgICAgICByaWdodF9oYWxmID0gbHN0W21pZDpdXFxuXFxuICAgICAgICBtZXJnZV9zb3J0KGxlZnRfaGFsZilcXG4gICAgICAgIG1lcmdlX3NvcnQocmlnaHRfaGFsZilcXG5cXG4gICAgICAgIGksIGosIGsgPSAwLCAwLCAwXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGxlZnRfaGFsZikgYW5kIGogPCBsZW4ocmlnaHRfaGFsZik6XFxuICAgICAgICAgICAgaWYgbGVmdF9oYWxmW2ldIDw9IHJpZ2h0X2hhbGZbal06XFxuICAgICAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgICAgIGogPSBqICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaSA8IGxlbihsZWZ0X2hhbGYpOlxcbiAgICAgICAgICAgIGxzdFtrXSA9IGxlZnRfaGFsZltpXVxcbiAgICAgICAgICAgIGkgPSBpICsgMVxcbiAgICAgICAgICAgIGsgPSBrICsgMVxcblxcbiAgICAgICAgd2hpbGUgaiA8IGxlbihyaWdodF9oYWxmKTpcXG4gICAgICAgICAgICBsc3Rba10gPSByaWdodF9oYWxmW2pdXFxuICAgICAgICAgICAgaiA9IGogKyAxXFxuICAgICAgICAgICAgayA9IGsgKyAxXFxuXFxuXFxuZGVmIHF1aWNrX3NvcnQobHN0KTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydFxcXCJcXFwiXFxcIlxcbiAgICBfcXVpY2tfc29ydF9oZWxwKGxzdCwgMCwgbGVuKGxzdCkgLSAxKVxcblxcblxcbmRlZiBfcXVpY2tfc29ydF9oZWxwKGxzdCwgbWFya19sLCBtYXJrX3IpOlxcbiAgICBcXFwiXFxcIlxcXCJRdWljayBzb3J0IGhlbHBlclxcXCJcXFwiXFxcIlxcbiAgICBpZiBtYXJrX2wgPCBtYXJrX3I6XFxuICAgICAgICBzcGxpdCA9IF9xdWlja19zb3J0X3BhcnQobHN0LCBtYXJrX2wsIG1hcmtfcilcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBtYXJrX2wsIHNwbGl0IC0gMSlcXG4gICAgICAgIF9xdWlja19zb3J0X2hlbHAobHN0LCBzcGxpdCArIDEsIG1hcmtfcilcXG5cXG5cXG5kZWYgX3F1aWNrX3NvcnRfcGFydChsc3QsIG1hcmtfbCwgbWFya19yKTpcXG4gICAgXFxcIlxcXCJcXFwiUXVpY2sgc29ydCBwYXJ0aXRpb25cXFwiXFxcIlxcXCJcXG4gICAgcGl2b3RfdmFsID0gbHN0W21hcmtfbF1cXG4gICAgbWFya19sX2N1ciA9IG1hcmtfbCArIDFcXG4gICAgbWFya19yX2N1ciA9IG1hcmtfclxcbiAgICBkb25lID0gRmFsc2VcXG5cXG4gICAgd2hpbGUgbm90IGRvbmU6XFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX2xfY3VyXSA8PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19sX2N1ciA9IG1hcmtfbF9jdXIgKyAxXFxuICAgICAgICB3aGlsZSBtYXJrX2xfY3VyIDw9IG1hcmtfcl9jdXIgYW5kIGxzdFttYXJrX3JfY3VyXSA+PSBwaXZvdF92YWw6XFxuICAgICAgICAgICAgbWFya19yX2N1ciA9IG1hcmtfcl9jdXIgLSAxXFxuICAgICAgICBpZiBtYXJrX3JfY3VyIDwgbWFya19sX2N1cjpcXG4gICAgICAgICAgICBkb25lID0gVHJ1ZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBsc3RbbWFya19sX2N1cl0sIGxzdFttYXJrX3JfY3VyXSA9IGxzdFttYXJrX3JfY3VyXSwgbHN0W21hcmtfbF9jdXJdXFxuICAgIGxzdFttYXJrX2xdLCBsc3RbbWFya19yX2N1cl0gPSBsc3RbbWFya19yX2N1cl0sIGxzdFttYXJrX2xdXFxuXFxuICAgIHJldHVybiBtYXJrX3JfY3VyXFxuXFxuXFxuZGVmIGhlYXBfc29ydChsc3QpOlxcbiAgICBcXFwiXFxcIlxcXCJIZWFwIHNvcnRcXFwiXFxcIlxcXCJcXG4gICAgcmVzID0gW11cXG4gICAgaGVhcHEuaGVhcGlmeShsc3QpXFxuICAgIHdoaWxlIGxzdDpcXG4gICAgICAgIHJlcy5hcHBlbmQoaGVhcHEuaGVhcHBvcChsc3QpKVxcbiAgICBmb3IgaSBpbiByZXM6XFxuICAgICAgICBsc3QuYXBwZW5kKGkpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9fX2luaXRfXy5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbnB5dGhvbmRzMy50cmVlcyBpbXBvcnQgc3RhdGVtZW50XFxuXFxcIlxcXCJcXFwiXFxuZnJvbSBweXRob25kczMudHJlZXMuYXZsX3RyZWUgaW1wb3J0IEFWTFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfc2VhcmNoX3RyZWUgaW1wb3J0IEJpbmFyeVNlYXJjaFRyZWVcXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcbmZyb20gcHl0aG9uZHMzLnRyZWVzLmJpbmFyeV90cmVlIGltcG9ydCBCaW5hcnlUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMucHJpb3JpdHlfcXVldWUgaW1wb3J0IFByaW9yaXR5UXVldWVcXG5cXG5fX2FsbF9fID0gW1xcXCJCaW5hcnlUcmVlXFxcIiwgXFxcIkJpbmFyeUhlYXBcXFwiLCBcXFwiQmluYXJ5U2VhcmNoVHJlZVxcXCIsIFxcXCJBVkxUcmVlXFxcIiwgXFxcIlByaW9yaXR5UXVldWVcXFwiXVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYXZsX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlTZWFyY2hUcmVlXFxuZnJvbSBweXRob25kczMudHJlZXMuYmluYXJ5X3NlYXJjaF90cmVlIGltcG9ydCBCaW5hcnlUcmVlTm9kZVxcblxcblxcbmNsYXNzIEFWTFRyZWVOb2RlKEJpbmFyeVRyZWVOb2RlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIFRyZWUgTm9kZVxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWwsIGJhbGFuY2VfZmFjdG9yLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUsIHBhcmVudD1Ob25lKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhbiBBVkwgdHJlZSBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlUcmVlTm9kZS5fX2luaXRfXyhzZWxmLCBrZXksIHZhbCwgbGVmdCwgcmlnaHQsIHBhcmVudClcXG4gICAgICAgIHNlbGYuX2JhbGFuY2VfZmFjdG9yID0gYmFsYW5jZV9mYWN0b3JcXG5cXG4gICAgZGVmIGdldF9iYWxhbmNlX2ZhY3RvcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0aGUgbm9kZSBiYWxhbmNlIGZhY3RvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2JhbGFuY2VfZmFjdG9yXFxuXFxuICAgIGRlZiBzZXRfYmFsYW5jZV9mYWN0b3Ioc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IHRoZSBub2RlIGJhbGFuY2UgZmFjdG9yXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9iYWxhbmNlX2ZhY3RvciA9IHZhbHVlXFxuXFxuICAgIGJhbGFuY2VfZmFjdG9yID0gcHJvcGVydHkoZ2V0X2JhbGFuY2VfZmFjdG9yLCBzZXRfYmFsYW5jZV9mYWN0b3IpXFxuXFxuXFxuY2xhc3MgQVZMVHJlZShCaW5hcnlTZWFyY2hUcmVlKTpcXG4gICAgXFxcIlxcXCJcXFwiQVZMIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIGEgbmV3IEFWTCB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBCaW5hcnlTZWFyY2hUcmVlLl9faW5pdF9fKHNlbGYpXFxuXFxuICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgbmV3IG5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3Jvb3Q6XFxuICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIHNlbGYuX3Jvb3QpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBBVkxUcmVlTm9kZShrZXksIHZhbHVlLCAwKVxcbiAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgKyAxXFxuXFxuICAgIGRlZiBfcHV0KHNlbGYsIGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBZGQgYSBuZXcgbm9kZSB0byB0aGUgdHJlZSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYga2V5IDwgY3VycmVudF9ub2RlLmtleTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuZ2V0X2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fcHV0KGtleSwgdmFsdWUsIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0ID0gQVZMVHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCAwLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlLmdldF9jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodCA9IEFWTFRyZWVOb2RlKFxcbiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSwgMCwgcGFyZW50PWN1cnJlbnRfbm9kZVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlX2JhbGFuY2UoY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgdXBkYXRlX2JhbGFuY2Uoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJVcGRhdGUgdGhlIHRyZWUgYmFsYW5jZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA+IDEgb3Igbm9kZS5iYWxhbmNlX2ZhY3RvciA8IC0xOlxcbiAgICAgICAgICAgIHNlbGYucmViYWxhbmNlKG5vZGUpXFxuICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICBpZiBub2RlLnBhcmVudDpcXG4gICAgICAgICAgICBpZiBub2RlLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgKz0gMVxcbiAgICAgICAgICAgIGVsaWYgbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5iYWxhbmNlX2ZhY3RvciAtPSAxXFxuXFxuICAgICAgICAgICAgaWYgbm9kZS5wYXJlbnQuYmFsYW5jZV9mYWN0b3IgIT0gMDpcXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYmFsYW5jZShub2RlLnBhcmVudClcXG5cXG4gICAgZGVmIHJlYmFsYW5jZShzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlYmFsYW5jZSB0aGUgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm9kZS5iYWxhbmNlX2ZhY3RvciA8IDA6XFxuICAgICAgICAgICAgaWYgbm9kZS5jaGlsZF9yaWdodC5iYWxhbmNlX2ZhY3RvciA+IDA6XFxuICAgICAgICAgICAgICAgICMgRG8gYW4gTFIgUm90YXRpb25cXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfcmlnaHQobm9kZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIGxlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5yb3RhdGVfbGVmdChub2RlKVxcbiAgICAgICAgZWxpZiBub2RlLmJhbGFuY2VfZmFjdG9yID4gMDpcXG4gICAgICAgICAgICBpZiBub2RlLmNoaWxkX2xlZnQuYmFsYW5jZV9mYWN0b3IgPCAwOlxcbiAgICAgICAgICAgICAgICAjIERvIGFuIFJMIFJvdGF0aW9uXFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX2xlZnQobm9kZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZV9yaWdodChub2RlKVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICMgc2luZ2xlIHJpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYucm90YXRlX3JpZ2h0KG5vZGUpXFxuXFxuICAgIGRlZiByb3RhdGVfbGVmdChzZWxmLCByb3RhdGlvbl9yb290KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkxlZnQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5jaGlsZF9yaWdodCA9IG5ld19yb290LmNoaWxkX2xlZnRcXG4gICAgICAgIGlmIG5ld19yb290LmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfbGVmdC5wYXJlbnQgPSByb3RhdGlvbl9yb290XFxuICAgICAgICBuZXdfcm9vdC5wYXJlbnQgPSByb3RhdGlvbl9yb290LnBhcmVudFxcbiAgICAgICAgaWYgcm90YXRpb25fcm9vdC5pc19yb290KCk6XFxuICAgICAgICAgICAgc2VsZi5fcm9vdCA9IG5ld19yb290XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9yaWdodCA9IG5ld19yb290XFxuICAgICAgICBuZXdfcm9vdC5jaGlsZF9sZWZ0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yICsgMSAtIG1pbihuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yICsgMSArIG1heChyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblxcbiAgICBkZWYgcm90YXRlX3JpZ2h0KHNlbGYsIHJvdGF0aW9uX3Jvb3QpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmlnaHQgcm90YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG5ld19yb290ID0gcm90YXRpb25fcm9vdC5jaGlsZF9sZWZ0XFxuICAgICAgICByb3RhdGlvbl9yb290LmNoaWxkX2xlZnQgPSBuZXdfcm9vdC5jaGlsZF9yaWdodFxcbiAgICAgICAgaWYgbmV3X3Jvb3QuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgbmV3X3Jvb3QuY2hpbGRfcmlnaHQucGFyZW50ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgbmV3X3Jvb3QucGFyZW50ID0gcm90YXRpb25fcm9vdC5wYXJlbnRcXG4gICAgICAgIGlmIHJvdGF0aW9uX3Jvb3QuaXNfcm9vdCgpOlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBuZXdfcm9vdFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiByb3RhdGlvbl9yb290LmlzX2NoaWxkX3JpZ2h0KCk6XFxuICAgICAgICAgICAgICAgIHJvdGF0aW9uX3Jvb3QucGFyZW50LmNoaWxkX3JpZ2h0ID0gbmV3X3Jvb3RcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByb3RhdGlvbl9yb290LnBhcmVudC5jaGlsZF9sZWZ0ID0gbmV3X3Jvb3RcXG4gICAgICAgIG5ld19yb290LmNoaWxkX3JpZ2h0ID0gcm90YXRpb25fcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5wYXJlbnQgPSBuZXdfcm9vdFxcbiAgICAgICAgcm90YXRpb25fcm9vdC5iYWxhbmNlX2ZhY3RvciA9IChcXG4gICAgICAgICAgICByb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yIC0gMSAtIG1heChuZXdfcm9vdC5iYWxhbmNlX2ZhY3RvciwgMClcXG4gICAgICAgIClcXG4gICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yID0gKFxcbiAgICAgICAgICAgIG5ld19yb290LmJhbGFuY2VfZmFjdG9yIC0gMSArIG1pbihyb3RhdGlvbl9yb290LmJhbGFuY2VfZmFjdG9yLCAwKVxcbiAgICAgICAgKVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X2hlYXAucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5SGVhcDpcXG4gICAgXFxcIlxcXCJcXFwiTWluaW1hbCBCaW5hcnkgSGVhcFxcXCJcXFwiXFxcIlxcblxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgYSBoZWFwXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9oZWFwID0gW11cXG5cXG4gICAgZGVmIF9wZXJjX3VwKHNlbGYsIGN1cl9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiTW92ZSBhIG5vZGUgdXBcXFwiXFxcIlxcXCJcXG4gICAgICAgIHdoaWxlIChjdXJfaWR4IC0gMSkgLy8gMiA+PSAwOlxcbiAgICAgICAgICAgIHBhcmVudF9pZHggPSAoY3VyX2lkeCAtIDEpIC8vIDJcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdIDwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFtwYXJlbnRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbcGFyZW50X2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgY3VyX2lkeCA9IHBhcmVudF9pZHhcXG5cXG4gICAgZGVmIF9wZXJjX2Rvd24oc2VsZiwgY3VyX2lkeCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJNb3ZlIGEgbm9kZSBkb3duXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSAyICogY3VyX2lkeCArIDEgPCBsZW4oc2VsZi5faGVhcCk6XFxuICAgICAgICAgICAgbWluX2NoaWxkX2lkeCA9IHNlbGYuX2dldF9taW5fY2hpbGQoY3VyX2lkeClcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2N1cl9pZHhdID4gc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XTpcXG4gICAgICAgICAgICAgICAgc2VsZi5faGVhcFtjdXJfaWR4XSwgc2VsZi5faGVhcFttaW5fY2hpbGRfaWR4XSA9IChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2hlYXBbbWluX2NoaWxkX2lkeF0sXFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9oZWFwW2N1cl9pZHhdLFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcmV0dXJuXFxuICAgICAgICAgICAgY3VyX2lkeCA9IG1pbl9jaGlsZF9pZHhcXG5cXG4gICAgZGVmIF9nZXRfbWluX2NoaWxkKHNlbGYsIHBhcmVudF9pZHgpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGEgc21hbGxlciBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgMiAqIHBhcmVudF9pZHggKyAyID4gbGVuKHNlbGYuX2hlYXApIC0gMTpcXG4gICAgICAgICAgICByZXR1cm4gMiAqIHBhcmVudF9pZHggKyAxXFxuICAgICAgICBpZiBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMV0gPCBzZWxmLl9oZWFwWzIgKiBwYXJlbnRfaWR4ICsgMl06XFxuICAgICAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMVxcbiAgICAgICAgcmV0dXJuIDIgKiBwYXJlbnRfaWR4ICsgMlxcblxcbiAgICBkZWYgaGVhcGlmeShzZWxmLCBub3RfYV9oZWFwLCBzaG93X2RldGFpbHM9RmFsc2UpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQnVpbGQgYSBoZWFwIGZyb20gYW55IGxpc3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAgPSBub3RfYV9oZWFwWzpdXFxuICAgICAgICBjdXJfaWR4ID0gbGVuKHNlbGYuX2hlYXApIC8vIDIgLSAxXFxuICAgICAgICB3aGlsZSBjdXJfaWR4ID49IDA6XFxuICAgICAgICAgICAgc2VsZi5fcGVyY19kb3duKGN1cl9pZHgpXFxuICAgICAgICAgICAgY3VyX2lkeCA9IGN1cl9pZHggLSAxXFxuICAgICAgICAgICAgaWYgc2hvd19kZXRhaWxzOlxcbiAgICAgICAgICAgICAgICBwcmludChzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgaW5zZXJ0KHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIGEgbmV3IGl0ZW1cXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2hlYXAuYXBwZW5kKGl0ZW0pXFxuICAgICAgICBzZWxmLl9wZXJjX3VwKGxlbihzZWxmLl9oZWFwKSAtIDEpXFxuXFxuICAgIGRlZiBkZWxldGUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYW4gaXRlbVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5faGVhcFswXSwgc2VsZi5faGVhcFstMV0gPSBzZWxmLl9oZWFwWy0xXSwgc2VsZi5faGVhcFswXVxcbiAgICAgICAgcmVzdWx0ID0gc2VsZi5faGVhcC5wb3AoKVxcbiAgICAgICAgc2VsZi5fcGVyY19kb3duKDApXFxuICAgICAgICByZXR1cm4gcmVzdWx0XFxuXFxuICAgIGRlZiBpc19lbXB0eShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBoZWFwIGlzIGVtcHR5XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IGJvb2woc2VsZi5faGVhcClcXG5cXG4gICAgZGVmIF9fbGVuX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgaGVhcCBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYXApXFxuXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVhcCBhcyBhIHN0cmluZ1xcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9oZWFwKVxcblxcbiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiX19jb250YWluc19faW4gbWV0aG9kIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl9oZWFwXFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9iaW5hcnlfc2VhcmNoX3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDUsIDIwMTBcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZU5vZGU6XFxuICAgIFxcXCJcXFwiXFxcIkJpbmFyeSBUcmVlIE5vZGUgY2xhc3NcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSwgcGFyZW50PU5vbmUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ3JlYXRlIG5ldyBUcmVlIE5vZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IGxlZnRcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gcmlnaHRcXG4gICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudFxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX2xlZnQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZXR1cm4gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfbGVmdFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX2xlZnQoc2VsZiwgbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJBc3NpZ24gdGhlIG5vZGUncyBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUmV0dXJuIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9yaWdodFxcblxcbiAgICBkZWYgc2V0X2NoaWxkX3JpZ2h0KHNlbGYsIG5vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQXNzaWduIHRoZSBub2RlJ3MgcmlnaHQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9yaWdodCA9IHByb3BlcnR5KGdldF9jaGlsZF9yaWdodCwgc2V0X2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgZ2V0X3BhcmVudChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgc2V0X3BhcmVudChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkFzc2lnbiB0aGUgbm9kZSdzIHBhcmVudFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fcGFyZW50ID0gbm9kZVxcblxcbiAgICBwYXJlbnQgPSBwcm9wZXJ0eShnZXRfcGFyZW50LCBzZXRfcGFyZW50KVxcblxcbiAgICBkZWYgaXNfY2hpbGRfbGVmdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVmdCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fcGFyZW50LmNoaWxkX2xlZnQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfY2hpbGRfcmlnaHQoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGVjayBpZiB0aGUgbm9kZSBpcyBhIHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPT0gc2VsZlxcblxcbiAgICBkZWYgaXNfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgdHJlZSByb290XFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgaXNfbGVhZihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGlzIGEgbGVhZlxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fY2hpbGRfcmlnaHQgb3Igc2VsZi5fY2hpbGRfbGVmdClcXG5cXG4gICAgZGVmIGhhc19hX2NoaWxkKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkX3JpZ2h0IG9yIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGhhc19jaGlsZHJlbihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoZWNrIGlmIHRoZSBub2RlIGhhcyBib3RoIGNoaWxkcmVuXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHQgYW5kIHNlbGYuX2NoaWxkX2xlZnRcXG5cXG4gICAgZGVmIGdldF9rZXkoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9rZXlcXG5cXG4gICAgZGVmIHNldF9rZXkoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBub2RlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIGtleSA9IHByb3BlcnR5KGdldF9rZXksIHNldF9rZXkpXFxuXFxuICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJHZXQgbm9kZSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlXFxuXFxuICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU2V0IG5vZGUgdmFsdWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG5cXG4gICAgdmFsdWUgPSBwcm9wZXJ0eShnZXRfdmFsdWUsIHNldF92YWx1ZSlcXG5cXG4gICAgZGVmIHJlcGxhY2VfcGF5bG9hZChzZWxmLCBrZXksIHZhbHVlLCBsZWZ0LCByaWdodCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDaGFuZ2Ugbm9kZSBwYXlsb2FkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9rZXkgPSBrZXlcXG4gICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWVcXG4gICAgICAgIHNlbGYuX2NoaWxkX2xlZnQgPSBsZWZ0XFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IHJpZ2h0XFxuICAgICAgICBpZiBzZWxmLmNoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmXFxuICAgICAgICBpZiBzZWxmLmNoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGZcXG5cXG4gICAgZGVmIGZpbmRfc3VjY2Vzc29yKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiRmluZCB0aGUgbm9kZSdzIHN1Y2Nlc3NvclxcXCJcXFwiXFxcIlxcbiAgICAgICAgc3VjY2Vzc29yID0gTm9uZVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fY2hpbGRfcmlnaHQuZmluZF9taW4oKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc2VsZi5fcGFyZW50XFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzZWxmLl9wYXJlbnQuZmluZF9zdWNjZXNzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50LmNoaWxkX3JpZ2h0ID0gc2VsZlxcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvclxcblxcbiAgICBkZWYgZmluZF9taW4oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGaW5kIHRoZSBzbWFsbGVzdCBub2RlIGluIHRoZSByaWdodCBzdWJ0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICBjdXJyZW50ID0gc2VsZlxcbiAgICAgICAgd2hpbGUgY3VycmVudC5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNoaWxkX2xlZnRcXG4gICAgICAgIHJldHVybiBjdXJyZW50XFxuXFxuICAgIGRlZiBzcGxpY2Vfb3V0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiU3BsaWNlIG91dFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5pc19sZWFmKCk6XFxuICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi5oYXNfYV9jaGlsZCgpOlxcbiAgICAgICAgICAgIGlmIHNlbGYuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5pc19jaGlsZF9sZWZ0KCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnQuY2hpbGRfbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgc2VsZi5fY2hpbGRfbGVmdC5wYXJlbnQgPSBzZWxmLl9wYXJlbnRcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmlzX2NoaWxkX2xlZnQoKTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9sZWZ0ID0gc2VsZi5fY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudC5jaGlsZF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0XFxuICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBhcmVudCA9IHNlbGYuX3BhcmVudFxcblxcbiAgICBkZWYgX19pdGVyX18oc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJUaGUgc3RhbmRhcmQgaW5vcmRlciB0cmF2ZXJzYWwgb2YgYSBiaW5hcnkgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZjpcXG4gICAgICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbVxcbiAgICAgICAgICAgIHlpZWxkIHNlbGYuX2tleVxcbiAgICAgICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1cXG5cXG5cXG5jbGFzcyBCaW5hcnlTZWFyY2hUcmVlOlxcbiAgICBcXFwiXFxcIlxcXCJCaW5hcnkgc2VhcmNoIHRyZWUgaW1wbGVtZW50YXRpb25cXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcm9vdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX3NpemUgPSAwXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiVHJlZSBzaXplXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fc2l6ZVxcblxcbiAgICBkZWYgc2l6ZShzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlRyZWUgc2l6ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3NpemVcXG5cXG4gICAgZGVmIF9faXRlcl9fKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSXRlcmF0b3JcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290Ll9faXRlcl9fKClcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJbXSBnZXR0ZXIgb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0KGtleSlcXG4gICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XFxuICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuXFxuICAgIGRlZiBnZXRfcm9vdChzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkdldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9yb290XFxuXFxuICAgIGRlZiBzZXRfcm9vdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCB0cmVlIHJvb3RcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Jvb3QgPSBub2RlXFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdCwgc2V0X3Jvb3QpXFxuXFxuICAgIGRlZiBnZXQoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fcm9vdDpcXG4gICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXQoa2V5LCBzZWxmLl9yb290KVxcbiAgICAgICAgICAgIGlmIHJlc3VsdDpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZVxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBOb25lXFxuXFxuICAgIGRlZiBfZ2V0KHNlbGYsIGtleSwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJldHJpZXZlIGEgdmFsdWUgYnkgdGhlIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IGN1cnJlbnRfbm9kZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmtleSA9PSBrZXk6XFxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbm9kZVxcbiAgICAgICAgZWxpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXQoa2V5LCBjdXJyZW50X25vZGUuY2hpbGRfbGVmdClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldChrZXksIGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiW10gc2V0dGVyIG9wZXJhdG9yIG92ZXJyaWRlXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLnB1dChrZXksIHZhbHVlKVxcblxcbiAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBzZWxmLl9yb290KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLl9yb290ID0gQmluYXJ5VHJlZU5vZGUoa2V5LCB2YWx1ZSlcXG4gICAgICAgIHNlbGYuX3NpemUgPSBzZWxmLl9zaXplICsgMVxcblxcbiAgICBkZWYgX3B1dChzZWxmLCBrZXksIHZhbHVlLCBjdXJyZW50X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQWRkIG5ldyBub2RlIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBrZXkgPCBjdXJyZW50X25vZGUua2V5OlxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgICAgICBzZWxmLl9wdXQoa2V5LCB2YWx1ZSwgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQgPSBCaW5hcnlUcmVlTm9kZShcXG4gICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUsIHBhcmVudD1jdXJyZW50X25vZGVcXG4gICAgICAgICAgICAgICAgKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgICAgIHNlbGYuX3B1dChrZXksIHZhbHVlLCBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQpXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0ID0gQmluYXJ5VHJlZU5vZGUoXFxuICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlLCBwYXJlbnQ9Y3VycmVudF9ub2RlXFxuICAgICAgICAgICAgICAgIClcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiaW4gb3BlcmF0b3Igb3ZlcnJpZGVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBib29sKHNlbGYuX2dldChrZXksIHNlbGYuX3Jvb3QpKVxcblxcbiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcImRlbCBvcGVyYXRvciBvdmVycmlkZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5kZWxldGUoa2V5KVxcblxcbiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYSBub2RlIGJ5IGl0cyBrZXlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuX3NpemUgPiAxOlxcbiAgICAgICAgICAgIG5vZGVfdG9fcmVtb3ZlID0gc2VsZi5fZ2V0KGtleSwgc2VsZi5fcm9vdClcXG4gICAgICAgICAgICBpZiBub2RlX3RvX3JlbW92ZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5fZGVsZXRlKG5vZGVfdG9fcmVtb3ZlKVxcbiAgICAgICAgICAgICAgICBzZWxmLl9zaXplID0gc2VsZi5fc2l6ZSAtIDFcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihcXFwiRXJyb3IsIGtleSBub3QgaW4gdHJlZVxcXCIpXFxuICAgICAgICBlbGlmIHNlbGYuX3NpemUgPT0gMSBhbmQgc2VsZi5fcm9vdC5rZXkgPT0ga2V5OlxcbiAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBOb25lXFxuICAgICAgICAgICAgc2VsZi5fc2l6ZSA9IHNlbGYuX3NpemUgLSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKFxcXCJFcnJvciwga2V5IG5vdCBpbiB0cmVlXFxcIilcXG5cXG4gICAgZGVmIF9kZWxldGUoc2VsZiwgY3VycmVudF9ub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhIG5vZGUgYnkgaXRzIGtleSAoaGVscGVyIGZ1bmN0aW9uKVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgY3VycmVudF9ub2RlLmlzX2xlYWYoKTogICMgcmVtb3ZpbmcgYSBsZWFmXFxuICAgICAgICAgICAgaWYgY3VycmVudF9ub2RlID09IGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gTm9uZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBOb25lXFxuICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5oYXNfY2hpbGRyZW4oKTogICMgcmVtb3ZpbmcgYSBub2RlIHdpdGggdHdvIGNoaWxkcmVuXFxuICAgICAgICAgICAgc3VjY2Vzc29yID0gY3VycmVudF9ub2RlLmZpbmRfc3VjY2Vzc29yKClcXG4gICAgICAgICAgICBzdWNjZXNzb3Iuc3BsaWNlX291dCgpXFxuICAgICAgICAgICAgY3VycmVudF9ub2RlLmtleSA9IHN1Y2Nlc3Nvci5rZXlcXG4gICAgICAgICAgICBjdXJyZW50X25vZGUudmFsdWUgPSBzdWNjZXNzb3IudmFsdWVcXG4gICAgICAgIGVsc2U6ICAjIHJlbW92aW5nIGEgbm9kZSB3aXRoIG9uZSBjaGlsZFxcbiAgICAgICAgICAgIGlmIGN1cnJlbnRfbm9kZS5nZXRfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQucGFyZW50ID0gY3VycmVudF9ub2RlLnBhcmVudFxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnBhcmVudC5jaGlsZF9sZWZ0ID0gY3VycmVudF9ub2RlLmNoaWxkX2xlZnRcXG4gICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfcmlnaHQoKTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5jaGlsZF9sZWZ0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfbGVmdFxcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLnJlcGxhY2VfcGF5bG9hZChcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5rZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX2xlZnQuY2hpbGRfbGVmdCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfbGVmdC5jaGlsZF9yaWdodCxcXG4gICAgICAgICAgICAgICAgICAgIClcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBjdXJyZW50X25vZGUuaXNfY2hpbGRfbGVmdCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfbGVmdCA9IGN1cnJlbnRfbm9kZS5jaGlsZF9yaWdodFxcbiAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfbm9kZS5pc19jaGlsZF9yaWdodCgpOlxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LnBhcmVudCA9IGN1cnJlbnRfbm9kZS5wYXJlbnRcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5wYXJlbnQuY2hpbGRfcmlnaHQgPSBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHRcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZS5yZXBsYWNlX3BheWxvYWQoXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUuY2hpbGRfcmlnaHQudmFsdWUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX2xlZnQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlLmNoaWxkX3JpZ2h0LmNoaWxkX3JpZ2h0LFxcbiAgICAgICAgICAgICAgICAgICAgKVxcblxcbiAgICBkZWYgaW5vcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9pbm9yZGVyKHNlbGYuX3Jvb3QpXFxuXFxuICAgIGRlZiBfaW5vcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkluLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9sZWZ0KVxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG5cXG4gICAgZGVmIHBvc3RvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWxcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX3Bvc3RvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3Bvc3RvcmRlcihzZWxmLCB0cmVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlBvc3Qtb3JkZXIgdHJlZSB0cmF2ZXJzYWwgKGhlbHBlciBmdW5jdGlvbilcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHRyZWU6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wb3N0b3JkZXIodHJlZS5jaGlsZF9yaWdodClcXG4gICAgICAgICAgICBwcmludCh0cmVlLmtleSwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHByZW9yZGVyKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9wcmVvcmRlcihzZWxmLl9yb290KVxcblxcbiAgICBkZWYgX3ByZW9yZGVyKHNlbGYsIHRyZWUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsIChoZWxwZXIgZnVuY3Rpb24pXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiB0cmVlOlxcbiAgICAgICAgICAgIHByaW50KHRyZWUua2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVyKHRyZWUuY2hpbGRfbGVmdClcXG4gICAgICAgICAgICBzZWxmLl9wcmVvcmRlcih0cmVlLmNoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgY2xlYXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJSZW1vdmUgYWxsIG5vZGVzXFxcIlxcXCJcXFwiXFxuICAgICAgICB3aGlsZSBzZWxmLl9yb290OlxcbiAgICAgICAgICAgIHNlbGYuZGVsZXRlKHNlbGYuX3Jvb3Qua2V5KVxcblwiLFwic3JjL2xpYi9weXRob25kczMvdHJlZXMvYmluYXJ5X3RyZWUucHlcIjpcIiMhL3Vzci9iaW4vZW52IHB5dGhvbjNcXG5cXFwiXFxcIlxcXCJcXG5CcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG5Qcm9ibGVtIFNvbHZpbmcgd2l0aCBBbGdvcml0aG1zIGFuZCBEYXRhIFN0cnVjdHVyZXMgdXNpbmcgUHl0aG9uXFxuQ29weXJpZ2h0IDIwMDVcXG5VcGRhdGVkIGJ5IFJvbWFuIFlhc2lub3Zza3l5LCAyMDE3XFxuXFxcIlxcXCJcXFwiXFxuXFxuaW1wb3J0IG9wZXJhdG9yXFxuXFxuXFxuY2xhc3MgQmluYXJ5VHJlZTpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIEEgcmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIEJpbmFyeSBUcmVlXFxuICAgIFVzaW5nIGxpbmtzIGFuZCBOb2RlcyBhcHByb2FjaC5cXG5cXG4gICAgTW9kaWZpZWQgdG8gYWxsb3cgZm9yIHRyZWVzIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gb3RoZXIgdHJlZXNcXG4gICAgcmF0aGVyIHRoYW4gYWx3YXlzIGNyZWF0aW5nIGEgbmV3IHRyZWUgaW4gdGhlIGluc2VydF9mZWZ0IG9yIGluc2VydF9yaWdodFxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDcmVhdGUgbmV3IHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuX2tleSA9IGtleVxcbiAgICAgICAgc2VsZi5fY2hpbGRfbGVmdCA9IE5vbmVcXG4gICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0ID0gTm9uZVxcblxcbiAgICBkZWYgZ2V0X3Jvb3RfdmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJvb3Qga2V5IHZhbHVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fa2V5XFxuXFxuICAgIGRlZiBzZXRfcm9vdF92YWwoc2VsZiwga2V5KTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByb290IGtleSB2YWx1ZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fa2V5ID0ga2V5XFxuXFxuICAgIHJvb3QgPSBwcm9wZXJ0eShnZXRfcm9vdF92YWwsIHNldF9yb290X3ZhbClcXG5cXG4gICAgZGVmIGdldF9jaGlsZF9sZWZ0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IGxlZnQgY2hpbGRcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiBzZWxmLl9jaGlsZF9sZWZ0XFxuXFxuICAgIGRlZiBzZXRfY2hpbGRfbGVmdChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCBsZWZ0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbm9kZVxcblxcbiAgICBjaGlsZF9sZWZ0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX2xlZnQsIHNldF9jaGlsZF9sZWZ0KVxcblxcbiAgICBkZWYgZ2V0X2NoaWxkX3JpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiR2V0IHJpZ2h0IGNoaWxkXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRfcmlnaHRcXG5cXG4gICAgZGVmIHNldF9jaGlsZF9yaWdodChzZWxmLCBub2RlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNldCByaWdodCBjaGlsZFxcXCJcXFwiXFxcIlxcbiAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQgPSBub2RlXFxuXFxuICAgIGNoaWxkX3JpZ2h0ID0gcHJvcGVydHkoZ2V0X2NoaWxkX3JpZ2h0LCBzZXRfY2hpbGRfcmlnaHQpXFxuXFxuICAgIGRlZiBpc19sZWFmKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiQ2hlY2sgaWYgYSBub2RlIGlzIGxlYWZcXFwiXFxcIlxcXCJcXG4gICAgICAgIHJldHVybiAobm90IHNlbGYuX2NoaWxkX2xlZnQpIGFuZCAobm90IHNlbGYuX2NoaWxkX3JpZ2h0KVxcblxcbiAgICBkZWYgaW5zZXJ0X2xlZnQoc2VsZiwgbmV3X25vZGUpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSW5zZXJ0IGxlZnQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIG5ld19zdWJ0cmVlLnNldF9jaGlsZF9sZWZ0KHNlbGYuX2NoaWxkX2xlZnQpXFxuXFxuICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0ID0gbmV3X3N1YnRyZWVcXG5cXG4gICAgZGVmIGluc2VydF9yaWdodChzZWxmLCBuZXdfbm9kZSk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbnNlcnQgcmlnaHQgc3VidHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShuZXdfbm9kZSwgQmluYXJ5VHJlZSk6XFxuICAgICAgICAgICAgbmV3X3N1YnRyZWUgPSBuZXdfbm9kZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZSA9IEJpbmFyeVRyZWUobmV3X25vZGUpXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBuZXdfc3VidHJlZS5zZXRfY2hpbGRfcmlnaHQoc2VsZi5fY2hpbGRfcmlnaHQpXFxuICAgICAgICBzZWxmLl9jaGlsZF9yaWdodCA9IG5ld19zdWJ0cmVlXFxuXFxuICAgIGRlZiBwcmVvcmRlcihzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlByZS1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByZW9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnByZW9yZGVyKClcXG5cXG4gICAgZGVmIGlub3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJJbi1vcmRlciB0cmVlIHRyYXZlcnNhbFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfbGVmdDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0Lmlub3JkZXIoKVxcbiAgICAgICAgcHJpbnQoc2VsZi5fa2V5LCBlbmQ9XFxcIiBcXFwiKVxcbiAgICAgICAgaWYgc2VsZi5fY2hpbGRfcmlnaHQ6XFxuICAgICAgICAgICAgc2VsZi5fY2hpbGRfcmlnaHQuaW5vcmRlcigpXFxuXFxuICAgIGRlZiBwb3N0b3JkZXIoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQb3N0LW9yZGVyIHRyZWUgdHJhdmVyc2FsXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX2xlZnQucG9zdG9yZGVyKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHNlbGYuX2NoaWxkX3JpZ2h0LnBvc3RvcmRlcigpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuXFxuICAgIGRlZiBwcmludF9leHAoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJQcmludCBhbiBleHByZXNzaW9uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9sZWZ0OlxcbiAgICAgICAgICAgIHByaW50KFxcXCIoXFxcIiwgZW5kPVxcXCIgXFxcIilcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9sZWZ0LnByaW50X2V4cCgpXFxuICAgICAgICBwcmludChzZWxmLl9rZXksIGVuZD1cXFwiIFxcXCIpXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBzZWxmLl9jaGlsZF9yaWdodC5wcmludF9leHAoKVxcbiAgICAgICAgICAgIHByaW50KFxcXCIpXFxcIiwgZW5kPVxcXCIgXFxcIilcXG5cXG4gICAgZGVmIHBvc3RvcmRlcl9ldmFsKHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiUG9zdG9yZGVyIGV2YWx1YXRpb25cXFwiXFxcIlxcXCJcXG4gICAgICAgIG9wZXJhdGlvbnMgPSB7XFxuICAgICAgICAgICAgXFxcIitcXFwiOiBvcGVyYXRvci5hZGQsXFxuICAgICAgICAgICAgXFxcIi1cXFwiOiBvcGVyYXRvci5zdWIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBvcGVyYXRvci5tdWwsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBvcGVyYXRvci50cnVlZGl2LFxcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0XzEgPSBOb25lXFxuICAgICAgICByZXN1bHRfMiA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgcmVzdWx0XzEgPSBzZWxmLl9jaGlsZF9sZWZ0LnBvc3RvcmRlcl9ldmFsKClcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIHJlc3VsdF8yID0gc2VsZi5fY2hpbGRfcmlnaHQucG9zdG9yZGVyX2V2YWwoKVxcbiAgICAgICAgaWYgcmVzdWx0XzEgYW5kIHJlc3VsdF8yOlxcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25zW3NlbGYuX2tleV0ocmVzdWx0XzEsIHJlc3VsdF8yKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX2tleVxcblxcbiAgICBkZWYgaGVpZ2h0KHNlbGYpOlxcbiAgICAgICAgXFxcIlxcXCJcXFwiSGVpZ2h0IG9mIGEgdHJlZVxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgbm90IHNlbGYuX2tleTpcXG4gICAgICAgICAgICByZXR1cm4gLTFcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgaGVpZ2h0X2xlZnQgPSBzZWxmLl9jaGlsZF9sZWZ0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9sZWZ0ID0gLTFcXG5cXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX3JpZ2h0OlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LmhlaWdodCgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGhlaWdodF9yaWdodCA9IC0xXFxuXFxuICAgICAgICByZXR1cm4gMSArIG1heChoZWlnaHRfbGVmdCwgaGVpZ2h0X3JpZ2h0KVxcblxcbiAgICBkZWYgX19sZW5fXyhzZWxmKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIlNpemUgb2YgYSB0cmVlXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gc2VsZi5zaXplKClcXG5cXG4gICAgZGVmIHNpemUoc2VsZik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJDb3VudCBub2RlcyBpbiBhIHRyZWVcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIG5vdCBzZWxmLl9rZXk6XFxuICAgICAgICAgICAgcmV0dXJuIDBcXG4gICAgICAgIGlmIHNlbGYuX2NoaWxkX2xlZnQ6XFxuICAgICAgICAgICAgY2hpbGRyZW5fbGVmdCA9IHNlbGYuX2NoaWxkX2xlZnQuc2l6ZSgpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNoaWxkcmVuX2xlZnQgPSAwXFxuXFxuICAgICAgICBpZiBzZWxmLl9jaGlsZF9yaWdodDpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IHNlbGYuX2NoaWxkX3JpZ2h0LnNpemUoKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBjaGlsZHJlbl9yaWdodCA9IDBcXG5cXG4gICAgICAgIHJldHVybiAxICsgY2hpbGRyZW5fbGVmdCArIGNoaWxkcmVuX3JpZ2h0XFxuXCIsXCJzcmMvbGliL3B5dGhvbmRzMy90cmVlcy9wcmlvcml0eV9xdWV1ZS5weVwiOlwiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uM1xcblxcXCJcXFwiXFxcIlxcbkJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcblByb2JsZW0gU29sdmluZyB3aXRoIEFsZ29yaXRobXMgYW5kIERhdGEgU3RydWN0dXJlcyB1c2luZyBQeXRob25cXG5Db3B5cmlnaHQgMjAwNVxcblVwZGF0ZWQgYnkgUm9tYW4gWWFzaW5vdnNreXksIDIwMTdcXG5cXFwiXFxcIlxcXCJcXG5cXG5mcm9tIHB5dGhvbmRzMy50cmVlcy5iaW5hcnlfaGVhcCBpbXBvcnQgQmluYXJ5SGVhcFxcblxcblxcbmNsYXNzIFByaW9yaXR5UXVldWUoQmluYXJ5SGVhcCk6XFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBoZWFwIHRha2VzIChrZXksIHZhbHVlKSBwYWlycyB3aGVyZSBrZXkgc2lnbmlmaWVzIHByaW9yaXR5XFxuICAgIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGtleXMgYXJlIGFsbCBjb21wYXJhYmxlLlxcbiAgICBcXFwiXFxcIlxcXCJcXG5cXG4gICAgZGVmIGNoYW5nZV9wcmlvcml0eShzZWxmLCBuZXdfcHJpb3JpdHksIHZhbHVlKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkNoYW5nZSB0aGUgcHJpb3JpdHlcXFwiXFxcIlxcXCJcXG4gICAgICAgIGtleV90b19tb3ZlID0gMFxcbiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX2hlYXApKTpcXG4gICAgICAgICAgICBpZiBzZWxmLl9oZWFwW2ldWzFdID09IHZhbHVlOlxcbiAgICAgICAgICAgICAgICBrZXlfdG9fbW92ZSA9IGlcXG4gICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGlmIGtleV90b19tb3ZlID4gLTE6XFxuICAgICAgICAgICAgc2VsZi5faGVhcFtrZXlfdG9fbW92ZV0gPSAobmV3X3ByaW9yaXR5LCBzZWxmLl9oZWFwW2tleV90b19tb3ZlXVsxXSlcXG4gICAgICAgICAgICBzZWxmLl9wZXJjX3VwKGtleV90b19tb3ZlKVxcblwiLFwic3JjL2xpYi9weXRob25lZC9fX2luaXRfXy5weVwiOlwiXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvX19pbml0X18ucHlcIjpcIlxcblxcblxcbmZyb20gLmF2bCBpbXBvcnQgQXJib2xBVkxcXG5mcm9tIC5hYmIgaW1wb3J0IEFyYm9sQmluYXJpb0J1c3F1ZWRhXFxuZnJvbSAubW9udGljdWxvQmluYXJpbyBpbXBvcnQgTW9udGljdWxvQmluYXJpb1xcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9hcmJvbGVzL2FiYi5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiNcXG4jYWJiLnB5XFxuXFxuY2xhc3MgQXJib2xCaW5hcmlvQnVzcXVlZGE6XFxuXFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYucmFpeiA9IE5vbmVcXG4gICAgICAgIHNlbGYudGFtYW5vID0gMFxcblxcbiAgICBkZWYgYWdyZWdhcihzZWxmLGNsYXZlLHZhbG9yKTpcXG4gICAgICAgIGlmIHNlbGYucmFpejpcXG4gICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLHNlbGYucmFpeilcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yKVxcbiAgICAgICAgc2VsZi50YW1hbm8gPSBzZWxmLnRhbWFubyArIDFcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgICAgICBpZiBjbGF2ZSA8IG5vZG9BY3R1YWwuY2xhdmU6XFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgc2VsZi5fYWdyZWdhcihjbGF2ZSx2YWxvcixub2RvQWN0dWFsLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICAgICBzZWxmLl9hZ3JlZ2FyKGNsYXZlLHZhbG9yLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNobyA9IE5vZG9BcmJvbChjbGF2ZSx2YWxvcixwYWRyZT1ub2RvQWN0dWFsKVxcbiBcXG4gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsYyx2KTpcXG4gICAgICAgIHNlbGYuYWdyZWdhcihjLHYpXFxuXFxuICAgIGRlZiBvYnRlbmVyKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgaWYgc2VsZi5yYWl6OlxcbiAgICAgICAgICAgIHJlcyA9IHNlbGYuX29idGVuZXIoY2xhdmUsc2VsZi5yYWl6KVxcbiAgICAgICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5jYXJnYVV0aWxcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXR1cm4gTm9uZVxcblxcbiAgICBkZWYgX29idGVuZXIoc2VsZixjbGF2ZSxub2RvQWN0dWFsKTpcXG4gICAgXFx0aWYgbm90IG5vZG9BY3R1YWw6XFxuICAgIFxcdCAgICByZXR1cm4gTm9uZVxcbiAgICBcXHRlbGlmIG5vZG9BY3R1YWwuY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICByZXR1cm4gbm9kb0FjdHVhbFxcbiAgICBcXHRlbGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkbylcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBzZWxmLl9vYnRlbmVyKGNsYXZlLG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8pICAgICAgICBcXG5cXG4gICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgcmVzID0gc2VsZi5vYnRlbmVyKGNsYXZlKSBcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICByZXR1cm4gcmVzXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGNsYXZlKTpcXG4gICAgXFx0aWYgc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopOlxcbiAgICBcXHQgICAgcmV0dXJuIFRydWVcXG4gICAgXFx0ZWxzZTpcXG4gICAgXFx0ICAgIHJldHVybiBGYWxzZVxcbiAgICAgICBcXG4gICAgZGVmIGxvbmdpdHVkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYudGFtYW5vXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnJhaXouX19pdGVyX18oKVxcblxcbiAgICBkZWYgZWxpbWluYXIoc2VsZixjbGF2ZSk6XFxuICAgICAgICBpZiBzZWxmLnRhbWFubyA+IDE6XFxuICAgICAgICAgICBub2RvQUVsaW1pbmFyID0gc2VsZi5fb2J0ZW5lcihjbGF2ZSxzZWxmLnJhaXopXFxuICAgIFxcdCAgIGlmIG5vZG9BRWxpbWluYXI6XFxuICAgIFxcdCAgICAgICBzZWxmLnJlbW92ZXIobm9kb0FFbGltaW5hcilcXG4gICAgXFx0ICAgICAgIHNlbGYudGFtYW5vID0gc2VsZi50YW1hbm8tMVxcbiAgICBcXHQgICBlbHNlOlxcbiAgICBcXHQgICAgICAgcmFpc2UgS2V5RXJyb3IoJ0Vycm9yLCBsYSBjbGF2ZSBubyBlc3TDoSBlbiBlbCDDoXJib2wnKVxcbiAgICAgICAgZWxpZiBzZWxmLnRhbWFubyA9PSAxIGFuZCBzZWxmLnJhaXouY2xhdmUgPT0gY2xhdmU6XFxuICAgIFxcdCAgICBzZWxmLnJhaXogPSBOb25lXFxuICAgIFxcdCAgICBzZWxmLnRhbWFubyA9IHNlbGYudGFtYW5vIC0gMVxcbiAgICAgICAgZWxzZTpcXG4gICAgXFx0ICAgIHJhaXNlIEtleUVycm9yKCdFcnJvciwgbGEgY2xhdmUgbm8gZXN0w6EgZW4gZWwgw6FyYm9sJylcXG5cXG4gICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5lbGltaW5hcihjbGF2ZSlcXG5cXG4gICAgZGVmIHJlbW92ZXIoc2VsZixub2RvQWN0dWFsKTpcXG4gICAgICAgIGlmIG5vZG9BY3R1YWwuZXNIb2phKCk6ICNob2phXFxuICAgICAgICAgICAgaWYgbm9kb0FjdHVhbCA9PSBub2RvQWN0dWFsLnBhZHJlLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gTm9uZVxcbiAgICAgICAgZWxpZiBub2RvQWN0dWFsLnRpZW5lQW1ib3NIaWpvcygpOiAjaW50ZXJpb3JcXG4gICAgICAgICAgICBzdWMgPSBub2RvQWN0dWFsLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgIHN1Yy5lbXBhbG1hcigpXFxuICAgICAgICAgICAgbm9kb0FjdHVhbC5jbGF2ZSA9IHN1Yy5jbGF2ZVxcbiAgICAgICAgICAgIG5vZG9BY3R1YWwuY2FyZ2FVdGlsID0gc3VjLmNhcmdhVXRpbFxcblxcbiAgICAgICAgZWxzZTogIyBlc3RlIG5vZG8gdGllbmUgdW4gKDEpIGhpam9cXG4gICAgICAgICAgICBpZiBub2RvQWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLnBhZHJlID0gbm9kb0FjdHVhbC5wYWRyZVxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5wYWRyZS5oaWpvSXpxdWllcmRvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsaWYgbm9kb0FjdHVhbC5lc0hpam9EZXJlY2hvKCk6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLmhpam9JenF1aWVyZG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnJlZW1wbGF6YXJEYXRvRGVOb2RvKG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5jbGF2ZSwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvLmhpam9JenF1aWVyZG8sIG5vZG9BY3R1YWwuaGlqb0l6cXVpZXJkby5oaWpvRGVyZWNobylcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBub2RvQWN0dWFsLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5wYWRyZSA9IG5vZG9BY3R1YWwucGFkcmVcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwucGFkcmUuaGlqb0l6cXVpZXJkbyA9IG5vZG9BY3R1YWwuaGlqb0RlcmVjaG9cXG4gICAgICAgICAgICAgICAgZWxpZiBub2RvQWN0dWFsLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8ucGFkcmUgPSBub2RvQWN0dWFsLnBhZHJlXFxuICAgICAgICAgICAgICAgICAgICBub2RvQWN0dWFsLnBhZHJlLmhpam9EZXJlY2hvID0gbm9kb0FjdHVhbC5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgbm9kb0FjdHVhbC5yZWVtcGxhemFyRGF0b0RlTm9kbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNsYXZlLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmNhcmdhVXRpbCwgbm9kb0FjdHVhbC5oaWpvRGVyZWNoby5oaWpvSXpxdWllcmRvLCBub2RvQWN0dWFsLmhpam9EZXJlY2hvLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgaW5vcmRlbihzZWxmKTpcXG4gICAgICAgIHNlbGYuX2lub3JkZW4oc2VsZi5yYWl6KVxcblxcbiAgICBkZWYgX2lub3JkZW4oc2VsZixhcmJvbCk6XFxuICAgICAgICBpZiBhcmJvbCAhPSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuX2lub3JkZW4oYXJib2wuaGlqb0l6cXVpZXJkbylcXG4gICAgICAgICAgICBwcmludChhcmJvbC5jbGF2ZSlcXG4gICAgICAgICAgICBzZWxmLl9pbm9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgcG9zdG9yZGVuKHNlbGYpOlxcbiAgICAgICAgc2VsZi5fcG9zdG9yZGVuKHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wb3N0b3JkZW4oc2VsZiwgYXJib2wpOlxcbiAgICAgICAgaWYgYXJib2w6XFxuICAgICAgICAgICAgc2VsZi5fcG9zdG9yZGVuKGFyYm9sLmhpam9EZXJlY2hvKVxcbiAgICAgICAgICAgIHNlbGYuX3Bvc3RvcmRlbihhcmJvbC5oaWpvSXpxdWllcmRvKVxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcblxcbiAgICBkZWYgcHJlb3JkZW4oc2VsZik6XFxuICAgICAgICBzZWxmLl9wcmVvcmRlbihzZWxmLHNlbGYucmFpeilcXG5cXG4gICAgZGVmIF9wcmVvcmRlbihzZWxmLGFyYm9sKTpcXG4gICAgICAgIGlmIGFyYm9sOlxcbiAgICAgICAgICAgIHByaW50KGFyYm9sLmNsYXZlKSAgICAgICAgICAgIFxcbiAgICAgICAgICAgIHNlbGYuX3ByZW9yZGVuKGFyYm9sLmhpam9JenF1aWVyZG8pXFxuICAgICAgICAgICAgc2VsZi5fcHJlb3JkZW4oYXJib2wuaGlqb0RlcmVjaG8pXFxuXFxuXFxuY2xhc3MgTm9kb0FyYm9sOlxcbiAgIGRlZiBfX2luaXRfXyhzZWxmLGNsYXZlLHZhbG9yLGl6cXVpZXJkbz1Ob25lLGRlcmVjaG89Tm9uZSxwYWRyZT1Ob25lKTpcXG4gICAgICAgIHNlbGYuY2xhdmUgPSBjbGF2ZVxcbiAgICAgICAgc2VsZi5jYXJnYVV0aWwgPSB2YWxvclxcbiAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gaXpxdWllcmRvXFxuICAgICAgICBzZWxmLmhpam9EZXJlY2hvID0gZGVyZWNob1xcbiAgICAgICAgc2VsZi5wYWRyZSA9IHBhZHJlXFxuICAgICAgICBzZWxmLmZhY3RvckVxdWlsaWJyaW8gPSAwXFxuXFxuICAgIGRlZiB0aWVuZUhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgICAgIFxcbiAgICBkZWYgdGllbmVIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuXFxuICAgIGRlZiBlc0hpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5wYWRyZSBhbmQgc2VsZi5wYWRyZS5oaWpvSXpxdWllcmRvID09IHNlbGZcXG4gICAgXFxuICAgIGRlZiBlc0hpam9EZXJlY2hvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYucGFkcmUgYW5kIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPT0gc2VsZlxcblxcbiAgICBkZWYgZXNSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnBhZHJlXFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gbm90IChzZWxmLmhpam9EZXJlY2hvIG9yIHNlbGYuaGlqb0l6cXVpZXJkbylcXG5cXG4gICAgZGVmIHRpZW5lQWxndW5IaWpvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaGlqb0RlcmVjaG8gb3Igc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiB0aWVuZUFtYm9zSGlqb3Moc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvRGVyZWNobyBhbmQgc2VsZi5oaWpvSXpxdWllcmRvXFxuXFxuICAgIGRlZiByZWVtcGxhemFyRGF0b0RlTm9kbyhzZWxmLGNsYXZlLHZhbG9yLGhpenEsaGRlcik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gY2xhdmVcXG4gICAgICAgIHNlbGYuY2FyZ2FVdGlsID0gdmFsb3JcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IGhpenFcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBoZGVyXFxuICAgICAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkby5wYWRyZSA9IHNlbGZcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8ucGFkcmUgPSBzZWxmICAgIFxcblxcbiAgICBkZWYgZW5jb250cmFyU3VjZXNvcihzZWxmKTpcXG4gICAgICAgIHN1YyA9IE5vbmVcXG4gICAgICAgIGlmIHNlbGYudGllbmVIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgIHN1YyA9IHNlbGYuaGlqb0RlcmVjaG8uZW5jb250cmFyTWluKClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgaWYgc2VsZi5wYWRyZTpcXG4gICAgICAgICAgICAgICAgaWYgc2VsZi5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgICAgICAgICAgICAgICAgIHN1YyA9IHNlbGYucGFkcmVcXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgICAgICAgICAgICAgICAgICBzdWMgPSBzZWxmLnBhZHJlLmVuY29udHJhclN1Y2Vzb3IoKVxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IHNlbGZcXG4gICAgICAgIHJldHVybiBzdWNcXG5cXG4gICAgZGVmIGVtcGFsbWFyKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5lc0hvamEoKTpcXG4gICAgICAgICAgICBpZiBzZWxmLmVzSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBOb25lXFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgc2VsZi5wYWRyZS5oaWpvRGVyZWNobyA9IE5vbmVcXG4gICAgICAgIGVsaWYgc2VsZi50aWVuZUFsZ3VuSGlqbygpOlxcbiAgICAgICAgICAgIGlmIHNlbGYudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYucGFkcmUuaGlqb0RlcmVjaG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLnBhZHJlID0gc2VsZi5wYWRyZVxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9EZXJlY2hvXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZHJlLmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnBhZHJlID0gc2VsZi5wYWRyZVxcblxcbiAgICBkZWYgZW5jb250cmFyTWluKHNlbGYpOlxcbiAgICAgICAgYWN0dWFsID0gc2VsZlxcbiAgICAgICAgd2hpbGUgYWN0dWFsLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5oaWpvSXpxdWllcmRvXFxuICAgICAgICByZXR1cm4gYWN0dWFsXFxuXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIGlmIHNlbGY6XFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0l6cXVpZXJkbygpOlxcbiAgICBcXHQgICAgICAgIGZvciBlbGVtIGluIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG4gICAgICAgICAgICB5aWVsZCBzZWxmLmNsYXZlXFxuICAgIFxcdCAgICBpZiBzZWxmLnRpZW5lSGlqb0RlcmVjaG8oKTpcXG4gICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgXFx0XFx0ICAgIHlpZWxkIGVsZW1cXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hcmJvbEJpbmFyaW8ucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jIFxcbiNhcmJvbEJpbmFyaW8ucHlcXG5cXG5jbGFzcyBBcmJvbEJpbmFyaW86XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmLG9iamV0b1JhaXopOlxcbiAgICAgICAgc2VsZi5jbGF2ZSA9IG9iamV0b1JhaXpcXG4gICAgICAgIHNlbGYuaGlqb0l6cXVpZXJkbyA9IE5vbmVcXG4gICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBOb25lXFxuICAgIFxcbiAgICBkZWYgaW5zZXJ0YXJJenF1aWVyZG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvID09IE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgIGVsc2U6ICBcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9JenF1aWVyZG8gPSBzZWxmLmhpam9JenF1aWVyZG9cXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8gPSB0XFxuXFxuICAgIGRlZiBpbnNlcnRhckRlcmVjaG8oc2VsZixudWV2b05vZG8pOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobyA9PSBOb25lOlxcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSBBcmJvbEJpbmFyaW8obnVldm9Ob2RvKVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICB0ID0gQXJib2xCaW5hcmlvKG51ZXZvTm9kbylcXG4gICAgICAgICAgICB0Lmhpam9EZXJlY2hvID0gc2VsZi5oaWpvRGVyZWNob1xcbiAgICAgICAgICAgIHNlbGYuaGlqb0RlcmVjaG8gPSB0XFxuXFxuICAgIGRlZiBlc0hvamEoc2VsZik6XFxuICAgICAgICByZXR1cm4gKChub3Qgc2VsZi5oaWpvSXpxdWllcmRvKSBhbmQgKG5vdCBzZWxmLmhpam9EZXJlY2hvKSlcXG5cXG4gICAgZGVmIG9idGVuZXJIaWpvRGVyZWNobyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmhpam9EZXJlY2hvXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lckhpam9JenF1aWVyZG8oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5oaWpvSXpxdWllcmRvXFxuICAgIFxcbiAgICBkZWYgYXNpZ25hclZhbG9yUmFpeihzZWxmLG9iaik6XFxuICAgICAgICBzZWxmLmNsYXZlID0gb2JqXFxuXFxuICAgIGRlZiBvYnRlbmVyVmFsb3JSYWl6KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG4gICAgZGVmIGlub3JkZW4oc2VsZik6XFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvSXpxdWllcmRvLmlub3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbm9yZGVuKClcXG5cXG4gICAgZGVmIHBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucG9zdG9yZGVuKClcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5wb3N0b3JkZW4oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG5cXG4gICAgZGVmIHByZW9yZGVuKHNlbGYpOlxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSlcXG4gICAgICAgIGlmIHNlbGYuaGlqb0l6cXVpZXJkbzpcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8ucHJlb3JkZW4oKVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICBzZWxmLmhpam9EZXJlY2hvLnByZW9yZGVuKClcXG5cXG4gICAgZGVmIGltcHJpbWlyRXhwcmVzaW9uKHNlbGYpOlxcbiAgICAgICAgaWYgc2VsZi5oaWpvSXpxdWllcmRvOlxcbiAgICAgICAgICAgIHByaW50KCcoJywgZW5kPScgJylcXG4gICAgICAgICAgICBzZWxmLmhpam9JenF1aWVyZG8uaW1wcmltaXJFeHByZXNpb24oKVxcbiAgICAgICAgcHJpbnQoc2VsZi5jbGF2ZSwgZW5kPScgJylcXG4gICAgICAgIGlmIHNlbGYuaGlqb0RlcmVjaG86XFxuICAgICAgICAgICAgc2VsZi5oaWpvRGVyZWNoby5pbXByaW1pckV4cHJlc2lvbigpXFxuICAgICAgICAgICAgcHJpbnQoJyknLCBlbmQ9JyAnKVxcblxcbiAgICBkZWYgZXZhbFBvc3RvcmRlbihzZWxmKTpcXG4gICAgICAgIG9wZXJzID0geycrJzpvcGVyYXRvci5hZGQsICctJzpvcGVyYXRvci5zdWIsICcqJzpvcGVyYXRvci5tdWwsICcvJzpvcGVyYXRvci50cnVlZGl2fVxcbiAgICAgICAgcmVzMSA9IE5vbmVcXG4gICAgICAgIHJlczIgPSBOb25lXFxuICAgICAgICBpZiBzZWxmLmhpam9JenF1aWVyZG86XFxuICAgICAgICAgICAgcmVzMSA9IHNlbGYuaGlqb0l6cXVpZXJkby5ldmFsUG9zdG9yZGVuKCkgICMvLyBcXFxcbGFiZWx7cGVsZWZ0fVxcbiAgICAgICAgaWYgc2VsZi5oaWpvRGVyZWNobzpcXG4gICAgICAgICAgICByZXMyID0gc2VsZi5oaWpvRGVyZWNoby5ldmFsUG9zdG9yZGVuKCkgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcnNbc2VsZi5jbGF2ZV0ocmVzMSxyZXMyKSAjLy8gXFxcXGxhYmVse3BlZXZhbH1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2xhdmVcXG5cXG5kZWYgaW5vcmRlbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sICE9IE5vbmU6XFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgICBpbm9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKVxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICAgIGlmIGFyYm9sLmhpam9JenF1aWVyZG86XFxuICAgICAgICBwcmludCgnKCcsIGVuZD0nICcpXFxuICAgICAgICBpbXByaW1pckV4cHJlc2lvbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKVxcbiAgICBwcmludChhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCksIGVuZD0nICcpXFxuICAgIGlmIGFyYm9sLmhpam9EZXJlY2hvOlxcbiAgICAgICAgaW1wcmltaXJFeHByZXNpb24oYXJib2wub2J0ZW5lckhpam9EZXJlY2hvKCkpXFxuICAgICAgICBwcmludCgnKScsIGVuZD0nICcpIFxcblxcbmRlZiBpbXByaW1pckV4cHJlc2lvbihhcmJvbCk6XFxuICB2YWxvckNhZGVuYSA9IFxcXCJcXFwiXFxuICBpZiBhcmJvbDpcXG4gICAgICB2YWxvckNhZGVuYSA9ICcoJyArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvSXpxdWllcmRvKCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIHN0cihhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCkpXFxuICAgICAgdmFsb3JDYWRlbmEgPSB2YWxvckNhZGVuYSArIGltcHJpbWlyRXhwcmVzaW9uKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSsnKSdcXG4gIHJldHVybiB2YWxvckNhZGVuYVxcblxcbmRlZiBldmFsUG9zdG9yZGVuKGFyYm9sKTpcXG4gICAgb3BlcmFkb3JlcyA9IHsnKyc6b3BlcmF0b3IuYWRkLCAnLSc6b3BlcmF0b3Iuc3ViLCAnKic6b3BlcmF0b3IubXVsLCAnLyc6b3BlcmF0b3IudHJ1ZWRpdn1cXG4gICAgcmVzMSA9IE5vbmVcXG4gICAgcmVzMiA9IE5vbmVcXG4gICAgaWYgYXJib2w6XFxuICAgICAgICByZXMxID0gZXZhbFBvc3RvcmRlbihhcmJvbC5vYnRlbmVySGlqb0l6cXVpZXJkbygpKSAjLy8gXFxcXGxhYmVse3BlbGVmdH1cXG4gICAgICAgIHJlczIgPSBldmFsUG9zdG9yZGVuKGFyYm9sLm9idGVuZXJIaWpvRGVyZWNobygpKSAgIy8vIFxcXFxsYWJlbHtwZXJpZ2h0fVxcbiAgICAgICAgaWYgcmVzMSBhbmQgcmVzMjpcXG4gICAgICAgICAgICByZXR1cm4gb3BlcmFkb3Jlc1thcmJvbC5vYnRlbmVyVmFsb3JSYWl6KCldKHJlczEscmVzMikgIy8vIFxcXFxsYWJlbHtwZWV2YWx9XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBhcmJvbC5vYnRlbmVyVmFsb3JSYWl6KClcXG5cXG5kZWYgYWx0dXJhKGFyYm9sKTpcXG4gICAgaWYgYXJib2wgPT0gTm9uZTpcXG4gICAgICAgIHJldHVybiAtMVxcbiAgICBlbHNlOlxcbiAgICAgICAgcmV0dXJuIDEgKyBtYXgoYWx0dXJhKGFyYm9sLmhpam9JenF1aWVyZG8pLGFsdHVyYShhcmJvbC5oaWpvRGVyZWNobykpXFxuXFxudCA9IEFyYm9sQmluYXJpbyg3KVxcbnQuaW5zZXJ0YXJJenF1aWVyZG8oMylcXG50Lmluc2VydGFyRGVyZWNobyg5KVxcbmlub3JkZW4odClcXG5pbXBvcnQgb3BlcmF0b3JcXG54ID0gQXJib2xCaW5hcmlvKCcqJylcXG54Lmluc2VydGFySXpxdWllcmRvKCcrJylcXG5sID0geC5vYnRlbmVySGlqb0l6cXVpZXJkbygpXFxubC5pbnNlcnRhckl6cXVpZXJkbyg0KVxcbmwuaW5zZXJ0YXJEZXJlY2hvKDUpXFxueC5pbnNlcnRhckRlcmVjaG8oNylcXG5wcmludChpbXByaW1pckV4cHJlc2lvbih4KSlcXG5wcmludChldmFsUG9zdG9yZGVuKHgpKVxcbnByaW50KGFsdHVyYSh4KSlcXG5cIixcInNyYy9saWIvcHl0aG9uZWQvYXJib2xlcy9hdmwucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2F2bC5weVxcblxcbmZyb20gLmFiYiBpbXBvcnQgQXJib2xCaW5hcmlvQnVzcXVlZGEsIE5vZG9BcmJvbFxcblxcbmNsYXNzIEFyYm9sQVZMKEFyYm9sQmluYXJpb0J1c3F1ZWRhKTpcXG5cXG4gICAgZGVmIF9hZ3JlZ2FyKHNlbGYsY2xhdmUsdmFsb3Isbm9kb0FjdHVhbCk6XFxuICAgIFxcdGlmIGNsYXZlIDwgbm9kb0FjdHVhbC5jbGF2ZTpcXG4gICAgXFx0ICAgIGlmIG5vZG9BY3R1YWwudGllbmVIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHQgICAgZWxzZTpcXG4gICAgXFx0XFx0bm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvID0gTm9kb0FyYm9sKGNsYXZlLHZhbG9yLHBhZHJlPW5vZG9BY3R1YWwpXFxuICAgIFxcdFxcdHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kb0FjdHVhbC5oaWpvSXpxdWllcmRvKVxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgbm9kb0FjdHVhbC50aWVuZUhpam9EZXJlY2hvKCk6XFxuICAgIFxcdFxcdHNlbGYuX2FncmVnYXIoY2xhdmUsdmFsb3Isbm9kb0FjdHVhbC5oaWpvRGVyZWNobylcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdFxcdG5vZG9BY3R1YWwuaGlqb0RlcmVjaG8gPSBOb2RvQXJib2woY2xhdmUsdmFsb3IscGFkcmU9bm9kb0FjdHVhbClcXG4gICAgXFx0XFx0c2VsZi5hY3R1YWxpemFyRXF1aWxpYnJpbyhub2RvQWN0dWFsLmhpam9EZXJlY2hvKVxcblxcbiAgICBkZWYgYWN0dWFsaXphckVxdWlsaWJyaW8oc2VsZixub2RvKTpcXG4gICAgXFx0aWYgbm9kby5mYWN0b3JFcXVpbGlicmlvID4gMSBvciBub2RvLmZhY3RvckVxdWlsaWJyaW8gPCAtMTpcXG4gICAgXFx0ICAgIHNlbGYucmVlcXVpbGlicmFyKG5vZG8pICAgIFxcbiAgICBcXHQgICAgcmV0dXJuXFxuICAgIFxcdGlmIG5vZG8ucGFkcmUgIT0gTm9uZTpcXG4gICAgXFx0ICAgIGlmIG5vZG8uZXNIaWpvSXpxdWllcmRvKCk6XFxuICAgIFxcdFxcdCAgICBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gKz0gMVxcbiAgICBcXHQgICAgZWxpZiBub2RvLmVzSGlqb0RlcmVjaG8oKTpcXG4gICAgXFx0XFx0ICAgIG5vZG8ucGFkcmUuZmFjdG9yRXF1aWxpYnJpbyAtPSAxXFxuXFxuICAgIFxcdCAgICBpZiBub2RvLnBhZHJlLmZhY3RvckVxdWlsaWJyaW8gIT0gMDpcXG4gICAgXFx0XFx0ICAgIHNlbGYuYWN0dWFsaXphckVxdWlsaWJyaW8obm9kby5wYWRyZSlcXG5cXG4gICAgZGVmIHJlZXF1aWxpYnJhcihzZWxmLG5vZG8pOlxcbiAgICAgICAgaWYgbm9kby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgaWYgbm9kby5oaWpvRGVyZWNoby5mYWN0b3JFcXVpbGlicmlvID4gMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJEZXJlY2hhKG5vZG8uaGlqb0RlcmVjaG8pXFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuXFx0ICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFySXpxdWllcmRhKG5vZG8pXFxuICAgICAgICBlbGlmIG5vZG8uZmFjdG9yRXF1aWxpYnJpbyA+IDA6XFxuXFx0ICAgIGlmIG5vZG8uaGlqb0l6cXVpZXJkby5mYWN0b3JFcXVpbGlicmlvIDwgMDpcXG5cXHQgICAgICAgIHNlbGYucm90YXJJenF1aWVyZGEobm9kby5oaWpvSXpxdWllcmRvKVxcblxcdCAgICAgICAgc2VsZi5yb3RhckRlcmVjaGEobm9kbylcXG5cXHQgICAgIGVsc2U6XFxuXFx0ICAgICAgICBzZWxmLnJvdGFyRGVyZWNoYShub2RvKVxcbiAgICAgICAgICAgXFxuICAgIGRlZiByb3Rhckl6cXVpZXJkYShzZWxmLHJvdFJhaXopOlxcbiAgICBcXHRudWV2YVJhaXogPSByb3RSYWl6Lmhpam9EZXJlY2hvXFxuICAgIFxcdHJvdFJhaXouaGlqb0RlcmVjaG8gPSBudWV2YVJhaXouaGlqb0l6cXVpZXJkb1xcbiAgICBcXHRpZiBudWV2YVJhaXouaGlqb0l6cXVpZXJkbyAhPSBOb25lOlxcbiAgICBcXHQgICAgbnVldmFSYWl6Lmhpam9JenF1aWVyZG8ucGFkcmUgPSByb3RSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgXFx0aWYgcm90UmFpei5lc1JhaXooKTpcXG4gICAgXFx0ICAgIHNlbGYucmFpeiA9IG51ZXZhUmFpelxcbiAgICBcXHRlbHNlOlxcbiAgICBcXHQgICAgaWYgcm90UmFpei5lc0hpam9JenF1aWVyZG8oKTpcXG4gICAgXFx0ICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXpcXG4gICAgXFx0ICAgIGVsc2U6XFxuICAgIFxcdCAgICBcXHRyb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgIFxcdG51ZXZhUmFpei5oaWpvSXpxdWllcmRvID0gcm90UmFpelxcbiAgICBcXHRyb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgIFxcdHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyA9IHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbyArIDEgLSBtaW4obnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8sIDApXFxuICAgIFxcdG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvID0gbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gKyAxICsgbWF4KHJvdFJhaXouZmFjdG9yRXF1aWxpYnJpbywgMClcXG5cXG4gICAgZGVmIHJvdGFyRGVyZWNoYShzZWxmLHJvdFJhaXopOlxcbiAgICAgICAgbnVldmFSYWl6ID0gcm90UmFpei5oaWpvSXpxdWllcmRvXFxuICAgICAgICByb3RSYWl6Lmhpam9JenF1aWVyZG8gPSBudWV2YVJhaXouaGlqb0RlcmVjaG9cXG4gICAgICAgIGlmIG51ZXZhUmFpei5oaWpvRGVyZWNobyAhPSBOb25lOlxcbiAgICAgICAgICAgIG51ZXZhUmFpei5oaWpvRGVyZWNoby5wYWRyZSA9IHJvdFJhaXpcXG4gICAgICAgIG51ZXZhUmFpei5wYWRyZSA9IHJvdFJhaXoucGFkcmVcXG4gICAgICAgIGlmIHJvdFJhaXouZXNSYWl6KCk6XFxuICAgICAgICAgICAgc2VsZi5yYWl6ID0gbnVldmFSYWl6XFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHJvdFJhaXouZXNIaWpvRGVyZWNobygpOlxcbiAgICAgICAgICAgICAgICByb3RSYWl6LnBhZHJlLmhpam9EZXJlY2hvID0gbnVldmFSYWl6XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgcm90UmFpei5wYWRyZS5oaWpvSXpxdWllcmRvID0gbnVldmFSYWl6XFxuICAgICAgICBudWV2YVJhaXouaGlqb0RlcmVjaG8gPSByb3RSYWl6XFxuICAgICAgICByb3RSYWl6LnBhZHJlID0gbnVldmFSYWl6XFxuICAgICAgICByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSByb3RSYWl6LmZhY3RvckVxdWlsaWJyaW8gLSAxIC0gbWF4KG51ZXZhUmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKVxcbiAgICAgICAgbnVldmFSYWl6LmZhY3RvckVxdWlsaWJyaW8gPSBudWV2YVJhaXouZmFjdG9yRXF1aWxpYnJpbyAtIDEgKyBtaW4ocm90UmFpei5mYWN0b3JFcXVpbGlicmlvLCAwKSAgXFxuXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2FyYm9sZXMvbW9udGljdWxvQmluYXJpby5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI21vbnRpY3Vsb0JpbmFyaW8ucHlcXG5cXG5jbGFzcyBNb250aWN1bG9CaW5hcmlvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhTW9udGljdWxvID0gWzBdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IDBcXG5cXG4gICAgZGVmIGNvbnN0cnVpck1vbnRpY3VsbyhzZWxmLHVuYUxpc3RhKTpcXG4gICAgICAgIGkgPSBsZW4odW5hTGlzdGEpIC8vIDJcXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gbGVuKHVuYUxpc3RhKVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3VsbyA9IFswXSArIHVuYUxpc3RhWzpdXFxuICAgICAgICBwcmludChsZW4oc2VsZi5saXN0YU1vbnRpY3VsbyksIGkpXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHByaW50KHNlbGYubGlzdGFNb250aWN1bG8sIGkpXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBYmFqbyhpKVxcbiAgICAgICAgICAgIGkgPSBpIC0gMVxcbiAgICAgICAgcHJpbnQoc2VsZi5saXN0YU1vbnRpY3VsbyxpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaW5maWx0QWJham8oc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIChpICogMikgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaG0gPSBzZWxmLmhpam9NaW4oaSlcXG4gICAgICAgICAgICBpZiBzZWxmLmxpc3RhTW9udGljdWxvW2ldID4gc2VsZi5saXN0YU1vbnRpY3Vsb1tobV06XFxuICAgICAgICAgICAgICAgIHRtcCA9IHNlbGYubGlzdGFNb250aWN1bG9baV1cXG4gICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA9IHNlbGYubGlzdGFNb250aWN1bG9baG1dXFxuICAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baG1dID0gdG1wXFxuICAgICAgICAgICAgaSA9IGhtXFxuICAgICAgICAgICAgICAgIFxcbiAgICBkZWYgaGlqb01pbihzZWxmLGkpOlxcbiAgICAgICAgaWYgaSAqIDIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgcmV0dXJuIGkgKiAyXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGlmIHNlbGYubGlzdGFNb250aWN1bG9baSAqIDJdIDwgc2VsZi5saXN0YU1vbnRpY3Vsb1tpICogMiArIDFdOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gaSAqIDIgKyAxXFxuXFxuICAgIGRlZiBpbmZpbHRBcnJpYmEoc2VsZixpKTpcXG4gICAgICAgIHdoaWxlIGkgLy8gMiA+IDA6XFxuICAgICAgICAgICAgaWYgc2VsZi5saXN0YU1vbnRpY3Vsb1tpXSA8IHNlbGYubGlzdGFNb250aWN1bG9baS8vMl06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdXFxuICAgICAgICAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1tpIC8vIDJdID0gc2VsZi5saXN0YU1vbnRpY3Vsb1tpXVxcbiAgICAgICAgICAgICAgIHNlbGYubGlzdGFNb250aWN1bG9baV0gPSB0bXBcXG4gICAgICAgICAgICBpID0gaSAvLyAyXFxuIFxcbiAgICBkZWYgaW5zZXJ0YXIoc2VsZixrKTpcXG4gICAgICAgIHNlbGYubGlzdGFNb250aWN1bG8uYXBwZW5kKGspXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsICsgMVxcbiAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEoc2VsZi50YW1hbm9BY3R1YWwpXFxuXFxuICAgIGRlZiBlbGltaW5hck1pbihzZWxmKTpcXG4gICAgICAgIHZhbG9yU2FjYWRvID0gc2VsZi5saXN0YU1vbnRpY3Vsb1sxXVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsb1sxXSA9IHNlbGYubGlzdGFNb250aWN1bG9bc2VsZi50YW1hbm9BY3R1YWxdXFxuICAgICAgICBzZWxmLnRhbWFub0FjdHVhbCA9IHNlbGYudGFtYW5vQWN0dWFsIC0gMVxcbiAgICAgICAgc2VsZi5saXN0YU1vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpbyhzZWxmKTpcXG4gICAgICAgIGlmIHRhbWFub0FjdHVhbCA9PSAwOlxcbiAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHJldHVybiBGYWxzZVxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL19faW5pdF9fLnB5XCI6XCJcXG4jX19hbGxfXyA9IFtcXFwicGlsYVxcXCJdXFxuXFxuXFxuZnJvbSAucGlsYSBpbXBvcnQgUGlsYVxcbmZyb20gLmNvbGEgaW1wb3J0IENvbGFcXG5mcm9tIC5jb2xhZG9ibGUgaW1wb3J0IENvbGFEb2JsZVxcblxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9iYXNpY2FzL2NvbGEucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2NvbGEucHlcXG5cXG5jbGFzcyBDb2xhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5pbnNlcnQoMCxpdGVtKVxcblxcbiAgICBkZWYgYXZhbnphcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zLnBvcCgpXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvY29sYWRvYmxlLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYWRvYmxlLnB5XFxuXFxuY2xhc3MgQ29sYURvYmxlOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBhZ3JlZ2FyRnJlbnRlKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGFncmVnYXJGaW5hbChzZWxmLCBpdGVtKTpcXG4gICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KDAsaXRlbSlcXG5cXG4gICAgZGVmIHJlbW92ZXJGcmVudGUoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgcmVtb3ZlckZpbmFsKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMucG9wKDApXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2Jhc2ljYXMvcGlsYS5weVwiOlwiIyBCcmFkbGV5IE4uIE1pbGxlciwgRGF2aWQgTC4gUmFudW1cXG4jIFNvbHVjacOzbiBkZSBwcm9ibGVtYXMgY29uIGFsZ29yaXRtb3MgeSBlc3RydWN0dXJhcyBkZSBkYXRvcyB1c2FuZG8gUHl0aG9uXFxuIyBDb3B5cmlnaHQgMjAxNFxcbiMgXFxuI3BpbGEucHlcXG5cXG5jbGFzcyBQaWxhOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLml0ZW1zID0gW11cXG5cXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLml0ZW1zID09IFtdXFxuXFxuICAgIGRlZiBpbmNsdWlyKHNlbGYsIGl0ZW0pOlxcbiAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSlcXG5cXG4gICAgZGVmIGV4dHJhZXIoc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5wb3AoKVxcblxcbiAgICBkZWYgaW5zcGVjY2lvbmFyKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbbGVuKHNlbGYuaXRlbXMpLTFdXFxuXFxuICAgIGRlZiB0YW1hbm8oc2VsZik6XFxuICAgICAgICByZXR1cm4gbGVuKHNlbGYuaXRlbXMpXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9fX2luaXRfXy5weVwiOlwiXFxuXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IEdyYWZvXFxuZnJvbSAuZ3JhZm9BZHkgaW1wb3J0IFZlcnRpY2VcXG5mcm9tIC5jb2xhUHJpb3JpZGFkIGltcG9ydCBDb2xhUHJpb3JpZGFkXFxuXCIsXCJzcmMvbGliL3B5dGhvbmVkL2dyYWZvcy9jb2xhUHJpb3JpZGFkLnB5XCI6XCIjIEJyYWRsZXkgTi4gTWlsbGVyLCBEYXZpZCBMLiBSYW51bVxcbiMgU29sdWNpw7NuIGRlIHByb2JsZW1hcyBjb24gYWxnb3JpdG1vcyB5IGVzdHJ1Y3R1cmFzIGRlIGRhdG9zIHVzYW5kbyBQeXRob25cXG4jIENvcHlyaWdodCAyMDE0XFxuIyBcXG4jY29sYVByaW9yaWRhZC5weVxcblxcbmNsYXNzIENvbGFQcmlvcmlkYWQ6XFxuICAgIGRlZiBfX2luaXRfXyhzZWxmKTpcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3VsbyA9IFsoMCwwKV1cXG4gICAgICAgIHNlbGYudGFtYW5vQWN0dWFsID0gMFxcblxcbiAgICBkZWYgY29uc3RydWlyTW9udGljdWxvKHNlbGYsdW5hTGlzdGEpOlxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBsZW4odW5hTGlzdGEpXFxuICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8gPSBbKDAsMCldXFxuICAgICAgICBmb3IgaSBpbiB1bmFMaXN0YTpcXG4gICAgICAgICAgICBzZWxmLmFycmVnbG9Nb250aWN1bG8uYXBwZW5kKGkpXFxuICAgICAgICBpID0gbGVuKHVuYUxpc3RhKSAvLyAyICAgICAgICAgICAgXFxuICAgICAgICB3aGlsZSAoaSA+IDApOlxcbiAgICAgICAgICAgIHNlbGYuaW5maWx0QWJham8oaSlcXG4gICAgICAgICAgICBpID0gaSAtIDFcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGluZmlsdEFiYWpvKHNlbGYsaSk6XFxuICAgICAgICB3aGlsZSAoaSAqIDIpIDw9IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIGhtID0gc2VsZi5oaWpvTWluKGkpXFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzBdID4gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXVswXTpcXG4gICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpXSA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tobV1cXG4gICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2htXSA9IHRtcFxcbiAgICAgICAgICAgIGkgPSBobVxcbiAgICAgICAgICAgICAgICBcXG4gICAgZGVmIGhpam9NaW4oc2VsZixpKTpcXG4gICAgICAgIGlmIGkqMiA+IHNlbGYudGFtYW5vQWN0dWFsOlxcbiAgICAgICAgICAgIHJldHVybiAtMVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBpKjIgKyAxID4gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgICAgIHJldHVybiBpKjJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baSoyXVswXSA8IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1tpKjIrMV1bMF06XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSoyKzFcXG5cXG4gICAgZGVmIGluZmlsdEFycmliYShzZWxmLGkpOlxcbiAgICAgICAgd2hpbGUgaSAvLyAyID4gMDpcXG4gICAgICAgICAgICBpZiBzZWxmLmFycmVnbG9Nb250aWN1bG9baV1bMF0gPCBzZWxmLmFycmVnbG9Nb250aWN1bG9baS8vMl1bMF06XFxuICAgICAgICAgICAgICAgdG1wID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2kvLzJdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldXFxuICAgICAgICAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldID0gdG1wXFxuICAgICAgICAgICAgaSA9IGkvLzJcXG4gXFxuICAgIGRlZiBpbnNlcnRhcihzZWxmLGspOlxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvLmFwcGVuZChrKVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCArIDFcXG4gICAgICAgIHNlbGYuaW5maWx0QXJyaWJhKHNlbGYudGFtYW5vQWN0dWFsKVxcblxcbiAgICBkZWYgZWxpbWluYXJNaW4oc2VsZik6XFxuICAgICAgICB2YWxvclNhY2FkbyA9IHNlbGYuYXJyZWdsb01vbnRpY3Vsb1sxXVsxXVxcbiAgICAgICAgc2VsZi5hcnJlZ2xvTW9udGljdWxvWzFdID0gc2VsZi5hcnJlZ2xvTW9udGljdWxvW3NlbGYudGFtYW5vQWN0dWFsXVxcbiAgICAgICAgc2VsZi50YW1hbm9BY3R1YWwgPSBzZWxmLnRhbWFub0FjdHVhbCAtIDFcXG4gICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsby5wb3AoKVxcbiAgICAgICAgc2VsZi5pbmZpbHRBYmFqbygxKVxcbiAgICAgICAgcmV0dXJuIHZhbG9yU2FjYWRvXFxuICAgICAgICBcXG4gICAgZGVmIGVzdGFWYWNpYShzZWxmKTpcXG4gICAgICAgIGlmIHNlbGYudGFtYW5vQWN0dWFsID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIEZhbHNlXFxuXFxuICAgIGRlZiBkZWNyZW1lbnRhckNsYXZlKHNlbGYsdmFsb3IsbnVldm8pOlxcbiAgICAgICAgaGVjaG8gPSBGYWxzZVxcbiAgICAgICAgaSA9IDFcXG4gICAgICAgIG1pQ2xhdmUgPSAwXFxuICAgICAgICB3aGlsZSBub3QgaGVjaG8gYW5kIGkgPD0gc2VsZi50YW1hbm9BY3R1YWw6XFxuICAgICAgICAgICAgaWYgc2VsZi5hcnJlZ2xvTW9udGljdWxvW2ldWzFdID09IHZhbG9yOlxcbiAgICAgICAgICAgICAgICBoZWNobyA9IFRydWVcXG4gICAgICAgICAgICAgICAgbWlDbGF2ZSA9IGlcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpID0gaSArIDFcXG4gICAgICAgIGlmIG1pQ2xhdmUgPiAwOlxcbiAgICAgICAgICAgIHNlbGYuYXJyZWdsb01vbnRpY3Vsb1ttaUNsYXZlXSA9IChudWV2byxzZWxmLmFycmVnbG9Nb250aWN1bG9bbWlDbGF2ZV1bMV0pXFxuICAgICAgICAgICAgc2VsZi5pbmZpbHRBcnJpYmEobWlDbGF2ZSlcXG4gICAgICAgICAgICBcXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHZlcnRpY2UpOlxcbiAgICAgICAgZm9yIHBhcmVqYSBpbiBzZWxmLmFycmVnbG9Nb250aWN1bG86XFxuICAgICAgICAgICAgaWYgcGFyZWphWzFdID09IHZlcnRpY2U6XFxuICAgICAgICAgICAgICAgIHJldHVybiBUcnVlXFxuICAgICAgICByZXR1cm4gRmFsc2UgICAgIFxcblxcblwiLFwic3JjL2xpYi9weXRob25lZC9ncmFmb3MvZ3JhZm9BZHkucHlcIjpcIiMgQnJhZGxleSBOLiBNaWxsZXIsIERhdmlkIEwuIFJhbnVtXFxuIyBTb2x1Y2nDs24gZGUgcHJvYmxlbWFzIGNvbiBhbGdvcml0bW9zIHkgZXN0cnVjdHVyYXMgZGUgZGF0b3MgdXNhbmRvIFB5dGhvblxcbiMgQ29weXJpZ2h0IDIwMTRcXG4jXFxuI2dyYWZvQWR5LnB5XFxuXFxuXFxuaW1wb3J0IHN5c1xcblxcbmNsYXNzIEdyYWZvOlxcbiAgICBkZWYgX19pbml0X18oc2VsZik6XFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXMgPSB7fVxcbiAgICAgICAgc2VsZi5udW1WZXJ0aWNlcyA9IDBcXG4gICAgICAgIFxcbiAgICBkZWYgYWdyZWdhclZlcnRpY2Uoc2VsZixjbGF2ZSk6XFxuICAgICAgICBzZWxmLm51bVZlcnRpY2VzID0gc2VsZi5udW1WZXJ0aWNlcyArIDFcXG4gICAgICAgIG51ZXZvVmVydGljZSA9IFZlcnRpY2UoY2xhdmUpXFxuICAgICAgICBzZWxmLmxpc3RhVmVydGljZXNbY2xhdmVdID0gbnVldm9WZXJ0aWNlXFxuICAgICAgICByZXR1cm4gbnVldm9WZXJ0aWNlXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lclZlcnRpY2Uoc2VsZixuKTpcXG4gICAgICAgIGlmIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzOlxcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmxpc3RhVmVydGljZXNbbl1cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG4gICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLG4pOlxcbiAgICAgICAgcmV0dXJuIG4gaW4gc2VsZi5saXN0YVZlcnRpY2VzXFxuICAgIFxcbiAgICBkZWYgYWdyZWdhckFyaXN0YShzZWxmLGRlLGEsY29zdG89MCk6XFxuICAgICAgICAgICAgaWYgZGUgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGRlKVxcbiAgICAgICAgICAgIGlmIGEgbm90IGluIHNlbGYubGlzdGFWZXJ0aWNlczpcXG4gICAgICAgICAgICAgICAgbnYgPSBzZWxmLmFncmVnYXJWZXJ0aWNlKGEpXFxuICAgICAgICAgICAgc2VsZi5saXN0YVZlcnRpY2VzW2RlXS5hZ3JlZ2FyVmVjaW5vKHNlbGYubGlzdGFWZXJ0aWNlc1thXSxjb3N0bylcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyVmVydGljZXMoc2VsZik6XFxuICAgICAgICByZXR1cm4gbGlzdChzZWxmLmxpc3RhVmVydGljZXMua2V5cygpKVxcbiAgICAgICAgXFxuICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBpdGVyKHNlbGYubGlzdGFWZXJ0aWNlcy52YWx1ZXMoKSlcXG4gICAgICAgICAgICAgICAgXFxuY2xhc3MgVmVydGljZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsY2xhdmUpOlxcbiAgICAgICAgc2VsZi5pZCA9IGNsYXZlXFxuICAgICAgICBzZWxmLmNvbmVjdGFkb0EgPSB7fVxcbiAgICAgICAgc2VsZi5jb2xvciA9ICdibGFuY28nXFxuICAgICAgICBzZWxmLmRpc3QgPSBzeXMubWF4c2l6ZVxcbiAgICAgICAgc2VsZi5wcmVkZWNlc29yID0gTm9uZVxcbiAgICAgICAgc2VsZi5kZXNjID0gMFxcbiAgICAgICAgc2VsZi5maW4gPSAwXFxuXFxuICAgICMgZGVmIF9fbHRfXyhzZWxmLG8pOlxcbiAgICAjICAgICByZXR1cm4gc2VsZi5pZCA8IG8uaWRcXG4gICAgXFxuICAgIGRlZiAgYWdyZWdhclZlY2lubyhzZWxmLHZlY2lubyxwb25kZXJhY2lvbj0wKTpcXG4gICAgICAgIHNlbGYuY29uZWN0YWRvQVt2ZWNpbm9dID0gcG9uZGVyYWNpb25cXG4gICAgICAgIFxcbiAgICBkZWYgYXNpZ25hckNvbG9yKHNlbGYsY29sb3IpOlxcbiAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yXFxuICAgICAgICBcXG4gICAgZGVmIGFzaWduYXJEaXN0YW5jaWEoc2VsZixkKTpcXG4gICAgICAgIHNlbGYuZGlzdCA9IGRcXG5cXG4gICAgZGVmIGFzaWduYXJQcmVkZWNlc29yKHNlbGYscCk6XFxuICAgICAgICBzZWxmLnByZWRlY2Vzb3IgPSBwXFxuXFxuICAgIGRlZiBhc2lnbmFyRGVzY3VicmltaWVudG8oc2VsZix0aWVtcG9EZXNjdWJyaW1pZW50byk6XFxuICAgICAgICBzZWxmLmRlc2MgPSB0aWVtcG9EZXNjdWJyaW1pZW50b1xcbiAgICAgICAgXFxuICAgIGRlZiBhc2lnbmFyRmluYWxpemFjaW9uKHNlbGYsdGllbXBvRmluYWxpemFjaW9uKTpcXG4gICAgICAgIHNlbGYuZmluID0gdGllbXBvRmluYWxpemFjaW9uXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJGaW5hbGl6YWNpb24oc2VsZik6XFxuICAgICAgICByZXR1cm4gc2VsZi5maW5cXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRlc2N1YnJpbWllbnRvKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuZGVzY1xcbiAgICAgICAgXFxuICAgIGRlZiBvYnRlbmVyUHJlZGVjZXNvcihzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLnByZWRlY2Vzb3JcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckRpc3RhbmNpYShzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmRpc3RcXG4gICAgICAgIFxcbiAgICBkZWYgb2J0ZW5lckNvbG9yKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuY29sb3JcXG4gICAgXFxuICAgIGRlZiBvYnRlbmVyQ29uZXhpb25lcyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBzZWxmLmNvbmVjdGFkb0Eua2V5cygpXFxuICAgICAgICBcXG4gICAgZGVmIG9idGVuZXJQb25kZXJhY2lvbihzZWxmLHZlY2lubyk6XFxuICAgICAgICByZXR1cm4gc2VsZi5jb25lY3RhZG9BW3ZlY2lub11cXG4gICAgICAgICAgICAgICAgXFxuICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKSArIFxcXCI6Y29sb3IgXFxcIiArIHNlbGYuY29sb3IgKyBcXFwiOmRlc2MgXFxcIiArIHN0cihzZWxmLmRlc2MpICsgXFxcIjpmaW4gXFxcIiArIHN0cihzZWxmLmZpbikgKyBcXFwiOmRpc3RhbmNpYSBcXFwiICsgc3RyKHNlbGYuZGlzdCkgKyBcXFwiOnByZWRlY2Vzb3IgXFxcXG5cXFxcdFtcXFwiICsgc3RyKHNlbGYucHJlZGVjZXNvcikrIFxcXCJdXFxcXG5cXFwiXFxuICAgIFxcbiAgICBkZWYgb2J0ZW5lcklkKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGYuaWRcXG5cIixcInNyYy9saWIvcXVvcHJpLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJxdW9wcmkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yYW5kb20uanNcIjpcInZhciBNZXJzZW5uZVR3aXN0ZXI9ZnVuY3Rpb24oYSl7YT09bnVsbCYmKGE9bmV3IERhdGUoKS5nZXRUaW1lKCkpLHRoaXMuTj02MjQsdGhpcy5NPTM5Nyx0aGlzLk1BVFJJWF9BPTI1Njc0ODM2MTUsdGhpcy5VUFBFUl9NQVNLPTIxNDc0ODM2NDgsdGhpcy5MT1dFUl9NQVNLPTIxNDc0ODM2NDcsdGhpcy5tdD1BcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLHRoaXMuaW5pdF9nZW5yYW5kKGEpfTtNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfZ2VucmFuZD1mdW5jdGlvbihhKXtmb3IodGhpcy5tdFswXT1hPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgYT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oMTgxMjQzMzI1MyooKDQyOTQ5MDE3NjAmYSk+Pj4xNik8PDE2KSsxODEyNDMzMjUzKig2NTUzNSZhKSt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X2J5X2FycmF5PWZ1bmN0aW9uKGEsYil7dmFyIGQsZSxmO2Zvcih0aGlzLmluaXRfZ2VucmFuZCgxOTY1MDIxOCksZD0xLGU9MCxmPXRoaXMuTj5iP3RoaXMuTjpiO2Y7Zi0tKXt2YXIgZz10aGlzLm10W2QtMV1edGhpcy5tdFtkLTFdPj4+MzA7dGhpcy5tdFtkXT0odGhpcy5tdFtkXV4oMTY2NDUyNSooKDQyOTQ5MDE3NjAmZyk+Pj4xNik8PDE2KSsxNjY0NTI1Kig2NTUzNSZnKSkrYVtlXStlLHRoaXMubXRbZF0+Pj49MCxkKyssZSsrLGQ+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sZD0xKSxlPj1iJiYoZT0wKX1mb3IoZj10aGlzLk4tMTtmO2YtLSl7dmFyIGc9dGhpcy5tdFtkLTFdXnRoaXMubXRbZC0xXT4+PjMwO3RoaXMubXRbZF09KHRoaXMubXRbZF1eKDE1NjYwODM5NDEqKCg0Mjk0OTAxNzYwJmcpPj4+MTYpPDwxNikrMTU2NjA4Mzk0MSooNjU1MzUmZykpLWQsdGhpcy5tdFtkXT4+Pj0wLGQrKyxkPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLGQ9MSl9dGhpcy5tdFswXT0yMTQ3NDgzNjQ4fSxNZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmdlbnJhbmRfaW50MzI9ZnVuY3Rpb24oKXt2YXIgYSxiPVswLHRoaXMuTUFUUklYX0FdO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBkO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9nZW5yYW5kKDU0ODkpLGQ9MDtkPHRoaXMuTi10aGlzLk07ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCt0aGlzLk1dXmE+Pj4xXmJbMSZhXTtmb3IoO2Q8dGhpcy5OLTE7ZCsrKWE9dGhpcy5tdFtkXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtkKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W2RdPXRoaXMubXRbZCsodGhpcy5NLXRoaXMuTildXmE+Pj4xXmJbMSZhXTthPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5hPj4+MV5iWzEmYV0sdGhpcy5tdGk9MH1yZXR1cm4gYT10aGlzLm10W3RoaXMubXRpKytdLGFePWE+Pj4xMSxhXj0yNjM2OTI4NjQwJmE8PDcsYV49NDAyMjczMDc1MiZhPDwxNSxhXj1hPj4+MTgsYT4+PjB9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9pbnQzMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKT4+PjF9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlbnJhbmRfaW50MzIoKSooMS80Mjk0OTY3Mjk1KX0sTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZW5yYW5kX2ludDMyKCkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZWFsMz1mdW5jdGlvbigpe3JldHVybih0aGlzLmdlbnJhbmRfaW50MzIoKSsuNSkqKDEvNDI5NDk2NzI5Nil9LE1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUuZ2VucmFuZF9yZXM1Mz1mdW5jdGlvbigpe3ZhciBkPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NSxhPXRoaXMuZ2VucmFuZF9pbnQzMigpPj4+NjtyZXR1cm4oNjcxMDg4NjQqZCthKSooMS85MDA3MTk5MjU0NzQwOTkyKX07dmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5sb2csYj1NYXRoLnNxcnQsZD17fSxlPW5ldyBNZXJzZW5uZVR3aXN0ZXIsZj12b2lkIDA7ZC5zZWVkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNlZWRcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMCwxKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGU9MDxhcmd1bWVudHMubGVuZ3RoP25ldyBNZXJzZW5uZVR3aXN0ZXIoYSk6bmV3IE1lcnNlbm5lVHdpc3RlcixTay5idWlsdGluLm5vbmUubm9uZSR9KSxkLnJhbmRvbT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRvbVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApLG5ldyBTay5idWlsdGluLmZsb2F0XyhlLmdlbnJhbmRfcmVzNTMoKSl9KTt2YXIgZz1mdW5jdGlvbihhKXtyZXR1cm4gMHxhfSxoPWZ1bmN0aW9uKGEsYixkKXt2YXIgZixoLGk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgZmlyc3QgYXJndW1lbnQgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYodm9pZCAwPT09YilyZXR1cm4gaT1nKGUuZ2VucmFuZF9yZXM1MygpKmEpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZih2b2lkIDA9PT1kJiYoZD0xKSxmPWItYSwxPT1kJiYwPGYpcmV0dXJuIGk9YStnKGUuZ2VucmFuZF9yZXM1MygpKmYpLG5ldyBTay5idWlsdGluLmludF8oaSk7aWYoMT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkgKFxcXCIrYStcXFwiLCBcXFwiK2IrXFxcIiwgXFxcIitmK1xcXCIpXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwibm9uLWludGVnZXIgc3RlcCBmb3IgcmFuZHJhbmdlKClcXFwiKTtpZigwPGQpaD1nKChmK2QtMSkvZCk7ZWxzZSBpZigwPmQpaD1nKChmK2QrMSkvZCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpXFxcIik7aWYoMD49aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKClcXFwiKTtyZXR1cm4gaT1hK2QqZyhlLmdlbnJhbmRfcmVzNTMoKSpoKSxuZXcgU2suYnVpbHRpbi5pbnRfKGkpfTtkLnJhbmRpbnQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihkLGUpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJyYW5kaW50XFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGgoZCxlKzEpfSksZC5yYW5kcmFuZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsZCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInJhbmRyYW5nZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDMpLGE9U2suYnVpbHRpbi5hc251bSQoYSksYj1Tay5idWlsdGluLmFzbnVtJChiKSxkPVNrLmJ1aWx0aW4uYXNudW0kKGQpLGgoYSxiLGQpfSksZC51bmlmb3JtPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZCxmKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ1bmlmb3JtXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksZD1Tay5idWlsdGluLmFzbnVtJChkKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpO3ZhciBnPWUuZ2VucmFuZF9yZXM1MygpO3JldHVybiBjPWQrZyooZi1kKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9KSxkLnRyaWFuZ3VsYXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGQsZil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwidHJpYW5ndWxhclxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImxvd1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiaGlnaFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihkKSk7dmFyIGcsaCxpO3JldHVybiBhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGQ9U2suYnVpbHRpbi5hc251bSQoZCksYT5kJiYoaT1hLGE9ZCxkPWkpLHZvaWQgMD09PWZ8fGY9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/Zj0oZC1hKS8yOihTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJtb2RlXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGYpKSxmPVNrLmJ1aWx0aW4uYXNudW0kKGYpKSxnPWUuZ2VucmFuZF9yZXM1MygpLGg9ZzwoZi1hKS8oZC1hKT9hK2IoZyooZC1hKSooZi1hKSk6ZC1iKCgxLWcpKihkLWEpKihkLWYpKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oaCl9KTt2YXIgaT1mdW5jdGlvbihkLGcpe3ZhciBrLGwsbSxuLG8saD1NYXRoLnNpbixpPU1hdGguY29zLGo9TWF0aC5QSTtyZXR1cm4gdm9pZCAwPT09Zj8oaz1lLmdlbnJhbmRfcmVzNTMoKSxsPWUuZ2VucmFuZF9yZXM1MygpLG09YigtMiphKGspKSxuPTIqaipsLG89bSppKG4pLGY9bSpoKG4pKToobz1mLGY9dm9pZCAwKSxkK2cqb307cmV0dXJuIGQuZ2F1c3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJnYXVzc1xcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcIm11XFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzaWdtYVxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYT1Tay5idWlsdGluLmFzbnVtJChhKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG5ldyBTay5idWlsdGluLmZsb2F0XyhpKGEsYikpfSksZC5ub3JtYWx2YXJpYXRlPWQuZ2F1c3MsZC5sb2dub3JtdmFyaWF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGQ9TWF0aC5leHA7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImxvZ25vcm12YXJpYXRlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwibXVcXFwiLFxcXCJudW1iZXJcXFwiLFNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInNpZ21hXFxcIixcXFwibnVtYmVyXFxcIixTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKSxhPVNrLmJ1aWx0aW4uYXNudW0kKGEpLGI9U2suYnVpbHRpbi5hc251bSQoYiksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGQoaShhLGIpKSl9KSxkLmV4cG92YXJpYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZXhwb3ZhcmlhdGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJsYW1iZFxcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihiKSksYj1Tay5idWlsdGluLmFzbnVtJChiKTt2YXIgZD1lLmdlbnJhbmRfcmVzNTMoKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1hKGQpL2IpfSksZC5jaG9pY2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjaG9pY2VcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzZXFcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSx2b2lkIDAhPT1hLnNxJGxlbmd0aCl7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uaW50XyhnKGUuZ2VucmFuZF9yZXM1MygpKmEuc3EkbGVuZ3RoKCkpKTtyZXR1cm4gYS5tcCRzdWJzY3JpcHQoYil9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpfSksZC5zaHVmZmxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7aWYoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2h1ZmZsZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInhcXFwiLFxcXCJzZXF1ZW5jZVxcXCIsU2suYnVpbHRpbi5jaGVja1NlcXVlbmNlKGEpKSxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KXtjb25zdCBoPWEudjtmb3IodmFyIGI9aC5sZW5ndGgtMTswPGI7Yi09MSl7dmFyIGQ9ZyhlLmdlbnJhbmRfcmVzNTMoKSooYisxKSksZj1oW2RdO2hbZF09aFtiXSxoW2JdPWZ9fWVsc2UgaWYodm9pZCAwPT09YS5zcSRsZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaGFzIG5vIGxlbmd0aFxcXCIpO2Vsc2UgaWYodm9pZCAwIT09YS5tcCRhc3Nfc3Vic2NyaXB0KWZvcih2YXIgZCxiPWEuc3EkbGVuZ3RoKCktMTswPGI7Yi09MSl7ZD1uZXcgU2suYnVpbHRpbi5pbnRfKGcoZS5nZW5yYW5kX3JlczUzKCkqKGIrMSkpKSxiPW5ldyBTay5idWlsdGluLmludF8oYik7dmFyIGY9YS5tcCRzdWJzY3JpcHQoZCk7YS5tcCRhc3Nfc3Vic2NyaXB0KGQsYS5tcCRzdWJzY3JpcHQoYikpLGEubXAkYXNzX3N1YnNjcmlwdChiLGYpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJvYmplY3QgaXMgaW1tdXRhYmxlXFxcIik7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGQuc2FtcGxlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgZixnLGgsbCxtLGQ9TWF0aC5mbG9vcjtmb3IoU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic2FtcGxlXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMiksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwicG9wdWxhdGlvblxcXCIsXFxcIml0ZXJhYmxlXFxcIixTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpLFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcImtcXFwiLFxcXCJpbnRlZ2VyXFxcIixTay5idWlsdGluLmNoZWNrSW50KGIpKSxiPVNrLmJ1aWx0aW4uYXNudW0kKGIpLG09W10saD1Tay5hYnN0ci5pdGVyKGEpLChmPTAsbD1oLnRwJGl0ZXJuZXh0KCkpO3ZvaWQgMCE9PWw7ZisrLGw9aC50cCRpdGVybmV4dCgpKWc9ZChlLmdlbnJhbmRfcmVzNTMoKSooZisxKSksZjxiPyhnPGYmJihtW2ZdPW1bZ10pLG1bZ109bCk6ZzxiJiYobVtnXT1sKTtpZihmPGIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwic2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb25cXFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChtKX0pLGR9O1wiLFwic3JjL2xpYi9yZS5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKG5hbWUpe3ZhciB2YWxpZEdyb3Vwcyxjb252ZXJ0LGdldEZsYWdzLF9zcGxpdCxfZmluZGFsbCxtYXRjaG9iaixfc2VhcmNoLF9tYXRjaCxyZWdleG9iaixtb2Q9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihcXFwicmVcXFwiKX07cmV0dXJuIG1vZC5JPTIsbW9kLklHTk9SRUNBU0U9Mixtb2QuTT04LG1vZC5NVUxUSUxJTkU9OCx2YWxpZEdyb3Vwcz1bXFxcIig/OlxcXCIsXFxcIig/PVxcXCIsXFxcIig/IVxcXCJdLGNvbnZlcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkO2lmKGM9YS5tYXRjaCgvXFxcXChcXFxcPy4vZyksYylmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKC0xPT12YWxpZEdyb3Vwcy5pbmRleE9mKGNbZF0pKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkRpc2FsbG93ZWQgZ3JvdXAgaW4gcGF0dGVybjogJ1xcXCIrY1tkXStcXFwiJ1xcXCIpO3JldHVybiBiPWEucmVwbGFjZShcXFwiL1xcXFxcXFxcL2dcXFwiLFxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIiksYj1hLnJlcGxhY2UoLyhbXlxcXFxcXFxcXSl7LCg/IVteXFxcXFtdKlxcXFxdKS9nLFxcXCIkMXswLFxcXCIpLGJ9LGdldEZsYWdzPWZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJnXFxcIjtyZXR1cm4oYSZtb2QuSUdOT1JFQ0FTRSk9PW1vZC5JR05PUkVDQVNFJiYoYis9XFxcImlcXFwiKSwoYSZtb2QuTVVMVElMSU5FKT09bW9kLk1VTFRJTElORSYmKGIrPVxcXCJtXFxcIiksYn0sX3NwbGl0PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaixrLGwsbTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDQpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwicGF0dGVybiBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzdHJpbmcgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhIG51bWJlclxcXCIpO2lmKHZvaWQgMD09PWQmJihkPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGQpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO2ZvcihjPVNrLmJ1aWx0aW4uYXNudW0kKGMpLGU9U2suZmZpLnVud3JhcG8oYSksZj1Tay5mZmkudW53cmFwbyhiKSxlPWNvbnZlcnQoZSksZz1udWxsIT09ZS5tYXRjaCgvXlxcXFwoLipcXFxcKSQvKSxoPWdldEZsYWdzKGQpLGk9bmV3IFJlZ0V4cChlLGgpLGo9W10sayxsPTAsbT0wO251bGwhPShrPWkuZXhlYyhmKSkmJmsuaW5kZXghPT1pLmxhc3RJbmRleCYmKGoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoZi5zdWJzdHJpbmcobCxrLmluZGV4KSkpLGcmJmoucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoa1swXSkpLGw9aS5sYXN0SW5kZXgsbSs9MSwhKGMmJm0+PWMpKTspO3JldHVybiBqLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGYuc3Vic3RyaW5nKGwpKSksbmV3IFNrLmJ1aWx0aW4ubGlzdChqKX0sX3NwbGl0LmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcIm1heHNwbGl0XFxcIixcXFwiZmxhZ3NcXFwiXSxfc3BsaXQuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApLG5ldyBTay5idWlsdGluLmludF8oMCldLG1vZC5zcGxpdD1uZXcgU2suYnVpbHRpbi5mdW5jKF9zcGxpdCksX2ZpbmRhbGw9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsajtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7aWYoZD1Tay5mZmkudW53cmFwbyhhKSxlPVNrLmZmaS51bndyYXBvKGIpLGQ9Y29udmVydChkKSxmPWdldEZsYWdzKGMpLGc9bmV3IFJlZ0V4cChkLGYpLGQubWF0Y2goL1xcXFwkLykpe3ZhciBrPW5ldyBSZWdFeHAoL1xcXFxuJC8pO2UubWF0Y2goaykmJihlPWUuc2xpY2UoMCwtMSkpfWZvcihoPVtdLGo7bnVsbCE9KGo9Zy5leGVjKGUpKTspe2lmKDI+ai5sZW5ndGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqWzBdKSk7ZWxzZSBpZigyPT1qLmxlbmd0aCloLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGpbMV0pKTtlbHNle2Zvcih2YXIgbD1bXSxtPTE7bTxqLmxlbmd0aDttKyspbC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihqW21dKSk7aC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGwpKX1qLmluZGV4PT09Zy5sYXN0SW5kZXgmJihnLmxhc3RJbmRleCs9MSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoaCl9LF9maW5kYWxsLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX2ZpbmRhbGwuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2QuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKF9maW5kYWxsKSxtYXRjaG9iaj1mdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS50aGVtYXRjaD1iLGEucmU9YyxhLnN0cmluZz1kLFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pLGIuZ3JvdXBzPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9YS50aGVtYXRjaC52LnNsaWNlKDEpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShiKX0pLGIuZ3JvdXA9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGI9dm9pZCAwPT09Yj8wOlNrLmJ1aWx0aW4uYXNudW0kKGIpLGI+PWEudGhlbWF0Y2gudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcXFwiSW5kZXggb3V0IG9mIHJhbmdlOiBcXFwiK2IpO3JldHVybiBhLnRoZW1hdGNoLnZbYl19KX0sbW9kLk1hdGNoT2JqZWN0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MobW9kLG1hdGNob2JqLFxcXCJNYXRjaE9iamVjdFxcXCIsW10pLG1vZC5fZmluZHJlPWZ1bmN0aW9uKHJlcyxzdHJpbmcpe3Jlcz1yZXMucmVwbGFjZSgvKFteXFxcXFxcXFxdKXssKD8hW15cXFxcW10qXFxcXF0pL2csXFxcIiQxezAsXFxcIik7dmFyIG1hdGNoZXMsc2l0ZW0scmV0dmFsLHJlPWV2YWwocmVzKSxwYXR0PS9cXFxcbiQvLHN0cj1Tay5mZmkucmVtYXBUb0pzKHN0cmluZyk7aWYobWF0Y2hlcz1zdHIubWF0Y2gocGF0dCk/c3RyLnNsaWNlKDAsLTEpLm1hdGNoKHJlKTpzdHIubWF0Y2gocmUpLHJldHZhbD1uZXcgU2suYnVpbHRpbi5saXN0LG51bGw9PW1hdGNoZXMpcmV0dXJuIHJldHZhbDtmb3IodmFyIGk9MDtpPG1hdGNoZXMubGVuZ3RoOysraSlzaXRlbT1uZXcgU2suYnVpbHRpbi5zdHIobWF0Y2hlc1tpXSkscmV0dmFsLnYucHVzaChzaXRlbSk7cmV0dXJuIHJldHZhbH0sX3NlYXJjaD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwzKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwic3RyaW5nIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz0wKSwhU2suYnVpbHRpbi5jaGVja051bWJlcihjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcImZsYWdzIG11c3QgYmUgYSBudW1iZXJcXFwiKTtyZXR1cm4oZT1cXFwiL1xcXCIrYS52LnJlcGxhY2UoL1xcXFwvL2csXFxcIlxcXFxcXFxcL1xcXCIpK1xcXCIvXFxcIixsc3Q9bW9kLl9maW5kcmUoZSxiKSwxPmxzdC52Lmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX3NlYXJjaC5jb192YXJuYW1lcz1bXFxcInBhdHRlcm5cXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJmbGFnc1xcXCJdLF9zZWFyY2guJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxtb2Quc2VhcmNoPW5ldyBTay5idWlsdGluLmZ1bmMoX3NlYXJjaCksX21hdGNoPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1hdGNoXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsMyksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJwYXR0ZXJuIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cmluZyBtdXN0IGJlIGEgc3RyaW5nXFxcIik7aWYodm9pZCAwPT09YyYmKGM9MCksIVNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJmbGFncyBtdXN0IGJlIGEgbnVtYmVyXFxcIik7cmV0dXJuKHBhdD1Tay5mZmkucmVtYXBUb0pzKGEpLGU9XFxcIi9eXFxcIitwYXQucmVwbGFjZSgvXFxcXC8vZyxcXFwiXFxcXFxcXFwvXFxcIikrXFxcIi9cXFwiLGxzdD1tb2QuX2ZpbmRyZShlLGIpLDE+U2suZmZpLnJlbWFwVG9Kcyhsc3QpLmxlbmd0aCk/U2suYnVpbHRpbi5ub25lLm5vbmUkOihkPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuTWF0Y2hPYmplY3QsW2xzdCxhLGJdKSxkKX0sX21hdGNoLmNvX3Zhcm5hbWVzPVtcXFwicGF0dGVyblxcXCIsXFxcInN0cmluZ1xcXCIsXFxcImZsYWdzXFxcIl0sX21hdGNoLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKV0sbW9kLm1hdGNoPW5ldyBTay5idWlsdGluLmZ1bmMoX21hdGNoKSxyZWdleG9iaj1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGcsaDtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlPWIsYS5mbGFncz12b2lkIDA9PT1jPzA6YyxTay5idWlsdGluLm5vbmUubm9uZSR9KSxoPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7dmFyIGI9XFxcInJlLmNvbXBpbGUoJ1xcXCIrU2suZmZpLnJlbWFwVG9KcyhhLnJlKStcXFwiJylcXFwiO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGIuc3Vic3RyaW5nKDAsMjEyKSl9KSxiLl9fc3RyX189aCxiLl9fcmVwcl9fPWgsYz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9U2suZmZpLnJlbWFwVG9KcyhhKSxlPW51bGw9PWI/MDpTay5mZmkucmVtYXBUb0pzKGIpLGY9bnVsbD09Yz9kLmxlbmd0aDpTay5mZmkucmVtYXBUb0pzKGMpO3JldHVyblxcXCJeXFxcIj09ZSYmKGU9ZC5pbmRleE9mKFxcXCJcXFxcblxcXCIpKzEpLG51bGw9PT1mJiYoZj1kLmxlbmd0aCksU2suZmZpLnJlbWFwVG9QeShkLnN1YnN0cmluZyhlLGYpKX0sZD1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzZWFyY2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX3NlYXJjaChhLnJlLGYsYS5mbGFncyl9LGQuY29fdmFybmFtZXM9W1xcXCJzZWxmXFxcIixcXFwic3RyaW5nXFxcIixcXFwicG9zXFxcIixcXFwiZW5kcG9zXFxcIl0sZC4kZGVmYXVsdHM9W25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSxiLnNlYXJjaD1uZXcgU2suYnVpbHRpbi5mdW5jKGQpLGU9ZnVuY3Rpb24oYSxiLGQsZSl7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibWF0Y2hcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiw0KTt2YXIgZj1jKGIsZCxlKTtyZXR1cm4gX21hdGNoKGEucmUsZixhLmZsYWdzKX0sZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxlLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIubWF0Y2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhlKSxmPWZ1bmN0aW9uKGEsYixjKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzcGxpdFxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDMpLHZvaWQgMD09PWMmJihjPTApLCFTay5idWlsdGluLmNoZWNrSW50KGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwibWF4c3BsaXQgbXVzdCBiZSBhbiBpbnRlZ2VyXFxcIik7cmV0dXJuIF9zcGxpdChhLnJlLGIsYyxhLmZsYWdzKX0sZi5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJtYXhzcGxpdFxcXCJdLGYuJGRlZmF1bHRzPVtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSxiLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZiksZz1mdW5jdGlvbihhLGIsZCxlKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJmaW5kYWxsXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCk7dmFyIGY9YyhiLGQsZSk7cmV0dXJuIF9maW5kYWxsKGEucmUsZixhLmZsYWdzKX0sZy5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzdHJpbmdcXFwiLFxcXCJwb3NcXFwiLFxcXCJlbmRwb3NcXFwiXSxnLiRkZWZhdWx0cz1bbmV3IFNrLmJ1aWx0aW4uaW50XygwKSxTay5idWlsdGluLm5vbmUubm9uZSRdLGIuZmluZGFsbD1uZXcgU2suYnVpbHRpbi5mdW5jKGcpfSxtb2QuUmVnZXhPYmplY3Q9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhtb2QscmVnZXhvYmosXFxcIlJlZ2V4T2JqZWN0XFxcIixbXSksbW9kLmNvbXBpbGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjO2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNvbXBpbGVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSwhU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2lmKHZvaWQgMD09PWImJihiPTApLCFTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZmxhZ3MgbXVzdCBiZSBhIG51bWJlclxcXCIpO3JldHVybiBjPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShtb2QuUmVnZXhPYmplY3QsW2EsYl0pLGN9KSxtb2QucHVyZ2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe30pLG1vZH07XCIsXCJzcmMvbGliL3JlcHIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJlcHIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZXF1ZXN0cy5weVwiOlwiIyBtb3N0IHJlc3RyaWN0ZWQgdmVyc2lvblxcblxcXCJcXFwiXFxcIlxcblRoaXMgc29sdXRpb24gd29ya3MgaW4gcnVuZXN0b25lIC0gaG93ZXZlciBpdCBpcyBtdWNoIG1vcmUgbGltaXRlZC5cXG5BbiBlcnJvciBkb2VzIG5vdCBvY2N1ciBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHRleHRib29rIGFzIGl0IGRvZXNcXG5mb3IgdGhlIGNvbW1hbmQgbGluZS4gU2luY2UgSFRUUEVycm9yIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGluXFxuUnVuZXN0b25lLCBJIGhhZCB0byBjaGFuZ2UgdGhlIGV4Y2VwdGlvbi5cXG5EZWNvZGUgYW5kIEVuY29kZSBhcmUgbm90IGF2YWlsYWJsZSBpbiBSdW5lc3RvbmUsIHNvIHRoZXJlIG1pZ2h0IGJlXFxuaXNzdWVzIHdpdGggcmVwb25zZXMuXFxuRG9lcyBub3QgdXNlIHRoZSBzdGF0dXMgYXR0cmlidXRlIGZvciB1cmxvcGVuLCB3b3VsZCBiZSBuaWNlIHRvIGhhdmVcXG50aGF0IGJhY2suXFxuRG9lcyBub3Qgd29yayBvbiByZWd1bGFyIHdlYiBwYWdlcyAobGlrZSBnb29nbGUgb3IgdGhlIG1pY2hpZ2FuIGRhaWx5KSBiZWNhdXNlIG9mIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGxpbWl0cy5cXG5cXFwiXFxcIlxcXCJcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuaW1wb3J0IGpzb25cXG5cXG5jbGFzcyBSZXNwb25zZTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEsIHVybCk6XFxuICAgICAgICBzZWxmLnRleHQgPSBkYXRhXFxuICAgICAgICBzZWxmLnVybCA9IHVybFxcblxcbiAgICBkZWYganNvbihzZWxmKTpcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhzZWxmLnRleHQpXFxuICAgICAgICBleGNlcHQ6XFxuICAgICAgICAgICAgcmV0dXJuIHtcXFwiZXJyb3JcXFwiOiBcXFwiUmVzcG9uc2Ugbm90IGludGVycHJldGFibGUgYXMganNvbi4gVHJ5IHByaW50aW5nIHRoZSAudGV4dCBhdHRyaWJ1dGVcXFwifVxcblxcbiAgICBkZWYgX19zdHJfXyhzZWxmKTpcXG4gICAgICAgIHJldHVybiBcXFwiPEEgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgZm9sbG93aW5nIHJlcXVlc3Q6IHt9PlxcXCIuZm9ybWF0KHNlbGYudXJsKVxcblxcblxcbnVybF9zdWJzID0ge1xcXCIgXFxcIjogXFxcIitcXFwiLFxcbiAgICAgICAgICAgIFxcXCIhXFxcIjogXFxcIiUyMVxcXCIsXFxuICAgICAgICAgICAgJ1xcXCInOiBcXFwiJTIyXFxcIixcXG4gICAgICAgICAgICBcXFwiI1xcXCI6IFxcXCIlMjNcXFwiLFxcbiAgICAgICAgICAgIFxcXCIkXFxcIjogXFxcIiUyNFxcXCIsXFxuICAgICAgICAgICAgXFxcIidcXFwiOiBcXFwiJTI3XFxcIixcXG4gICAgICAgICAgICBcXFwiKFxcXCI6IFxcXCIlMjhcXFwiLFxcbiAgICAgICAgICAgIFxcXCIpXFxcIjogXFxcIiUyOVxcXCIsXFxuICAgICAgICAgICAgXFxcIipcXFwiOiBcXFwiJTJBXFxcIixcXG4gICAgICAgICAgICBcXFwiK1xcXCI6IFxcXCIlMkJcXFwiLFxcbiAgICAgICAgICAgIFxcXCIsXFxcIjogXFxcIiUyQ1xcXCIsXFxuICAgICAgICAgICAgXFxcIi9cXFwiOiBcXFwiJTJGXFxcIixcXG4gICAgICAgICAgICBcXFwiOlxcXCI6IFxcXCIlM0FcXFwiLFxcbiAgICAgICAgICAgIFxcXCI7XFxcIjogXFxcIiUzQlxcXCIsXFxuICAgICAgICAgICAgXFxcIj1cXFwiOiBcXFwiJTNEXFxcIixcXG4gICAgICAgICAgICBcXFwiP1xcXCI6IFxcXCIlM0ZcXFwiLFxcbiAgICAgICAgICAgIFxcXCJAXFxcIjogXFxcIiU0MFxcXCIsXFxuICAgICAgICAgICAgXFxcIltcXFwiOiBcXFwiJTVCXFxcIixcXG4gICAgICAgICAgICBcXFwiXVxcXCI6IFxcXCIlNURcXFwiLFxcbiAgICAgICAgICAgIH1cXG5cXG5kZWYgX3N1YnN0KHMsIHN1YnN0aXR1dGlvbnM9dXJsX3N1YnMpOlxcbiAgICByZXMgPSBcXFwiXFxcIlxcbiAgICBmb3IgYyBpbiBzdHIocyk6XFxuICAgICAgICBpZiBjIGluIHN1YnN0aXR1dGlvbnM6XFxuICAgICAgICAgICAgcmVzICs9IHN1YnN0aXR1dGlvbnNbY11cXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgcmVzICs9IGNcXG4gICAgcmV0dXJuIHJlc1xcblxcblxcbmRlZiByZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIHRyeTpcXG4gICAgICAgIGlmIGxlbihwYXJhbXMpID09IDA6XFxuICAgICAgICAgICAgcmV0dXJuIGJhc2V1cmxcXG4gICAgICAgIGNvbXBsZXRlX3VybCA9IGJhc2V1cmwgKyBcXFwiP1xcXCJcXG4gICAgICAgIHBhaXJzID0gW1xcXCJ7fT17fVxcXCIuZm9ybWF0KF9zdWJzdChrKSwgX3N1YnN0KHBhcmFtc1trXSkpIGZvciBrIGluIHBhcmFtc11cXG4gICAgICAgIGNvbXBsZXRlX3VybCArPSBcXFwiJlxcXCIuam9pbihwYWlycylcXG4gICAgICAgIHJldHVybiBjb21wbGV0ZV91cmxcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIE5vbmVcXG5cXG5kZWYgZ2V0KGJhc2V1cmwsIHBhcmFtcz17fSk6XFxuICAgIGZ1bGxfdXJsID0gcmVxdWVzdFVSTChiYXNldXJsLCBwYXJhbXMpXFxuICAgIGlmIG5vdCBmdWxsX3VybDpcXG4gICAgICAgIHRleHRfZGF0YSA9IFxcXCI8aHRtbD48Ym9keT48aDE+aW52YWxpZCByZXF1ZXN0PC9oMT48L2JvZHk+PC9odG1sPlxcXCJcXG4gICAgICAgIGZ1bGxfdXJsID0gXFxcIkNvdWxkbuKAmXQgZ2VuZXJhdGUgYSB2YWxpZCBVUkxcXFwiXFxuICAgIGVsc2U6XFxuICAgICAgICBkYXRhID0gdXJsb3BlbihmdWxsX3VybClcXG4gICAgICAgIHRleHRfZGF0YSA9IGRhdGEucmVhZCgpLnN0cmlwKClcXG4gICAgICAgIGlmIGxlbih0ZXh0X2RhdGEpID09IDA6XFxuICAgICAgICAgICAgdGV4dF9kYXRhID0gXFxcIkZhaWxlZCB0byByZXRyaWV2ZSB0aGF0IFVSTFxcXCJcXG4gICAgcmV0dXJuIFJlc3BvbnNlKHRleHRfZGF0YSwgZnVsbF91cmwpXCIsXCJzcmMvbGliL3JlcXVlc3RzX3dpdGhfY2FjaGluZy5weVwiOlwiaW1wb3J0IHJlcXVlc3RzXFxuaW1wb3J0IGpzb25cXG5cXG5QRVJNQU5FTlRfQ0FDSEVfRk5BTUUgPSBcXFwicGVybWFuZW50X2NhY2hlLnR4dFxcXCJcXG5URU1QX0NBQ0hFX0ZOQU1FID0gXFxcInRoaXNfcGFnZV9jYWNoZS50eHRcXFwiXFxuXFxuZGVmIF93cml0ZV90b19maWxlKGNhY2hlLCBmbmFtZSk6XFxuICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBvdXRmaWxlOlxcbiAgICAgICAgb3V0ZmlsZS53cml0ZShqc29uLmR1bXBzKGNhY2hlLCBpbmRlbnQ9MikpXFxuXFxuZGVmIF9yZWFkX2Zyb21fZmlsZShmbmFtZSk6XFxuICAgIHRyeTpcXG4gICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3InKSBhcyBpbmZpbGU6XFxuICAgICAgICAgICAgcmVzID0gaW5maWxlLnJlYWQoKVxcbiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlcylcXG4gICAgZXhjZXB0OlxcbiAgICAgICAgcmV0dXJuIHt9XFxuXFxuZGVmIGFkZF90b19jYWNoZShjYWNoZV9maWxlLCBjYWNoZV9rZXksIGNhY2hlX3ZhbHVlKTpcXG4gICAgdGVtcF9jYWNoZSA9IF9yZWFkX2Zyb21fZmlsZShjYWNoZV9maWxlKVxcbiAgICB0ZW1wX2NhY2hlW2NhY2hlX2tleV0gPSBjYWNoZV92YWx1ZVxcbiAgICBfd3JpdGVfdG9fZmlsZSh0ZW1wX2NhY2hlLCBjYWNoZV9maWxlKVxcblxcbmRlZiBjbGVhcl9jYWNoZShjYWNoZV9maWxlPVRFTVBfQ0FDSEVfRk5BTUUpOlxcbiAgICBfd3JpdGVfdG9fZmlsZSh7fSwgY2FjaGVfZmlsZSlcXG5cXG5kZWYgbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zX2QsIHByaXZhdGVfa2V5cz1bXFxcImFwaV9rZXlcXFwiLCBcXFwiYXBpa2V5XFxcIl0pOlxcbiAgICBcXFwiXFxcIlxcXCJNYWtlcyBhIGxvbmcgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcXVlcnkuXFxuICAgIEFscGhhYmV0aXplIHRoZSBrZXlzIGZyb20gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IHNvIHdlIGdldCB0aGUgc2FtZSBvcmRlciBlYWNoIHRpbWUuXFxuICAgIE9taXQga2V5cyB3aXRoIHByaXZhdGUgaW5mby5cXFwiXFxcIlxcXCJcXG4gICAgYWxwaGFiZXRpemVkX2tleXMgPSBzb3J0ZWQocGFyYW1zX2Qua2V5cygpKVxcbiAgICByZXMgPSBbXVxcbiAgICBmb3IgayBpbiBhbHBoYWJldGl6ZWRfa2V5czpcXG4gICAgICAgIGlmIGsgbm90IGluIHByaXZhdGVfa2V5czpcXG4gICAgICAgICAgICByZXMuYXBwZW5kKFxcXCJ7fS17fVxcXCIuZm9ybWF0KGssIHBhcmFtc19kW2tdKSlcXG4gICAgcmV0dXJuIGJhc2V1cmwgKyBcXFwiX1xcXCIuam9pbihyZXMpXFxuXFxuZGVmIGdldChiYXNldXJsLCBwYXJhbXM9e30sIHByaXZhdGVfa2V5c190b19pZ25vcmU9W1xcXCJhcGlfa2V5XFxcIiwgXFxcImFwaWtleVxcXCJdLCBwZXJtYW5lbnRfY2FjaGVfZmlsZT1QRVJNQU5FTlRfQ0FDSEVfRk5BTUUsIHRlbXBfY2FjaGVfZmlsZT1URU1QX0NBQ0hFX0ZOQU1FKTpcXG4gICAgZnVsbF91cmwgPSByZXF1ZXN0cy5yZXF1ZXN0VVJMKGJhc2V1cmwsIHBhcmFtcylcXG4gICAgY2FjaGVfa2V5ID0gbWFrZV9jYWNoZV9rZXkoYmFzZXVybCwgcGFyYW1zLCBwcml2YXRlX2tleXNfdG9faWdub3JlKVxcbiAgICAjIExvYWQgdGhlIHBlcm1hbmVudCBhbmQgcGFnZS1zcGVjaWZpYyBjYWNoZXMgZnJvbSBmaWxlc1xcbiAgICBwZXJtYW5lbnRfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUocGVybWFuZW50X2NhY2hlX2ZpbGUpXFxuICAgIHRlbXBfY2FjaGUgPSBfcmVhZF9mcm9tX2ZpbGUodGVtcF9jYWNoZV9maWxlKVxcbiAgICBpZiBjYWNoZV9rZXkgaW4gdGVtcF9jYWNoZTpcXG4gICAgICAgIHByaW50KFxcXCJmb3VuZCBpbiBwYWdlLXNwZWNpZmljIGNhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZSh0ZW1wX2NhY2hlW2NhY2hlX2tleV0sIGZ1bGxfdXJsKVxcbiAgICBlbGlmIGNhY2hlX2tleSBpbiBwZXJtYW5lbnRfY2FjaGU6XFxuICAgICAgICBwcmludChcXFwiZm91bmQgaW4gcGVybWFuZW50X2NhY2hlXFxcIilcXG4gICAgICAgICMgbWFrZSBhIFJlc3BvbnNlIG9iamVjdCBjb250YWluaW5nIHRleHQgZnJvbSB0aGUgY2hhbmdlLCBhbmQgdGhlIGZ1bGxfdXJsIHRoYXQgd291bGQgaGF2ZSBiZWVuIGZldGNoZWRcXG4gICAgICAgIHJldHVybiByZXF1ZXN0cy5SZXNwb25zZShwZXJtYW5lbnRfY2FjaGVbY2FjaGVfa2V5XSwgZnVsbF91cmwpXFxuICAgIGVsc2U6XFxuICAgICAgICBwcmludChcXFwibmV3OyBhZGRpbmcgdG8gY2FjaGVcXFwiKVxcbiAgICAgICAgIyBhY3R1YWxseSByZXF1ZXN0IGl0XFxuICAgICAgICByZXNwID0gcmVxdWVzdHMuZ2V0KGJhc2V1cmwsIHBhcmFtcylcXG4gICAgICAgICMgc2F2ZSBpdFxcbiAgICAgICAgYWRkX3RvX2NhY2hlKHRlbXBfY2FjaGVfZmlsZSwgY2FjaGVfa2V5LCByZXNwLnRleHQpXFxuICAgICAgICByZXR1cm4gcmVzcFwiLFwic3JjL2xpYi9yZXhlYy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwicmV4ZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9yZmM4MjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInJmYzgyMiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JsY29tcGxldGVyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJybGNvbXBsZXRlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3JvYm90cGFyc2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJyb2JvdHBhcnNlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3J1bnB5LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJydW5weSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NjaGVkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzY2hlZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NldHMucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNldHMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zZ21sbGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzZ21sbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2hhLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGEgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zaGVsdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNoZWx2ZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NobGV4LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaGxleCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NodXRpbC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic2h1dGlsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc2lnbmFsLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17U0lHX0RGTDpuZXcgU2suYnVpbHRpbi5pbnRfKDApLFNJR19JR046bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxDVFJMX0NfRVZFTlQ6bmV3IFNrLmJ1aWx0aW4uaW50XygwKSxDVFJMX0JSRUFLX0VWRU5UOm5ldyBTay5idWlsdGluLmludF8oMCksTlNJRzpuZXcgU2suYnVpbHRpbi5pbnRfKDIzKSxTSUdIVVA6bmV3IFNrLmJ1aWx0aW4uaW50XygxKSxTSUdOSU5UOm5ldyBTay5idWlsdGluLmludF8oMiksU0lHSUxMOm5ldyBTay5idWlsdGluLmludF8oNCksU0lHRlBFOm5ldyBTay5idWlsdGluLmludF8oOCksU0lHS0lMTDpuZXcgU2suYnVpbHRpbi5pbnRfKDkpLFNJR1NFR1Y6bmV3IFNrLmJ1aWx0aW4uaW50XygxMSksU0lHVEVSTTpuZXcgU2suYnVpbHRpbi5pbnRfKDE1KSxTSUdCUkVBSzpuZXcgU2suYnVpbHRpbi5pbnRfKDIxKSxTSUdBQlJUOm5ldyBTay5idWlsdGluLmludF8oMjIpLHBhdXNlOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJwYXVzZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3ZhciBhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGEuZGF0YT17dHlwZTpcXFwiU2sucHJvbWlzZVxcXCIscHJvbWlzZTpuZXcgUHJvbWlzZShmdW5jdGlvbihhKXtpZihudWxsIT1Tay5zaWduYWxzJiZTay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIpe2Z1bmN0aW9uIGhhbmRsZVNpZ25hbCgpe1NrLnNpZ25hbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVTaWduYWwpLGEoKX1Tay5zaWduYWxzLmFkZEV2ZW50TGlzdGVuZXIoaGFuZGxlU2lnbmFsKX1lbHNlIGNvbnNvbGUud2FybihcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLFNrLm1pc2NldmFsLnByaW50XyhcXFwic2lnbmFsLnBhdXNlKCkgbm90IHN1cHBvcnRlZFxcXCIpLGEoKX0pfSxhfSksc2lnbmFsOm5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaWduYWwuc2lnbmFsIGlzIG5vdCBzdXBwb3J0ZWQuXFxcIil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi9zaXRlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzaXRlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNtdHBkIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc210cGxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic210cGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3NuZGhkci5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic25kaGRyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc29ja2V0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzb2NrZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcWxpdGUzL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcWxpdGUzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29tcGlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3JlX2NvbXBpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zcmVfY29uc3RhbnRzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfY29uc3RhbnRzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3JlX3BhcnNlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzcmVfcGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zc2wucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInNzbCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0YXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN0YXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdGF0aXN0aWNzLnB5XCI6XCJcXFwiXFxcIlxcXCJcXG5CYXNpYyBzdGF0aXN0aWNzIG1vZHVsZS5cXG5cXG5UaGlzIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW5nIHN0YXRpc3RpY3Mgb2YgZGF0YSwgaW5jbHVkaW5nXFxuYXZlcmFnZXMsIHZhcmlhbmNlLCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLlxcblxcbkNhbGN1bGF0aW5nIGF2ZXJhZ2VzXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbkZ1bmN0aW9uICAgICAgICAgICAgRGVzY3JpcHRpb25cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcbm1lYW4gICAgICAgICAgICAgICAgQXJpdGhtZXRpYyBtZWFuIChhdmVyYWdlKSBvZiBkYXRhLlxcbmhhcm1vbmljX21lYW4gICAgICAgSGFybW9uaWMgbWVhbiBvZiBkYXRhLlxcbm1lZGlhbiAgICAgICAgICAgICAgTWVkaWFuIChtaWRkbGUgdmFsdWUpIG9mIGRhdGEuXFxubWVkaWFuX2xvdyAgICAgICAgICBMb3cgbWVkaWFuIG9mIGRhdGEuXFxubWVkaWFuX2hpZ2ggICAgICAgICBIaWdoIG1lZGlhbiBvZiBkYXRhLlxcbm1lZGlhbl9ncm91cGVkICAgICAgTWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGdyb3VwZWQgZGF0YS5cXG5tb2RlICAgICAgICAgICAgICAgIE1vZGUgKG1vc3QgY29tbW9uIHZhbHVlKSBvZiBkYXRhLlxcbj09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuXFxuQ2FsY3VsYXRlIHRoZSBhcml0aG1ldGljIG1lYW4gKFxcXCJ0aGUgYXZlcmFnZVxcXCIpIG9mIGRhdGE6XFxuXFxuPj4+IG1lYW4oWy0xLjAsIDIuNSwgMy4yNSwgNS43NV0pXFxuMi42MjVcXG5cXG5cXG5DYWxjdWxhdGUgdGhlIHN0YW5kYXJkIG1lZGlhbiBvZiBkaXNjcmV0ZSBkYXRhOlxcblxcbj4+PiBtZWRpYW4oWzIsIDMsIDQsIDVdKVxcbjMuNVxcblxcblxcbkNhbGN1bGF0ZSB0aGUgbWVkaWFuLCBvciA1MHRoIHBlcmNlbnRpbGUsIG9mIGRhdGEgZ3JvdXBlZCBpbnRvIGNsYXNzIGludGVydmFsc1xcbmNlbnRyZWQgb24gdGhlIGRhdGEgdmFsdWVzIHByb3ZpZGVkLiBFLmcuIGlmIHlvdXIgZGF0YSBwb2ludHMgYXJlIHJvdW5kZWQgdG9cXG50aGUgbmVhcmVzdCB3aG9sZSBudW1iZXI6XFxuXFxuPj4+IG1lZGlhbl9ncm91cGVkKFsyLCAyLCAzLCAzLCAzLCA0XSkgICNkb2N0ZXN0OiArRUxMSVBTSVNcXG4yLjgzMzMzMzMzMzMuLi5cXG5cXG5UaGlzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiB0aGlzIHdheTogeW91IGhhdmUgdHdvIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzc1xcbmludGVydmFsIDEuNS0yLjUsIHRocmVlIGRhdGEgcG9pbnRzIGluIHRoZSBjbGFzcyBpbnRlcnZhbCAyLjUtMy41LCBhbmQgb25lIGluXFxudGhlIGNsYXNzIGludGVydmFsIDMuNS00LjUuIFRoZSBtZWRpYW4gb2YgdGhlc2UgZGF0YSBwb2ludHMgaXMgMi44MzMzLi4uXFxuXFxuXFxuQ2FsY3VsYXRpbmcgdmFyaWFiaWxpdHkgb3Igc3ByZWFkXFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5GdW5jdGlvbiAgICAgICAgICAgIERlc2NyaXB0aW9uXFxuPT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cXG5wdmFyaWFuY2UgICAgICAgICAgIFBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgZGF0YS5cXG52YXJpYW5jZSAgICAgICAgICAgIFNhbXBsZSB2YXJpYW5jZSBvZiBkYXRhLlxcbnBzdGRldiAgICAgICAgICAgICAgUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG5zdGRldiAgICAgICAgICAgICAgIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgZGF0YS5cXG49PT09PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxcblxcbkNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNhbXBsZSBkYXRhOlxcblxcbj4+PiBzdGRldihbMi41LCAzLjI1LCA1LjUsIDExLjI1LCAxMS43NV0pICAjZG9jdGVzdDogK0VMTElQU0lTXFxuNC4zODk2MTg0MzQ0NC4uLlxcblxcbklmIHlvdSBoYXZlIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB0aGUgbWVhbiwgeW91IGNhbiBwYXNzIGl0IGFzIHRoZSBvcHRpb25hbFxcbnNlY29uZCBhcmd1bWVudCB0byB0aGUgZm91ciBcXFwic3ByZWFkXFxcIiBmdW5jdGlvbnMgdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBpdDpcXG5cXG4+Pj4gZGF0YSA9IFsxLCAyLCAyLCA0LCA0LCA0LCA1LCA2XVxcbj4+PiBtdSA9IG1lYW4oZGF0YSlcXG4+Pj4gcHZhcmlhbmNlKGRhdGEsIG11KVxcbjIuNVxcblxcblxcbkV4Y2VwdGlvbnNcXG4tLS0tLS0tLS0tXFxuXFxuQSBzaW5nbGUgZXhjZXB0aW9uIGlzIGRlZmluZWQ6IFN0YXRpc3RpY3NFcnJvciBpcyBhIHN1YmNsYXNzIG9mIFZhbHVlRXJyb3IuXFxuXFxuXFxcIlxcXCJcXFwiXFxuXFxuX19hbGxfXyA9IFsgJ1N0YXRpc3RpY3NFcnJvcicsXFxuICAgICAgICAgICAgJ3BzdGRldicsICdwdmFyaWFuY2UnLCAnc3RkZXYnLCAndmFyaWFuY2UnLFxcbiAgICAgICAgICAgICdtZWRpYW4nLCAgJ21lZGlhbl9sb3cnLCAnbWVkaWFuX2hpZ2gnLCAnbWVkaWFuX2dyb3VwZWQnLFxcbiAgICAgICAgICAgICdtZWFuJywgJ21vZGUnLCAnaGFybW9uaWNfbWVhbicsXFxuICAgICAgICAgIF1cXG5cXG5mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyXFxuZnJvbSBtYXRoIGltcG9ydCBzcXJ0XFxuXFxuZGVmIG1lYW4oZGF0YSk6XFxuICAgIHJldHVybiBzdW0oZGF0YSkgLyBsZW4oZGF0YSlcXG5cXG5kZWYgaGFybW9uaWNfbWVhbihkYXRhKTpcXG4gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvclxcblxcblxcbmRlZiBtZWRpYW4oZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gKF9kYXRhW2wvLzJdICsgX2RhdGFbbC8vMi0xXSkgLyAyXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5kZWYgbWVkaWFuX2xvdyhkYXRhKTpcXG4gICAgX2RhdGEgPSBzb3J0ZWQoZGF0YSlcXG4gICAgbCA9IGxlbihfZGF0YSlcXG4gICAgaWYgbCAlIDIgPT0gMDpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yLTFdXFxuICAgIGVsc2U6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgcmV0dXJuIF9tZWRpYW5cXG5cXG5cXG5kZWYgbWVkaWFuX2hpZ2goZGF0YSk6XFxuICAgIF9kYXRhID0gc29ydGVkKGRhdGEpXFxuICAgIGwgPSBsZW4oX2RhdGEpXFxuICAgIGlmIGwgJSAyID09IDA6XFxuICAgICAgICBfbWVkaWFuID0gX2RhdGFbbC8vMl1cXG4gICAgZWxzZTpcXG4gICAgICAgIF9tZWRpYW4gPSBfZGF0YVtsLy8yXVxcbiAgICByZXR1cm4gX21lZGlhblxcblxcblxcbmRlZiBtZWRpYW5fZ3JvdXBlZChkYXRhKTpcXG4gICAgcmV0dXJuIG1lZGlhbihkYXRhKVxcblxcbmRlZiBtb2RlKGRhdGEpOlxcbiAgICBjb3VudGVyID0gQ291bnRlcihkYXRhKVxcbiAgICBtYXhfY291bnQgPSBtYXgoY291bnRlci52YWx1ZXMoKSlcXG4gICAgX21vZGUgPSBbayBmb3Igayx2IGluIGNvdW50ZXIuaXRlbXMoKSBpZiB2ID09IG1heF9jb3VudF1cXG4gICAgaWYgbGVuKF9tb2RlKSA+IDE6XFxuICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJObyBVbmlxdWUgTW9kZSwgZm91bmQge30gZXF1YWxseSBjb21tb24gdmFsdWVzXFxcIi5mb3JtYXQobGVuKF9tb2RlKSkpXFxuICAgIGVsc2U6XFxuICAgICAgICByZXR1cm4gX21vZGVbMF1cXG5cXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS9sZW4oZGF0YSlcXG4gICAgcmV0dXJuIGZpbmFsX3ZhcmlhbmNlXFxuXFxuZGVmIHB2YXJpYW5jZShkYXRhKTpcXG4gICAgYXZlcmFnZT1tZWFuKGRhdGEpXFxuICAgIF92YXJpYW5jZT0wXFxuICAgIGZvciBkIGluIGRhdGE6XFxuICAgICAgICBfdmFyaWFuY2UgKz0gKChhdmVyYWdlLWQpKioyKVxcbiAgICAgICAgZmluYWxfdmFyaWFuY2U9X3ZhcmlhbmNlL2xlbihkYXRhKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgdmFyaWFuY2UoZGF0YSk6XFxuICAgIGF2ZXJhZ2U9bWVhbihkYXRhKVxcbiAgICBfdmFyaWFuY2U9MFxcbiAgICBmb3IgZCBpbiBkYXRhOlxcbiAgICAgICAgX3ZhcmlhbmNlICs9ICgoYXZlcmFnZS1kKSoqMilcXG4gICAgICAgIGZpbmFsX3ZhcmlhbmNlPV92YXJpYW5jZS8obGVuKGRhdGEpIC0xKVxcbiAgICByZXR1cm4gZmluYWxfdmFyaWFuY2VcXG5cXG5kZWYgcHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydChwdmFyaWFuY2UoZGF0YSkpXFxuXFxuZGVmIHN0ZGV2KGRhdGEpOlxcbiAgICByZXR1cm4gc3FydCh2YXJpYW5jZShkYXRhKSlcXG5cXG5cIixcInNyYy9saWIvc3RhdHZmcy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RhdHZmcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3N0cmluZy5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7dmFyIGE9e307cmV0dXJuIGEuYXNjaWlfbG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLmFzY2lpX3VwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5hc2NpaV9sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmFzY2lpX2xvd2VyY2FzZS52K2EuYXNjaWlfdXBwZXJjYXNlLnYpLGEubG93ZXJjYXNlPW5ldyBTay5idWlsdGluLnN0cihcXFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcXFwiKSxhLnVwcGVyY2FzZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXFxcIiksYS5sZXR0ZXJzPW5ldyBTay5idWlsdGluLnN0cihhLmxvd2VyY2FzZS52K2EudXBwZXJjYXNlLnYpLGEuZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OVxcXCIpLGEuaGV4ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRlxcXCIpLGEub2N0ZGlnaXRzPW5ldyBTay5idWlsdGluLnN0cihcXFwiMDEyMzQ1NjdcXFwiKSxhLnB1bmN0dWF0aW9uPW5ldyBTay5idWlsdGluLnN0cihcXFwiIVxcXFxcXFwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXFxdXl9ge3x9flxcXCIpLGEud2hpdGVzcGFjZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXFx0XFxcXG5cXFxceDBCXFxcXGZcXFxcciBcXFwiKSxhLnByaW50YWJsZT1uZXcgU2suYnVpbHRpbi5zdHIoYS5kaWdpdHMudithLmxldHRlcnMudithLnB1bmN0dWF0aW9uLnYrXFxcIiBcXFxcdFxcXFxuXFxcXHJcXFxceDBCXFxcXGZcXFwiKSxhLnNwbGl0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShTay5idWlsdGluLnN0ci5wcm90b3R5cGUuc3BsaXQsYSl9KSxhLmNhcGl0YWxpemU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5jYXBpdGFsaXplLFthXSl9KSxhLmpvaW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3JldHVybiB2b2lkIDA9PT1iJiYoYj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS5qb2luLFtiLGFdKX0pLGEuY2Fwd29yZHM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImNhcHdvcmRzXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMiksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzIG11c3QgYmUgYSBzdHJpbmdcXFwiKTtpZih2b2lkIDA9PT1jJiYoYz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiBcXFwiKSksIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFxcXCJzZXAgbXVzdCBiZSBhIHN0cmluZ1xcXCIpO2Zvcih2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5zcGxpdCxbYixjXSkudixlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXSxoPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmNhcGl0YWxpemUsW2ddKTtlLnB1c2goaCl9cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmpvaW4sW25ldyBTay5idWlsdGluLmxpc3QoZSksY10pfSksYX07XCIsXCJzcmMvbGliL3N0cmluZy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3RyaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RyaW5nb2xkLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdvbGQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdHJpbmdwcmVwLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJpbmdwcmVwIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3RydWN0LnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdHJ1Y3QgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zdWJwcm9jZXNzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzdWJwcm9jZXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3VuYXVkaW8ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInN1bmF1ZGlvIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvc3ltYm9sLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzeW1ib2wgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi9zeW10YWJsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwic3ltdGFibGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YWJuYW5ueS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGFibmFubnkgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90YXJmaWxlLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0YXJmaWxlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVsbmV0bGliLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0ZWxuZXRsaWIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZW1wZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGVtcGZpbGUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90ZXN0L19faW5pdF9fLnB5XCI6XCJfX2F1dGhvcl9fID0gJ2JtaWxsZXInXFxuXFxuZGVmIHRlc3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBwbGFjZXM9NSk6XFxuICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsaW50KTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxpZiBpc2luc3RhbmNlKGV4cGVjdGVkLGZsb2F0KTpcXG4gICAgICAgIGlmIGFicyhhY3R1YWwtZXhwZWN0ZWQpIDwgMTAqKigtcGxhY2VzKTpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgZWxzZTpcXG4gICAgICAgIGlmIGFjdHVhbCA9PSBleHBlY3RlZDpcXG4gICAgICAgICAgICBwcmludCgnUGFzcycpXFxuICAgICAgICAgICAgcmV0dXJuIFRydWVcXG4gICAgcHJpbnQoJ1Rlc3QgRmFpbGVkOiBleHBlY3RlZCAnICsgc3RyKGV4cGVjdGVkKSArICcgYnV0IGdvdCAnICsgc3RyKGFjdHVhbCkpXFxuICAgIHJldHVybiBGYWxzZVxcblxcbmRlZiB0ZXN0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCk6XFxuICAgIHBhc3NcXG5cXG5cIixcInNyYy9saWIvdGVzdC9iYWRfZ2V0YXR0ci5weVwiOlwieCA9IDFcXG5cXG5fX2dldGF0dHJfXyA9IFxcXCJTdXJwcmlzZSFcXFwiXFxuX19kaXJfXyA9IFxcXCJTdXJwcmlzZSBhZ2FpbiFcXFwiXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIyLnB5XCI6XCJkZWYgX19nZXRhdHRyX18oKTpcXG4gICAgXFxcIkJhZCBvbmVcXFwiXFxuXFxueCA9IDFcXG5cXG5kZWYgX19kaXJfXyhiYWRfc2lnKTpcXG4gICAgcmV0dXJuIFtdXFxuXCIsXCJzcmMvbGliL3Rlc3QvYmFkX2dldGF0dHIzLnB5XCI6XCJkZWYgX19nZXRhdHRyX18obmFtZSk6XFxuICAgIGdsb2JhbCBfX2dldGF0dHJfX1xcbiAgICBpZiBuYW1lICE9ICdkZWxnZXRhdHRyJzpcXG4gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yXFxuICAgIGRlbCBfX2dldGF0dHJfX1xcbiAgICByYWlzZSBBdHRyaWJ1dGVFcnJvclxcblwiLFwic3JjL2xpYi90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiZGVjaW1hbHRlc3RkYXRhIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdGVzdC9nb29kX2dldGF0dHIucHlcIjpcInggPSAxXFxuXFxuZGVmIF9fZGlyX18oKTpcXG4gICAgcmV0dXJuIFsnYScsICdiJywgJ2MnXVxcblxcbmRlZiBfX2dldGF0dHJfXyhuYW1lKTpcXG4gICAgaWYgbmFtZSA9PSBcXFwieW9sb1xcXCI6XFxuICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihcXFwiRGVwcmVjYXRlZCwgdXNlIHdoYXRldmVyIGluc3RlYWRcXFwiKVxcbiAgICByZXR1cm4gZlxcXCJUaGVyZSBpcyB7bmFtZX1cXFwiXFxuXFxueSA9IDJcXG5cIixcInNyYy9saWIvdGVzdC90ZXN0X3N1cHBvcnQucHlcIjpcIlxcXCJcXFwiXFxcIlN1cHBvcnRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy5cXFwiXFxcIlxcXCJcXG5cXG5pZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOlxcbiAgICByYWlzZSBJbXBvcnRFcnJvcigndGVzdF9zdXBwb3J0IG11c3QgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlJylcXG5cXG5pbXBvcnQgdW5pdHRlc3RcXG5cXG5cXG4jIGRlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOlxcbiMgICAgIFxcXCJcXFwiXFxcIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy5cXFwiXFxcIlxcXCJcXG4jICAgICB2YWxpZF90eXBlcyA9ICh1bml0dGVzdC5UZXN0U3VpdGUsIHVuaXR0ZXN0LlRlc3RDYXNlKVxcbiMgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKClcXG4jICAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuIyAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzLCBzdHIpOlxcbiMgICAgICAgICAgICAgaWYgY2xzIGluIHN5cy5tb2R1bGVzOlxcbiMgICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QuZmluZFRlc3RDYXNlcyhzeXMubW9kdWxlc1tjbHNdKSlcXG4jICAgICAgICAgICAgIGVsc2U6XFxuIyAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihcXFwic3RyIGFyZ3VtZW50cyBtdXN0IGJlIGtleXMgaW4gc3lzLm1vZHVsZXNcXFwiKVxcbiMgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2xzLCB2YWxpZF90eXBlcyk6XFxuIyAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGNscylcXG4jICAgICAgICAgZWxzZTpcXG4jICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpXFxuIyAgICAgX3J1bl9zdWl0ZShzdWl0ZSlcXG5cXG5kZWYgcnVuX3VuaXR0ZXN0KCpjbGFzc2VzKTpcXG4gICAgXFxcIlxcXCJcXFwiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLlxcXCJcXFwiXFxcIlxcbiAgICBmb3IgY2xzIGluIGNsYXNzZXM6XFxuICAgICAgICBwcmludCBjbHNcXG4gICAgICAgIGlmIGlzc3ViY2xhc3MoY2xzLCB1bml0dGVzdC5UZXN0Q2FzZSk6XFxuICAgICAgICAgICAgY2xzKCkubWFpbigpXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHByaW50IFxcXCJEb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBcXFwiLCBjbHNcXG5cIixcInNyYy9saWIvdGV4dHdyYXAucHlcIjpcIlxcXCJcXFwiXFxcIlRleHQgd3JhcHBpbmcgYW5kIGZpbGxpbmcuXFxuXFxcIlxcXCJcXFwiXFxuXFxuIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBHcmVnb3J5IFAuIFdhcmQuXFxuIyBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uXFxuIyBXcml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD5cXG5cXG5pbXBvcnQgcmUsIHN0cmluZ1xcblxcbl9fYWxsX18gPSBbJ1RleHRXcmFwcGVyJywgJ3dyYXAnLCAnZmlsbCcsICdkZWRlbnQnLCAnaW5kZW50JywgJ3Nob3J0ZW4nXVxcblxcbiMgSGFyZGNvZGUgdGhlIHJlY29nbml6ZWQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBVUy1BU0NJSVxcbiMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIG1haW4gcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXRcXG4jIHNvbWUgVW5pY29kZSBzcGFjZXMgKGxpa2UgXFxcXHUwMGEwKSBhcmUgbm9uLWJyZWFraW5nIHdoaXRlc3BhY2VzLlxcbl93aGl0ZXNwYWNlID0gJ1xcXFx0XFxcXG5cXFxceDBiXFxcXHgwY1xcXFxyICdcXG5cXG5jbGFzcyBUZXh0V3JhcHBlcjpcXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIE9iamVjdCBmb3Igd3JhcHBpbmcvZmlsbGluZyB0ZXh0LiAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgY29uc2lzdHMgb2ZcXG4gICAgdGhlIHdyYXAoKSBhbmQgZmlsbCgpIG1ldGhvZHM7IHRoZSBvdGhlciBtZXRob2RzIGFyZSBqdXN0IHRoZXJlIGZvclxcbiAgICBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cXG4gICAgSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSByZXBsYWNlIHRoZSBtYWluIHdyYXBwaW5nIGFsZ29yaXRobSxcXG4gICAgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gb3ZlcnJpZGUgX3dyYXBfY2h1bmtzKCkuXFxuICAgIFNldmVyYWwgaW5zdGFuY2UgYXR0cmlidXRlcyBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB3cmFwcGluZzpcXG4gICAgICB3aWR0aCAoZGVmYXVsdDogNzApXFxuICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCBvZiB3cmFwcGVkIGxpbmVzICh1bmxlc3MgYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgaXMgZmFsc2UpXFxuICAgICAgaW5pdGlhbF9pbmRlbnQgKGRlZmF1bHQ6IFxcXCJcXFwiKVxcbiAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2Ygd3JhcHBlZFxcbiAgICAgICAgb3V0cHV0LiAgQ291bnRzIHRvd2FyZHMgdGhlIGxpbmUncyB3aWR0aC5cXG4gICAgICBzdWJzZXF1ZW50X2luZGVudCAoZGVmYXVsdDogXFxcIlxcXCIpXFxuICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgbGluZXMgc2F2ZSB0aGUgZmlyc3RcXG4gICAgICAgIG9mIHdyYXBwZWQgb3V0cHV0OyBhbHNvIGNvdW50cyB0b3dhcmRzIGVhY2ggbGluZSdzIHdpZHRoLlxcbiAgICAgIGV4cGFuZF90YWJzIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy5cXG4gICAgICAgIEVhY2ggdGFiIHdpbGwgYmVjb21lIDAgLi4gJ3RhYnNpemUnIHNwYWNlcywgZGVwZW5kaW5nIG9uIGl0cyBwb3NpdGlvblxcbiAgICAgICAgaW4gaXRzIGxpbmUuICBJZiBmYWxzZSwgZWFjaCB0YWIgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIuXFxuICAgICAgdGFic2l6ZSAoZGVmYXVsdDogOClcXG4gICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gMCAuLiAndGFic2l6ZScgc3BhY2VzLCB1bmxlc3NcXG4gICAgICAgICdleHBhbmRfdGFicycgaXMgZmFsc2UuXFxuICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0IGJ5IHNwYWNlc1xcbiAgICAgICAgYWZ0ZXIgdGFiIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBpZiBleHBhbmRfdGFicyBpcyBmYWxzZSBhbmRcXG4gICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSBpcyB0cnVlLCBldmVyeSB0YWIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYVxcbiAgICAgICAgc2luZ2xlIHNwYWNlIVxcbiAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzIChkZWZhdWx0OiBmYWxzZSlcXG4gICAgICAgIEVuc3VyZSB0aGF0IHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbiBpcyBhbHdheXMgZm9sbG93ZWRcXG4gICAgICAgIGJ5IHR3byBzcGFjZXMuICBPZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBhbGdvcml0aG0gaXNcXG4gICAgICAgICh1bmF2b2lkYWJseSkgaW1wZXJmZWN0LlxcbiAgICAgIGJyZWFrX2xvbmdfd29yZHMgKGRlZmF1bHQ6IHRydWUpXFxuICAgICAgICBCcmVhayB3b3JkcyBsb25nZXIgdGhhbiAnd2lkdGgnLiAgSWYgZmFsc2UsIHRob3NlIHdvcmRzIHdpbGwgbm90XFxuICAgICAgICBiZSBicm9rZW4sIGFuZCBzb21lIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuICd3aWR0aCcuXFxuICAgICAgYnJlYWtfb25faHlwaGVucyAoZGVmYXVsdDogdHJ1ZSlcXG4gICAgICAgIEFsbG93IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMuIElmIHRydWUsIHdyYXBwaW5nIHdpbGwgb2NjdXJcXG4gICAgICAgIHByZWZlcmFibHkgb24gd2hpdGVzcGFjZXMgYW5kIHJpZ2h0IGFmdGVyIGh5cGhlbnMgcGFydCBvZlxcbiAgICAgICAgY29tcG91bmQgd29yZHMuXFxuICAgICAgZHJvcF93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKVxcbiAgICAgICAgRHJvcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbGluZXMuXFxuICAgICAgbWF4X2xpbmVzIChkZWZhdWx0OiBOb25lKVxcbiAgICAgICAgVHJ1bmNhdGUgd3JhcHBlZCBsaW5lcy5cXG4gICAgICBwbGFjZWhvbGRlciAoZGVmYXVsdDogJyBbLi4uXScpXFxuICAgICAgICBBcHBlbmQgdG8gdGhlIGxhc3QgbGluZSBvZiB0cnVuY2F0ZWQgdGV4dC5cXG4gICAgXFxcIlxcXCJcXFwiXFxuXFxuICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFucyA9IHt9XFxuICAgICMgdXNwYWNlID0gb3JkKCcgJylcXG4gICAgdXNwYWNlID0gJyAnXFxuICAgIGZvciB4IGluIF93aGl0ZXNwYWNlOlxcbiAgICAgICAgIyB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbb3JkKHgpXSA9IHVzcGFjZVxcbiAgICAgICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zW3hdID0gdXNwYWNlXFxuXFxuICAgICMgVGhpcyBmdW5reSBsaXR0bGUgcmVnZXggaXMganVzdCB0aGUgdHJpY2sgZm9yIHNwbGl0dGluZ1xcbiAgICAjIHRleHQgdXAgaW50byB3b3JkLXdyYXBwYWJsZSBjaHVua3MuICBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLS9iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIVxcbiAgICAjIChhZnRlciBzdHJpcHBpbmcgb3V0IGVtcHR5IHN0cmluZ3MpLlxcbiAgICB3b3Jkc2VwX3JlID0gcmUuY29tcGlsZShcXG4gICAgICAgIHInKFxcXFxzK3wnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IHdoaXRlc3BhY2VcXG4gICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSkpJykgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICBlbV9kYXNoID0gcmUuY29tcGlsZShyJyhcXFxccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlXFxuICAgICAgICAgICAgICAgICAgICAgICAgIHInW15cXFxcc1xcXFx3XSpcXFxcdytbXjAtOVxcXFxXXS0oPz1cXFxcdytbXjAtOVxcXFxXXSl8JyAgICMgaHlwaGVuYXRlZCB3b3Jkc1xcbiAgICAgICAgICAgICAgICAgICAgICAgICByJyg/IV4pLXsyLH0oPz1cXFxcdykpJykgICAgICAgICAgICAgICAgICAgICAjIGVtLWRhc2hcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgXFxuICAgICMgVGhpcyBsZXNzIGZ1bmt5IGxpdHRsZSByZWdleCBqdXN0IHNwbGl0IG9uIHJlY29nbml6ZWQgc3BhY2VzLiBFLmcuXFxuICAgICMgICBcXFwiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hXFxcIlxcbiAgICAjIHNwbGl0cyBpbnRvXFxuICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLWJhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hL1xcbiAgICB3b3Jkc2VwX3NpbXBsZV9yZSA9IHJlLmNvbXBpbGUocicoXFxcXHMrKScpXFxuXFxuXFxuICAgICMgWFhYIHRoaXMgaXMgbm90IGxvY2FsZS0gb3IgY2hhcnNldC1hd2FyZSAtLSBzdHJpbmcubG93ZXJjYXNlXFxuICAgICMgaXMgVVMtQVNDSUkgb25seSAoYW5kIHRoZXJlZm9yZSBFbmdsaXNoLW9ubHkpXFxuICAgIHNlbnRlbmNlX2VuZF9yZSA9IHJlLmNvbXBpbGUocidbYS16XScgICAgICAgICAgICAgIyBsb3dlcmNhc2UgbGV0dGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXC5cXFxcIVxcXFw/XScgICAgICAgICAgIyBzZW50ZW5jZS1lbmRpbmcgcHVuY3QuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXFxcXFxcXCJcXFxcJ10/JyAgICAgICAgICAgIyBvcHRpb25hbCBlbmQtb2YtcXVvdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xcXFxaJykgICAgICAgICAgICAgICAjIGVuZCBvZiBjaHVua1xcbiAgICBzZW50ZW5jZV9lbmRfcmUgPSByJ1thLXpdW1xcXFwuXFxcXCFcXFxcP11bXFxcXFxcXCJcXFxcJ10/J1xcblxcbiAgICBkZWYgX19pbml0X18oc2VsZixcXG4gICAgICAgICAgICAgICAgIHdpZHRoPTcwLFxcbiAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1cXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPVRydWUsXFxuICAgICAgICAgICAgICAgICByZXBsYWNlX3doaXRlc3BhY2U9VHJ1ZSxcXG4gICAgICAgICAgICAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzPUZhbHNlLFxcbiAgICAgICAgICAgICAgICAgYnJlYWtfbG9uZ193b3Jkcz1UcnVlLFxcbiAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsXFxuICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPVRydWUsXFxuICAgICAgICAgICAgICAgICB0YWJzaXplPTgsXFxuICAgICAgICAgICAgICAgICBtYXhfbGluZXM9Tm9uZSxcXG4gICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPScgWy4uLl0nKTpcXG4gICAgICAgIHNlbGYud2lkdGggPSB3aWR0aFxcbiAgICAgICAgc2VsZi5pbml0aWFsX2luZGVudCA9IGluaXRpYWxfaW5kZW50XFxuICAgICAgICBzZWxmLnN1YnNlcXVlbnRfaW5kZW50ID0gc3Vic2VxdWVudF9pbmRlbnRcXG4gICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFic1xcbiAgICAgICAgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2UgPSByZXBsYWNlX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3MgPSBmaXhfc2VudGVuY2VfZW5kaW5nc1xcbiAgICAgICAgc2VsZi5icmVha19sb25nX3dvcmRzID0gYnJlYWtfbG9uZ193b3Jkc1xcbiAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgPSBkcm9wX3doaXRlc3BhY2VcXG4gICAgICAgIHNlbGYuYnJlYWtfb25faHlwaGVucyA9IGJyZWFrX29uX2h5cGhlbnNcXG4gICAgICAgIHNlbGYudGFic2l6ZSA9IHRhYnNpemVcXG4gICAgICAgIHNlbGYubWF4X2xpbmVzID0gbWF4X2xpbmVzXFxuICAgICAgICBzZWxmLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJcXG5cXG5cXG4gICAgIyAtLSBQcml2YXRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gICAgIyAocG9zc2libHkgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlKVxcblxcbiAgICBkZWYgX211bmdlX3doaXRlc3BhY2Uoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmdcXG4gICAgICAgIE11bmdlIHdoaXRlc3BhY2UgaW4gdGV4dDogZXhwYW5kIHRhYnMgYW5kIGNvbnZlcnQgYWxsIG90aGVyXFxuICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gc3BhY2VzLiAgRWcuIFxcXCIgZm9vXFxcXFxcXFx0YmFyXFxcXFxcXFxuXFxcXFxcXFxuYmF6XFxcIlxcbiAgICAgICAgYmVjb21lcyBcXFwiIGZvbyAgICBiYXIgIGJhelxcXCIuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGlmIHNlbGYuZXhwYW5kX3RhYnM6XFxuICAgICAgICAgICAgdGV4dCA9IHRleHQuZXhwYW5kdGFicyhzZWxmLnRhYnNpemUpXFxuICAgICAgICBpZiBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZTpcXG4gICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc2VsZi51bmljb2RlX3doaXRlc3BhY2VfdHJhbnMuaXRlbXMoKTpcXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShrZXksIHZhbClcXG4gICAgICAgIHJldHVybiB0ZXh0XFxuXFxuXFxuICAgIGRlZiBfc3BsaXQoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfc3BsaXQodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ11cXG4gICAgICAgIFNwbGl0IHRoZSB0ZXh0IHRvIHdyYXAgaW50byBpbmRpdmlzaWJsZSBjaHVua3MuICBDaHVua3MgYXJlXFxuICAgICAgICBub3QgcXVpdGUgdGhlIHNhbWUgYXMgd29yZHM7IHNlZSBfd3JhcF9jaHVua3MoKSBmb3IgZnVsbFxcbiAgICAgICAgZGV0YWlscy4gIEFzIGFuIGV4YW1wbGUsIHRoZSB0ZXh0XFxuICAgICAgICAgIExvb2ssIGdvb2YtYmFsbCAtLSB1c2UgdGhlIC1iIG9wdGlvbiFcXG4gICAgICAgIGJyZWFrcyBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLScsICdiYWxsJywgJyAnLCAnLS0nLCAnICcsXFxuICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgJ29wdGlvbiEnXFxuICAgICAgICBpZiBicmVha19vbl9oeXBoZW5zIGlzIFRydWUsIG9yIGluOlxcbiAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLWJhbGwnLCAnICcsICctLScsICcgJyxcXG4gICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCBvcHRpb24hJ1xcbiAgICAgICAgb3RoZXJ3aXNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBzZWxmLmJyZWFrX29uX2h5cGhlbnMgaXMgVHJ1ZTpcXG4gICAgICAgICAgICBjaHVua3MgPSBzZWxmLndvcmRzZXBfcmUuc3BsaXQodGV4dClcXG4gICAgICAgICAgICBpZiBcXFwiLS1cXFwiIGluIHRleHQ6XFxuICAgICAgICAgICAgICAgIGNodW5rcyA9IFtpdGVtIFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3VibGlzdCBpbiBbc2VsZi5lbV9kYXNoLnNwbGl0KGNodW5rKSBmb3IgY2h1bmsgaW4gY2h1bmtzXSBcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHN1Ymxpc3RdXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGNodW5rcyA9IHNlbGYud29yZHNlcF9zaW1wbGVfcmUuc3BsaXQodGV4dClcXG4gICAgICAgIGNodW5rcyA9IFtjIGZvciBjIGluIGNodW5rcyBpZiBjXVxcbiAgICAgICAgcmV0dXJuIGNodW5rc1xcblxcbiAgICBkZWYgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzIDogW3N0cmluZ10pXFxuICAgICAgICBDb3JyZWN0IGZvciBzZW50ZW5jZSBlbmRpbmdzIGJ1cmllZCBpbiAnY2h1bmtzJy4gIEVnLiB3aGVuIHRoZVxcbiAgICAgICAgb3JpZ2luYWwgdGV4dCBjb250YWlucyBcXFwiLi4uIGZvby5cXFxcXFxcXG5CYXIgLi4uXFxcIiwgbXVuZ2Vfd2hpdGVzcGFjZSgpXFxuICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhhdCB0byBbLi4uLCBcXFwiZm9vLlxcXCIsIFxcXCIgXFxcIiwgXFxcIkJhclxcXCIsIC4uLl1cXG4gICAgICAgIHdoaWNoIGhhcyBvbmUgdG9vIGZldyBzcGFjZXM7IHRoaXMgbWV0aG9kIHNpbXBseSBjaGFuZ2VzIHRoZSBvbmVcXG4gICAgICAgIHNwYWNlIHRvIHR3by5cXG4gICAgICAgIFxcXCJcXFwiXFxcIlxcbiAgICAgICAgaSA9IDBcXG4gICAgICAgICMgcGF0c2VhcmNoID0gc2VsZi5zZW50ZW5jZV9lbmRfcmUuc2VhcmNoXFxuICAgICAgICB3aGlsZSBpIDwgbGVuKGNodW5rcyktMTpcXG4gICAgICAgICAgICBpZiBjaHVua3NbaSsxXSA9PSBcXFwiIFxcXCIgYW5kIHJlLnNlYXJjaChzZWxmLnNlbnRlbmNlX2VuZF9yZSwgY2h1bmtzW2ldKSBhbmQgY2h1bmtzW2ldWy0xXSBpbiBcXFwiLiE/XFxcXFxcXCJcXFxcJ1xcXCI6XFxuICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdID0gXFxcIiAgXFxcIlxcbiAgICAgICAgICAgICAgICBpICs9IDJcXG4gICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICBpICs9IDFcXG5cXG4gICAgZGVmIF9oYW5kbGVfbG9uZ193b3JkKHNlbGYsIHJldmVyc2VkX2NodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcyA6IFtzdHJpbmddLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUgOiBbc3RyaW5nXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gOiBpbnQsIHdpZHRoIDogaW50KVxcbiAgICAgICAgSGFuZGxlIGEgY2h1bmsgb2YgdGV4dCAobW9zdCBsaWtlbHkgYSB3b3JkLCBub3Qgd2hpdGVzcGFjZSkgdGhhdFxcbiAgICAgICAgaXMgdG9vIGxvbmcgdG8gZml0IGluIGFueSBsaW5lLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICAjIEZpZ3VyZSBvdXQgd2hlbiBpbmRlbnQgaXMgbGFyZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCB3aWR0aCwgYW5kIG1ha2VcXG4gICAgICAgICMgc3VyZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGlzIHN0cmlwcGVkIG9mZiBvbiBldmVyeSBwYXNzXFxuICAgICAgICBpZiB3aWR0aCA8IDE6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IDFcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgc3BhY2VfbGVmdCA9IHdpZHRoIC0gY3VyX2xlblxcblxcbiAgICAgICAgIyBJZiB3ZSdyZSBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIHRoZW4gZG8gc286IHB1dCBhcyBtdWNoXFxuICAgICAgICAjIG9mIHRoZSBuZXh0IGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZSBhcyB3aWxsIGZpdC5cXG4gICAgICAgIGlmIHNlbGYuYnJlYWtfbG9uZ193b3JkczpcXG4gICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzWy0xXVs6c3BhY2VfbGVmdF0pXFxuICAgICAgICAgICAgcmV2ZXJzZWRfY2h1bmtzWy0xXSA9IHJldmVyc2VkX2NodW5rc1stMV1bc3BhY2VfbGVmdDpdXFxuXFxuICAgICAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbG9uZyB3b3JkIGludGFjdC4gIE9ubHkgYWRkXFxuICAgICAgICAjIGl0IHRvIHRoZSBjdXJyZW50IGxpbmUgaWYgdGhlcmUncyBub3RoaW5nIGFscmVhZHkgdGhlcmUgLS1cXG4gICAgICAgICMgdGhhdCBtaW5pbWl6ZXMgaG93IG11Y2ggd2UgdmlvbGF0ZSB0aGUgd2lkdGggY29uc3RyYWludC5cXG4gICAgICAgIGVsaWYgbm90IGN1cl9saW5lOlxcbiAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3MucG9wKCkpXFxuXFxuICAgICAgICAjIElmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIGFuZCB0aGVyZSdzIGFscmVhZHlcXG4gICAgICAgICMgdGV4dCBvbiB0aGUgY3VycmVudCBsaW5lLCBkbyBub3RoaW5nLiAgTmV4dCB0aW1lIHRocm91Z2ggdGhlXFxuICAgICAgICAjIG1haW4gbG9vcCBvZiBfd3JhcF9jaHVua3MoKSwgd2UnbGwgd2luZCB1cCBoZXJlIGFnYWluLCBidXRcXG4gICAgICAgICMgY3VyX2xlbiB3aWxsIGJlIHplcm8sIHNvIHRoZSBuZXh0IGxpbmUgd2lsbCBiZSBlbnRpcmVseVxcbiAgICAgICAgIyBkZXZvdGVkIHRvIHRoZSBsb25nIHdvcmQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgcmlnaHQgbm93LlxcblxcbiAgICBkZWYgX3dyYXBfY2h1bmtzKHNlbGYsIGNodW5rcyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJfd3JhcF9jaHVua3MoY2h1bmtzIDogW3N0cmluZ10pIC0+IFtzdHJpbmddXFxuICAgICAgICBXcmFwIGEgc2VxdWVuY2Ugb2YgdGV4dCBjaHVua3MgYW5kIHJldHVybiBhIGxpc3Qgb2YgbGluZXMgb2ZcXG4gICAgICAgIGxlbmd0aCAnc2VsZi53aWR0aCcgb3IgbGVzcy4gIChJZiAnYnJlYWtfbG9uZ193b3JkcycgaXMgZmFsc2UsXFxuICAgICAgICBzb21lIGxpbmVzIG1heSBiZSBsb25nZXIgdGhhbiB0aGlzLikgIENodW5rcyBjb3JyZXNwb25kIHJvdWdobHlcXG4gICAgICAgIHRvIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW06IGVhY2ggY2h1bmsgaXNcXG4gICAgICAgIGluZGl2aXNpYmxlIChtb2R1bG8gJ2JyZWFrX2xvbmdfd29yZHMnKSwgYnV0IGEgbGluZSBicmVhayBjYW5cXG4gICAgICAgIGNvbWUgYmV0d2VlbiBhbnkgdHdvIGNodW5rcy4gIENodW5rcyBzaG91bGQgbm90IGhhdmUgaW50ZXJuYWxcXG4gICAgICAgIHdoaXRlc3BhY2U7IGllLiBhIGNodW5rIGlzIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhIFxcXCJ3b3JkXFxcIi5cXG4gICAgICAgIFdoaXRlc3BhY2UgY2h1bmtzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZlxcbiAgICAgICAgbGluZXMsIGJ1dCBhcGFydCBmcm9tIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQuXFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIGxpbmVzID0gW11cXG4gICAgICAgIGlmIHNlbGYud2lkdGggPD0gMDpcXG4gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKFxcXCJpbnZhbGlkIHdpZHRoICVyIChtdXN0IGJlID4gMClcXFwiICUgc2VsZi53aWR0aClcXG4gICAgICAgIGlmIHNlbGYubWF4X2xpbmVzIGlzIG5vdCBOb25lOlxcbiAgICAgICAgICAgIGlmIHNlbGYubWF4X2xpbmVzID4gMTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudFxcbiAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnRcXG4gICAgICAgICAgICBpZiBsZW4oaW5kZW50KSArIGxlbihzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKSA+IHNlbGYud2lkdGg6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoXFxcInBsYWNlaG9sZGVyIHRvbyBsYXJnZSBmb3IgbWF4IHdpZHRoXFxcIilcXG5cXG4gICAgICAgICMgQXJyYW5nZSBpbiByZXZlcnNlIG9yZGVyIHNvIGl0ZW1zIGNhbiBiZSBlZmZpY2llbnRseSBwb3BwZWRcXG4gICAgICAgICMgZnJvbSBhIHN0YWNrIG9mIGNodWNrcy5cXG4gICAgICAgIGNodW5rcy5yZXZlcnNlKClcXG5cXG4gICAgICAgIHdoaWxlIGNodW5rczpcXG5cXG4gICAgICAgICAgICAjIFN0YXJ0IHRoZSBsaXN0IG9mIGNodW5rcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgY3VycmVudCBsaW5lLlxcbiAgICAgICAgICAgICMgY3VyX2xlbiBpcyBqdXN0IHRoZSBsZW5ndGggb2YgYWxsIHRoZSBjaHVua3MgaW4gY3VyX2xpbmUuXFxuICAgICAgICAgICAgY3VyX2xpbmUgPSBbXVxcbiAgICAgICAgICAgIGN1cl9sZW4gPSAwXFxuXFxuICAgICAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN0YXRpYyBzdHJpbmcgd2lsbCBwcmVmaXggdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50XFxuICAgICAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5pbml0aWFsX2luZGVudFxcblxcbiAgICAgICAgICAgICMgTWF4aW11bSB3aWR0aCBmb3IgdGhpcyBsaW5lLlxcbiAgICAgICAgICAgIHdpZHRoID0gc2VsZi53aWR0aCAtIGxlbihpbmRlbnQpXFxuXFxuICAgICAgICAgICAgIyBGaXJzdCBjaHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdCwgdW5sZXNzIHRoaXNcXG4gICAgICAgICAgICAjIGlzIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgdGV4dCAoaWUuIG5vIGxpbmVzIHN0YXJ0ZWQgeWV0KS5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY2h1bmtzWy0xXS5zdHJpcCgpID09ICcnIGFuZCBsaW5lczpcXG4gICAgICAgICAgICAgICAgZGVsIGNodW5rc1stMV1cXG5cXG4gICAgICAgICAgICB3aGlsZSBjaHVua3M6XFxuICAgICAgICAgICAgICAgIGwgPSBsZW4oY2h1bmtzWy0xXSlcXG5cXG4gICAgICAgICAgICAgICAgIyBDYW4gYXQgbGVhc3Qgc3F1ZWV6ZSB0aGlzIGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZS5cXG4gICAgICAgICAgICAgICAgaWYgY3VyX2xlbiArIGwgPD0gd2lkdGg6XFxuICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoY2h1bmtzLnBvcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArPSBsXFxuXFxuICAgICAgICAgICAgICAgICMgTm9wZSwgdGhpcyBsaW5lIGlzIGZ1bGwuXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcblxcbiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBpcyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0b1xcbiAgICAgICAgICAgICMgZml0IG9uICphbnkqIGxpbmUgKG5vdCBqdXN0IHRoaXMgb25lKS5cXG4gICAgICAgICAgICBpZiBjaHVua3MgYW5kIGxlbihjaHVua3NbLTFdKSA+IHdpZHRoOlxcbiAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKVxcbiAgICAgICAgICAgICAgICBjdXJfbGVuID0gc3VtKG1hcChsZW4sIGN1cl9saW5lKSlcXG5cXG4gICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNodW5rIG9uIHRoaXMgbGluZSBpcyBhbGwgd2hpdGVzcGFjZSwgZHJvcCBpdC5cXG4gICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXS5zdHJpcCgpID09ICcnOlxcbiAgICAgICAgICAgICAgICBjdXJfbGVuIC09IGxlbihjdXJfbGluZVstMV0pXFxuICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV1cXG5cXG4gICAgICAgICAgICBpZiBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubWF4X2xpbmVzIGlzIE5vbmUgb3JcXG4gICAgICAgICAgICAgICAgICAgIGxlbihsaW5lcykgKyAxIDwgc2VsZi5tYXhfbGluZXMgb3JcXG4gICAgICAgICAgICAgICAgICAgIChub3QgY2h1bmtzIG9yXFxuICAgICAgICAgICAgICAgICAgICAgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgbGVuKGNodW5rcykgPT0gMSBhbmRcXG4gICAgICAgICAgICAgICAgICAgICBub3QgY2h1bmtzWzBdLnN0cmlwKCkpIGFuZCBjdXJfbGVuIDw9IHdpZHRoKTpcXG4gICAgICAgICAgICAgICAgICAgICMgQ29udmVydCBjdXJyZW50IGxpbmUgYmFjayB0byBhIHN0cmluZyBhbmQgc3RvcmUgaXQgaW5cXG4gICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBhbGwgbGluZXMgKHJldHVybiB2YWx1ZSkuXFxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoaW5kZW50ICsgJycuam9pbihjdXJfbGluZSkpXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICB3aGlsZSBjdXJfbGluZTpcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX2xpbmVbLTFdLnN0cmlwKCkgYW5kXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKyBsZW4oc2VsZi5wbGFjZWhvbGRlcikgPD0gd2lkdGgpOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoc2VsZi5wbGFjZWhvbGRlcilcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gLT0gbGVuKGN1cl9saW5lWy0xXSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWwgY3VyX2xpbmVbLTFdXFxuICAgICAgICAgICAgICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2xpbmUgPSBsaW5lc1stMV0ucnN0cmlwKClcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihwcmV2X2xpbmUpICsgbGVuKHNlbGYucGxhY2Vob2xkZXIpIDw9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWR0aCk6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1stMV0gPSBwcmV2X2xpbmUgKyBzZWxmLnBsYWNlaG9sZGVyXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyBzZWxmLnBsYWNlaG9sZGVyLmxzdHJpcCgpKVxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG5cXG4gICAgICAgIHJldHVybiBsaW5lc1xcblxcbiAgICBkZWYgX3NwbGl0X2NodW5rcyhzZWxmLCB0ZXh0KTpcXG4gICAgICAgIHRleHQgPSBzZWxmLl9tdW5nZV93aGl0ZXNwYWNlKHRleHQpXFxuICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXQodGV4dClcXG5cXG4gICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG4gICAgZGVmIHdyYXAoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJ3cmFwKHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddXFxuICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZlxcbiAgICAgICAgbm8gbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkXFxuICAgICAgICBsaW5lcy4gIFRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksXFxuICAgICAgICBhbmQgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZVxcbiAgICAgICAgY29udmVydGVkIHRvIHNwYWNlLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICBjaHVua3MgPSBzZWxmLl9zcGxpdF9jaHVua3ModGV4dClcXG4gICAgICAgIGlmIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3M6XFxuICAgICAgICAgICAgc2VsZi5fZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzKVxcbiAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcylcXG5cXG4gICAgZGVmIGZpbGwoc2VsZiwgdGV4dCk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJmaWxsKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZ1xcbiAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBub1xcbiAgICAgICAgbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZ1xcbiAgICAgICAgY29udGFpbmluZyB0aGUgZW50aXJlIHdyYXBwZWQgcGFyYWdyYXBoLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICByZXR1cm4gXFxcIlxcXFxuXFxcIi5qb2luKHNlbGYud3JhcCh0ZXh0KSlcXG5cXG5cXG4jIC0tIENvbnZlbmllbmNlIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG5cXG5kZWYgd3JhcCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJXcmFwIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuXFxuICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mIG5vXFxuICAgIG1vcmUgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuICBCeVxcbiAgICBkZWZhdWx0LCB0YWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLCBhbmRcXG4gICAgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZSBjb252ZXJ0ZWQgdG9cXG4gICAgc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplXFxuICAgIHdyYXBwaW5nIGJlaGF2aW91ci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpXFxuICAgIHJldHVybiB3LndyYXAodGV4dClcXG5cXG5kZWYgZmlsbCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOlxcbiAgICBcXFwiXFxcIlxcXCJGaWxsIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBuZXcgc3RyaW5nLlxcbiAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vIG1vcmVcXG4gICAgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZVxcbiAgICB3cmFwcGVkIHBhcmFncmFwaC4gIEFzIHdpdGggd3JhcCgpLCB0YWJzIGFyZSBleHBhbmRlZCBhbmQgb3RoZXJcXG4gICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3JcXG4gICAgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemUgd3JhcHBpbmcgYmVoYXZpb3VyLlxcbiAgICBcXFwiXFxcIlxcXCJcXG4gICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCh0ZXh0KVxcblxcbmRlZiBzaG9ydGVuKHRleHQsIHdpZHRoLCAqKmt3YXJncyk6XFxuICAgIFxcXCJcXFwiXFxcIkNvbGxhcHNlIGFuZCB0cnVuY2F0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBmaXQgaW4gdGhlIGdpdmVuIHdpZHRoLlxcbiAgICBUaGUgdGV4dCBmaXJzdCBoYXMgaXRzIHdoaXRlc3BhY2UgY29sbGFwc2VkLiAgSWYgaXQgdGhlbiBmaXRzIGluXFxuICAgIHRoZSAqd2lkdGgqLCBpdCBpcyByZXR1cm5lZCBhcyBpcy4gIE90aGVyd2lzZSwgYXMgbWFueSB3b3Jkc1xcbiAgICBhcyBwb3NzaWJsZSBhcmUgam9pbmVkIGFuZCB0aGVuIHRoZSBwbGFjZWhvbGRlciBpcyBhcHBlbmRlZDo6XFxuICAgICAgICA+Pj4gdGV4dHdyYXAuc2hvcnRlbihcXFwiSGVsbG8gIHdvcmxkIVxcXCIsIHdpZHRoPTEyKVxcbiAgICAgICAgJ0hlbGxvIHdvcmxkISdcXG4gICAgICAgID4+PiB0ZXh0d3JhcC5zaG9ydGVuKFxcXCJIZWxsbyAgd29ybGQhXFxcIiwgd2lkdGg9MTEpXFxuICAgICAgICAnSGVsbG8gWy4uLl0nXFxuICAgIFxcXCJcXFwiXFxcIlxcbiAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsIG1heF9saW5lcz0xLCAqKmt3YXJncylcXG4gICAgcmV0dXJuIHcuZmlsbCgnICcuam9pbih0ZXh0LnN0cmlwKCkuc3BsaXQoKSkpXFxuXFxuXFxuIyAtLSBMb29zZWx5IHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuIyBfd2hpdGVzcGFjZV9vbmx5X3JlID0gcmUuY29tcGlsZSgnXlsgXFxcXHRdKyQnLCByZS5NVUxUSUxJTkUpXFxuIyBfbGVhZGluZ193aGl0ZXNwYWNlX3JlID0gcmUuY29tcGlsZSgnKF5bIFxcXFx0XSopKD86W14gXFxcXHRcXFxcbl0pJywgcmUuTVVMVElMSU5FKVxcblxcbmRlZiBkZWRlbnQodGV4dCk6XFxuICAgIFxcXCJcXFwiXFxcIlJlbW92ZSBhbnkgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGV2ZXJ5IGxpbmUgaW4gYHRleHRgLlxcbiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdHJpcGxlLXF1b3RlZCBzdHJpbmdzIGxpbmUgdXAgd2l0aCB0aGUgbGVmdFxcbiAgICBlZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlXFxuICAgIGluIGluZGVudGVkIGZvcm0uXFxuICAgIE5vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleVxcbiAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgXFxcIiAgaGVsbG9cXFwiIGFuZCBcXFwiXFxcXFxcXFx0aGVsbG9cXFwiIGFyZVxcbiAgICBjb25zaWRlcmVkIHRvIGhhdmUgbm8gY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS5cXG4gICAgRW50aXJlbHkgYmxhbmsgbGluZXMgYXJlIG5vcm1hbGl6ZWQgdG8gYSBuZXdsaW5lIGNoYXJhY3Rlci5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0b1xcbiAgICAjIGFsbCBsaW5lcy5cXG4gICAgbWFyZ2luID0gTm9uZVxcblxcbiAgICBpbmRlbnRzID0gcmUuZmluZGFsbChyJyheWyBcXFxcdF0qKSg/OlteIFxcXFx0XFxcXG5dKScsdGV4dCwgcmUuTVVMVElMSU5FKVxcbiAgICBmb3IgaW5kZW50IGluIGluZGVudHM6XFxuICAgICAgICBpZiBtYXJnaW4gaXMgTm9uZTpcXG4gICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnRcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIG1vcmUgZGVlcGx5IGluZGVudGVkIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLlxcbiAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOlxcbiAgICAgICAgICAgIHBhc3NcXG5cXG4gICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOlxcbiAgICAgICAgIyBpdCdzIHRoZSBuZXcgd2lubmVyLlxcbiAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOlxcbiAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudFxcblxcbiAgICAgICAgIyBGaW5kIHRoZSBsYXJnZXN0IGNvbW1vbiB3aGl0ZXNwYWNlIGJldHdlZW4gY3VycmVudCBsaW5lIGFuZCBwcmV2aW91c1xcbiAgICAgICAgIyB3aW5uZXIuXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZvciBpLCAoeCwgeSkgaW4gZW51bWVyYXRlKHppcChtYXJnaW4sIGluZGVudCkpOlxcbiAgICAgICAgICAgICAgICBpZiB4ICE9IHk6XFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW5bOmldXFxuICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAjIHNhbml0eSBjaGVjayAodGVzdGluZy9kZWJ1Z2dpbmcgb25seSlcXG4gICAgaWYgMCBhbmQgbWFyZ2luOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdChcXFwiXFxcXG5cXFwiKTpcXG4gICAgICAgICAgICBhc3NlcnQgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKG1hcmdpbiksIFxcXFxcXG4gICAgICAgICAgICAgICAgICAgXFxcImxpbmUgPSAlciwgbWFyZ2luID0gJXJcXFwiICUgKGxpbmUsIG1hcmdpbilcXG5cXG4gICAgaWYgbWFyZ2luOlxcbiAgICAgICAgbGluZXMgPSBbbGluZVtsZW4obWFyZ2luKTpdIFxcbiAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpXFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBsaW5lLnN0cmlwKCkgXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoXFxcIlxcXFxuXFxcIildXFxuICAgICAgICB0ZXh0ID0gXFxcIlxcXFxuXFxcIi5qb2luKGxpbmVzKVxcbiAgICByZXR1cm4gdGV4dFxcblxcblxcbmRlZiBpbmRlbnQodGV4dCwgcHJlZml4LCBwcmVkaWNhdGU9Tm9uZSk6XFxuICAgIFxcXCJcXFwiXFxcIkFkZHMgJ3ByZWZpeCcgdG8gdGhlIGJlZ2lubmluZyBvZiBzZWxlY3RlZCBsaW5lcyBpbiAndGV4dCcuXFxuICAgIElmICdwcmVkaWNhdGUnIGlzIHByb3ZpZGVkLCAncHJlZml4JyB3aWxsIG9ubHkgYmUgYWRkZWQgdG8gdGhlIGxpbmVzXFxuICAgIHdoZXJlICdwcmVkaWNhdGUobGluZSknIGlzIFRydWUuIElmICdwcmVkaWNhdGUnIGlzIG5vdCBwcm92aWRlZCxcXG4gICAgaXQgd2lsbCBkZWZhdWx0IHRvIGFkZGluZyAncHJlZml4JyB0byBhbGwgbm9uLWVtcHR5IGxpbmVzIHRoYXQgZG8gbm90XFxuICAgIGNvbnNpc3Qgc29sZWx5IG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycy5cXG4gICAgXFxcIlxcXCJcXFwiXFxuICAgIGlmIHByZWRpY2F0ZSBpcyBOb25lOlxcbiAgICAgICAgZGVmIHByZWRpY2F0ZShsaW5lKTpcXG4gICAgICAgICAgICByZXR1cm4gbGluZS5zdHJpcCgpXFxuXFxuICAgIGRlZiBwcmVmaXhlZF9saW5lcygpOlxcbiAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKFRydWUpOlxcbiAgICAgICAgICAgIHlpZWxkIChwcmVmaXggKyBsaW5lIGlmIHByZWRpY2F0ZShsaW5lKSBlbHNlIGxpbmUpXFxuICAgIHJldHVybiAnJy5qb2luKHByZWZpeGVkX2xpbmVzKCkpXFxuXFxuXFxuaWYgX19uYW1lX18gPT0gXFxcIl9fbWFpbl9fXFxcIjpcXG4gICAgI3ByaW50IGRlZGVudChcXFwiXFxcXHRmb29cXFxcblxcXFx0YmFyXFxcIilcXG4gICAgI3ByaW50IGRlZGVudChcXFwiICBcXFxcdGhlbGxvIHRoZXJlXFxcXG4gIFxcXFx0ICBob3cgYXJlIHlvdT9cXFwiKVxcbiAgICBwcmludChkZWRlbnQoXFxcIkhlbGxvIHRoZXJlLlxcXFxuICBUaGlzIGlzIGluZGVudGVkLlxcXCIpKVwiLFwic3JjL2xpYi90aGlzLnB5XCI6XCJcXG5wcmludChcXFwiXFxcIlxcXCJcXG5UaGUgWmVuIG9mIFB5dGhvbiwgYnkgVGltIFBldGVyc1xcblxcbkJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LlxcbkV4cGxpY2l0IGlzIGJldHRlciB0aGFuIGltcGxpY2l0LlxcblNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxcbkNvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXFxuRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuXFxuU3BhcnNlIGlzIGJldHRlciB0aGFuIGRlbnNlLlxcblJlYWRhYmlsaXR5IGNvdW50cy5cXG5TcGVjaWFsIGNhc2VzIGFyZW4ndCBzcGVjaWFsIGVub3VnaCB0byBicmVhayB0aGUgcnVsZXMuXFxuQWx0aG91Z2ggcHJhY3RpY2FsaXR5IGJlYXRzIHB1cml0eS5cXG5FcnJvcnMgc2hvdWxkIG5ldmVyIHBhc3Mgc2lsZW50bHkuXFxuVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuXFxuSW4gdGhlIGZhY2Ugb2YgYW1iaWd1aXR5LCByZWZ1c2UgdGhlIHRlbXB0YXRpb24gdG8gZ3Vlc3MuXFxuVGhlcmUgc2hvdWxkIGJlIG9uZS0tIGFuZCBwcmVmZXJhYmx5IG9ubHkgb25lIC0tb2J2aW91cyB3YXkgdG8gZG8gaXQuXFxuQWx0aG91Z2ggdGhhdCB3YXkgbWF5IG5vdCBiZSBvYnZpb3VzIGF0IGZpcnN0IHVubGVzcyB5b3UncmUgRHV0Y2guXFxuTm93IGlzIGJldHRlciB0aGFuIG5ldmVyLlxcbkFsdGhvdWdoIG5ldmVyIGlzIG9mdGVuIGJldHRlciB0aGFuICpyaWdodCogbm93LlxcbklmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBoYXJkIHRvIGV4cGxhaW4sIGl0J3MgYSBiYWQgaWRlYS5cXG5JZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgZWFzeSB0byBleHBsYWluLCBpdCBtYXkgYmUgYSBnb29kIGlkZWEuXFxuTmFtZXNwYWNlcyBhcmUgb25lIGhvbmtpbmcgZ3JlYXQgaWRlYSAtLSBsZXQncyBkbyBtb3JlIG9mIHRob3NlIVxcblxcXCJcXFwiXFxcIlxcbilcXG5cIixcInNyYy9saWIvdGhyZWFkaW5nLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ0aHJlYWRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90aW1lLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjaGVja19zdHJ1Y3RfdGltZShhKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIlJlcXVpcmVkIGFyZ3VtZW50ICdzdHJ1Y3RfdGltZScgbXVzdCBiZSBvZiB0eXBlOiAnc3RydWN0X3RpbWUnXFxcIik7dmFyIGMsZD1hLnYubGVuZ3RoLGU9YS52O2ZvcihjPTA7YzxkOysrYylpZighU2suYnVpbHRpbi5jaGVja0ludChlW2NdKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcInN0cnVjdF90aW1lIG1heSBvbmx5IGNvbnRhaW4gaW50ZWdlcnNcXFwiKTtyZXR1cm4hMH1mdW5jdGlvbiBwYWRMZWZ0KGEsYixkKXt2YXIgYz1hLnRvU3RyaW5nKCk7cmV0dXJuIEFycmF5KGItYy5sZW5ndGgrMSkuam9pbihkfHxcXFwiIFxcXCIpK2N9ZnVuY3Rpb24gaXNMZWFwWWVhcihhKXtyZXR1cm4gMD09KDMmYSkmJigwIT1hJTEwMHx8MD09YSU0MDApfWZ1bmN0aW9uIGdldERheU9mWWVhcihhLGIpe2I9Ynx8ITE7dmFyIGM9Yj9hLmdldFVUQ01vbnRoKCk6YS5nZXRNb250aCgpLGQ9Yj9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSxlPVswLDMxLDU5LDkwLDEyMCwxNTEsMTgxLDIxMiwyNDMsMjczLDMwNCwzMzRdW2NdK2Q7cmV0dXJuIDE8YyYmaXNMZWFwWWVhcihiP2EuZ2V0VVRDRnVsbFllYXIoKTphLmdldEZ1bGxZZWFyKCkpJiZlKyssZX1mdW5jdGlvbiBzdGRUaW1lem9uZU9mZnNldCgpe3ZhciBhPU1hdGgubWF4LGI9bmV3IERhdGUoMjAwMiwwLDEpLGM9bmV3IERhdGUoMjAwMiw2LDEpO3JldHVybiBhKGIuZ2V0VGltZXpvbmVPZmZzZXQoKSxjLmdldFRpbWV6b25lT2Zmc2V0KCkpfWZ1bmN0aW9uIGRzdChhKXtyZXR1cm4gYS5nZXRUaW1lem9uZU9mZnNldCgpPHN0ZFRpbWV6b25lT2Zmc2V0KCl9ZnVuY3Rpb24gdGltZVpvbmVOYW1lKGEpe3ZhciBiLGM9L1xcXFwoKC4qKVxcXFwpLy5leGVjKGEudG9TdHJpbmcoKSk7aWYobnVsbCE9dGhpcy5uYXZpZ2F0b3ImJihiPXRoaXMubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8dGhpcy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLGMmJjE8Yy5sZW5ndGgpcmV0dXJuIGNbMV07aWYodm9pZCAwPT09YilyZXR1cm4gbnVsbDt0cnl7dmFyIGQ9YS50b0xvY2FsZVN0cmluZyhiLHt0aW1lWm9uZU5hbWU6XFxcInNob3J0XFxcIn0pO3JldHVybiBjPWQuc3BsaXQoXFxcIiBcXFwiKSxjW2MubGVuZ3RoLTFdfWNhdGNoKGEpe3JldHVybiBudWxsfX1mdW5jdGlvbiBkYXRlX3RvX3N0cnVjdF90aW1lKGEsYyl7cmV0dXJuIGM9Y3x8ITEsbmV3IGIoW1NrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0Z1bGxZZWFyKCk6YS5nZXRGdWxsWWVhcigpKSxTay5idWlsdGluLmFzc2skKChjP2EuZ2V0VVRDTW9udGgoKTphLmdldE1vbnRoKCkpKzEpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ0RhdGUoKTphLmdldERhdGUoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDSG91cnMoKTphLmdldEhvdXJzKCkpLFNrLmJ1aWx0aW4uYXNzayQoYz9hLmdldFVUQ01pbnV0ZXMoKTphLmdldE1pbnV0ZXMoKSksU2suYnVpbHRpbi5hc3NrJChjP2EuZ2V0VVRDU2Vjb25kcygpOmEuZ2V0U2Vjb25kcygpKSxTay5idWlsdGluLmFzc2skKCgoYz9hLmdldFVUQ0RheSgpOmEuZ2V0RGF5KCkpKzYpJTcpLFNrLmJ1aWx0aW4uYXNzayQoZ2V0RGF5T2ZZZWFyKGEsYykpLFNrLmJ1aWx0aW4uYXNzayQoYz8wOmRzdChhKT8xOjApXSl9ZnVuY3Rpb24gZnJvbV9zZWNvbmRzKGEsYil7dmFyIGM9bmV3IERhdGU7aWYoYSl7U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwic2Vjc1xcXCIsXFxcIm51bWJlclxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSk7dmFyIGQ9U2suYnVpbHRpbi5hc251bSQoYSk7Yy5zZXRUaW1lKDFlMypkKX1yZXR1cm4gZGF0ZV90b19zdHJ1Y3RfdGltZShjLGIpfWZ1bmN0aW9uIGFzY3RpbWVfZihhKXtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJhc2N0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksIWF8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpP2E9ZnJvbV9zZWNvbmRzKCk6IShhIGluc3RhbmNlb2YgYikmJihhPW5ldyBiKGEpKSxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSYmOT09YS52Lmxlbmd0aCl7dmFyIGU9W2RbU2suYnVpbHRpbi5hc251bSQoYS52WzZdKV0sY1tTay5idWlsdGluLmFzbnVtJChhLnZbMV0pLTFdLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzJdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKSxwYWRMZWZ0KFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSkudG9TdHJpbmcoKSwyLFxcXCIwXFxcIikrXFxcIjpcXFwiK3BhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzRdKS50b1N0cmluZygpLDIsXFxcIjBcXFwiKStcXFwiOlxcXCIrcGFkTGVmdChTay5idWlsdGluLmFzbnVtJChhLnZbNV0pLnRvU3RyaW5nKCksMixcXFwiMFxcXCIpLHBhZExlZnQoU2suYnVpbHRpbi5hc251bSQoYS52WzBdKS50b1N0cmluZygpLDQsXFxcIjBcXFwiKV07cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihlLmpvaW4oXFxcIiBcXFwiKSl9fWZ1bmN0aW9uIG1rdGltZV9mKGEpe2lmKFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm1rdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiY5PT1hLnYubGVuZ3RoKXt2YXIgYj1uZXcgRGF0ZShTay5idWlsdGluLmFzbnVtJChhLnZbMF0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlsxXSktMSxTay5idWlsdGluLmFzbnVtJChhLnZbMl0pLFNrLmJ1aWx0aW4uYXNudW0kKGEudlszXSksU2suYnVpbHRpbi5hc251bSQoYS52WzRdKSxTay5idWlsdGluLmFzbnVtJChhLnZbNV0pKTtyZXR1cm4gU2suYnVpbHRpbi5hc3NrJChiLmdldFRpbWUoKS8xZTMsdm9pZCAwKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXFxcIm1rdGltZSgpIHJlcXVpcmVzIGEgc3RydWN0X3RpbWUgb3IgOS10dXBsZVxcXCIpfXZhciBhPXtfX3BhY2thZ2VfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIlxcXCIpfSxiPVNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEoXFxcInRpbWVcXFwiLFxcXCJzdHJ1Y3RfdGltZVxcXCIse3RtX3llYXI6XFxcInllYXIsIGZvciBleGFtcGxlLCAxOTkzXFxcIix0bV9tb246XFxcIm1vbnRoIG9mIHllYXIsIHJhbmdlIFsxLCAxMl1cXFwiLHRtX21kYXk6XFxcImRheSBvZiBtb250aCwgcmFuZ2UgWzEsIDMxXVxcXCIsdG1faG91cjpcXFwiaG91cnMsIHJhbmdlIFswLCAyM11cXFwiLHRtX21pbjpcXFwibWludXRlcywgcmFuZ2UgWzAsIDU5XVxcXCIsdG1fc2VjOlxcXCJzZWNvbmRzLCByYW5nZSBbMCwgNjFdXFxcIix0bV93ZGF5OlxcXCJkYXkgb2Ygd2VlaywgcmFuZ2UgWzAsIDZdLCBNb25kYXkgaXMgMFxcXCIsdG1feWRheTpcXFwiZGF5IG9mIHllYXIsIHJhbmdlIFsxLCAzNjZdXFxcIix0bV9pc2RzdDpcXFwiMSBpZiBzdW1tZXIgdGltZSBpcyBpbiBlZmZlY3QsIDAgaWYgbm90LCBhbmQgLTEgaWYgdW5rbm93blxcXCJ9KTthLnN0cnVjdF90aW1lPWIsYS50aW1lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJ0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMCk7dmFyIGE9RGF0ZS5ub3coKTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZSYmdGhpcy5wZXJmb3JtYW5jZS5ub3cmJihhKz1wZXJmb3JtYW5jZS5ub3coKSUxKSxTay5idWlsdGluLmFzc2skKGEvMWUzLHZvaWQgMCl9KSxhLnNsZWVwPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInNsZWVwXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZGVsYXlcXFwiLFxcXCJmbG9hdFxcXCIsU2suYnVpbHRpbi5jaGVja051bWJlcihhKSksbmV3IFNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb24obmV3IFByb21pc2UoZnVuY3Rpb24oYil7U2suc2V0VGltZW91dChmdW5jdGlvbigpe2IoU2suYnVpbHRpbi5ub25lLm5vbmUkKX0sMWUzKlNrLmZmaS5yZW1hcFRvSnMoYSkpfSkpfSksYS5sb2NhbHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwibG9jYWx0aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITEpfSksYS5nbXRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiZ210aW1lXFxcIixhcmd1bWVudHMubGVuZ3RoLDAsMSksZnJvbV9zZWNvbmRzKGEsITApfSk7dmFyIGM9W1xcXCJKYW5cXFwiLFxcXCJGZWJcXFwiLFxcXCJNYXJcXFwiLFxcXCJBcHJcXFwiLFxcXCJNYXlcXFwiLFxcXCJKdW5cXFwiLFxcXCJKdWxcXFwiLFxcXCJBdWdcXFwiLFxcXCJTZXBcXFwiLFxcXCJPY3RcXFwiLFxcXCJOb3ZcXFwiLFxcXCJEZWNcXFwiXSxkPVtcXFwiTW9uXFxcIixcXFwiVHVlXFxcIixcXFwiV2VkXFxcIixcXFwiVGh1XFxcIixcXFwiRnJpXFxcIixcXFwiU2F0XFxcIixcXFwiU3VuXFxcIl07cmV0dXJuIGEuYXNjdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGFzY3RpbWVfZiksYS5jdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJjdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLGFzY3RpbWVfZihmcm9tX3NlY29uZHMoYSkpfSksYS5ta3RpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhta3RpbWVfZiksYS50aW1lem9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKnN0ZFRpbWV6b25lT2Zmc2V0KCkpLGEuYWx0em9uZT1uZXcgU2suYnVpbHRpbi5pbnRfKDYwKmZ1bmN0aW9uIGFsdFRpbWV6b25lT2Zmc2V0KCl7dmFyIGE9TWF0aC5taW4sYj1uZXcgRGF0ZSgyMDAyLDAsMSksYz1uZXcgRGF0ZSgyMDAyLDYsMSk7cmV0dXJuIGEoYi5nZXRUaW1lem9uZU9mZnNldCgpLGMuZ2V0VGltZXpvbmVPZmZzZXQoKSl9KCkpLGEuZGF5bGlnaHQ9bmV3IFNrLmJ1aWx0aW4uaW50Xyhkc3QobmV3IERhdGUpPzE6MCksYS50em5hbWU9bmV3IFNrLmJ1aWx0aW4udHVwbGUoZnVuY3Rpb24gdGltZVpvbmVOYW1lcygpe3ZhciBhPW5ldyBEYXRlKDIwMDIsMCwxKSxiPW5ldyBEYXRlKDIwMDIsNiwxKTtyZXR1cm4gZHN0KGEpP1tuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGIpKSxuZXcgU2suYnVpbHRpbi5zdHIodGltZVpvbmVOYW1lKGEpKV06W25ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYSkpLG5ldyBTay5idWlsdGluLnN0cih0aW1lWm9uZU5hbWUoYikpXX0oKSksYS5hY2NlcHQyZHllYXI9U2suYnVpbHRpbi5hc3NrJCgxKSxhLmNsb2NrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBhPXRoaXMucGVyZm9ybWFuY2UmJnRoaXMucGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpLzFlMzpuZXcgRGF0ZSgpLmdldFRpbWUoKS8xZTMsbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfSksYS5zdHJmdGltZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uIHN0cmZ0aW1lX2YoYSxjKXt2YXIgZDtpZihTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJzdHJmdGltZVxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDIpLCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcXFwiZm9ybWF0IG11c3QgYmUgYSBzdHJpbmdcXFwiKTtyZXR1cm4gYz8hKGMgaW5zdGFuY2VvZiBiKSYmKGM9bmV3IGIoYykpOmM9ZnJvbV9zZWNvbmRzKCksY2hlY2tfc3RydWN0X3RpbWUoYyksZD1Tay5mZmkucmVtYXBUb0pzKGEpLFNrLmZmaS5yZW1hcFRvUHkoc3RyZnRpbWUoZCxuZXcgRGF0ZSgxZTMqbWt0aW1lX2YoYykudikpKX0pLGEudHpzZXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiB0enNldF9mKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidGltZS50enNldCgpIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcXFwiKX0pLGEuc3RycHRpbWU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBzdHJwdGltZV9mKGEsYil7U2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwic3RycHRpbWVcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwyKSxTay5idWlsdGluLnB5Q2hlY2tUeXBlKFxcXCJzdHJpbmdcXFwiLFxcXCJzdHJpbmdcXFwiLFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpLHZvaWQgMD09PWI/Yj1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIiVhICViICVkICVIOiVNOiVTICVZXFxcIik6U2suYnVpbHRpbi5weUNoZWNrVHlwZShcXFwiZm9ybWF0XFxcIixcXFwic3RyaW5nXFxcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKTtsZXQgYz1kYXRlX3RvX3N0cnVjdF90aW1lKHN0cnB0aW1lKFNrLmZmaS5yZW1hcFRvSnMoYSksU2suZmZpLnJlbWFwVG9KcyhiKSwhMCkpO3JldHVybiBjLnZbOF09bmV3IFNrLmJ1aWx0aW4uaW50XygtMSksY30pLGF9O1wiLFwic3JjL2xpYi90aW1laXQucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRpbWVpdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3RvYWlmZi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidG9haWZmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdG9rZW4uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX2ZpbGVfXzpcXFwiL3NyYy9saWIvdG9rZW4ucHlcXFwifTtjb25zdCBiPVtdO2Zvcih0b2tlbiBpbiBTay50b2tlbi50b2tfbmFtZSl7Y29uc3QgYz1Tay50b2tlbi50b2tfbmFtZVt0b2tlbl0uc2xpY2UoMiksZD1wYXJzZUludCh0b2tlbiwxMCk7Yi5wdXNoKFNrLmZmaS5yZW1hcFRvUHkoZCkpLGIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxhW2NdPVNrLmZmaS5yZW1hcFRvUHkoZCl9cmV0dXJuIGEudG9rX25hbWU9bmV3IFNrLmJ1aWx0aW4uZGljdChiKSxhLklTVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNURVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTTk9OVEVSTUlOQUw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwiSVNOT05URVJNSU5BTFxcXCIsYXJndW1lbnRzLmxlbmd0aCwxLDEpLFNrLnRva2VuLklTTk9OVEVSTUlOQUwoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhLklTRU9GPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIklTRU9GXFxcIixhcmd1bWVudHMubGVuZ3RoLDEsMSksU2sudG9rZW4uSVNFT0YoU2suZmZpLnJlbWFwVG9KcyhhKSl9KSxhfTtcIixcInNyYy9saWIvdG9rZW5pemUuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt0b2tlbml6ZTpuZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcInRva2VuaXplXFxcIiwxLDEpLFNrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbihhKTtjb25zdCBiPVtdO3JldHVybiBTay5fdG9rZW5pemUoXFxcIjxzdGRpbj5cXFwiLGZ1bmN0aW9uIGpzUmVhZGxpbmUoKXtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhKTtyZXR1cm4gU2suZmZpLnJlbWFwVG9KcyhiKX0sXFxcIlVURi04XFxcIixmdW5jdGlvbiByZWNlaXZlVG9rZW4oYSl7Yi5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEudHlwZSksU2suZmZpLnJlbWFwVG9QeShhLnN0cmluZyksbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1NrLmZmaS5yZW1hcFRvUHkoYS5zdGFydFswXSksU2suZmZpLnJlbWFwVG9QeShhLnN0YXJ0WzFdKV0pLG5ldyBTay5idWlsdGluLnR1cGxlKFtTay5mZmkucmVtYXBUb1B5KGEuZW5kWzBdKSxTay5mZmkucmVtYXBUb1B5KGEuZW5kWzFdKV0pLFNrLmZmaS5yZW1hcFRvUHkoYS5saW5lKV0pKX0pLG5ldyBTay5idWlsdGluLmxpc3QoYil9KX07cmV0dXJuIGF9O1wiLFwic3JjL2xpYi90cmFjZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHJhY2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi90cmFjZWJhY2sucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInRyYWNlYmFjayBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3R0eS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidHR5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdHVydGxlLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXtcXFwidXNlIHN0cmljdFxcXCI7dmFyIGU9ZnVuY3Rpb24gZ2V0Q29uZmlndXJlZFRhcmdldCgpe3ZhciBlLHQ7Zm9yKGU9U2suVHVydGxlR3JhcGhpY3MmJlNrLlR1cnRsZUdyYXBoaWNzLnRhcmdldHx8XFxcInR1cnRsZVxcXCIsdD1cXFwic3RyaW5nXFxcIj09dHlwZW9mIGU/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk6ZTt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTtyZXR1cm4gdH0oKTtyZXR1cm4gZS50dXJ0bGVJbnN0YW5jZT9lLnR1cnRsZUluc3RhbmNlLnJlc2V0KCk6ZS50dXJ0bGVJbnN0YW5jZT1mdW5jdGlvbiBnZW5lcmF0ZVR1cnRsZU1vZHVsZShlKXt2YXIgdD1NYXRoLnJvdW5kLHI9TWF0aC5tYXgsbj1NYXRoLnNxcnQsYT1NYXRoLm1pbixzPU1hdGguYWJzLG89TWF0aC5QSSxkPU1hdGguYXRhbjIsXz1NYXRoLnNpbixjPU1hdGguY29zO2Z1bmN0aW9uIGdldEFzc2V0KGUpe3ZhciB0PWcuYXNzZXRzLHI9XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQ/dChlKTp0W2VdO3JldHVyblxcXCJzdHJpbmdcXFwiPT10eXBlb2Ygcj9uZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3ZhciBhPW5ldyBJbWFnZTthLm9ubG9hZD1mdW5jdGlvbigpe2cuYXNzZXRzW2VdPXRoaXMsdChhKX0sYS5vbmVycm9yPWZ1bmN0aW9uKCl7bihuZXcgRXJyb3IoXFxcIk1pc3NpbmcgYXNzZXQ6IFxcXCIrcikpfSxhLnNyYz1yfSk6bmV3IEluc3RhbnRQcm9taXNlKHZvaWQgMCxyKX1mdW5jdGlvbiBJbnN0YW50UHJvbWlzZShlLHQpe3RoaXMubGFzdFJlc3VsdD10LHRoaXMubGFzdEVycm9yPWV9ZnVuY3Rpb24gRnJhbWVNYW5hZ2VyKCl7dGhpcy5yZXNldCgpfWZ1bmN0aW9uIGdldEZyYW1lTWFuYWdlcigpe3JldHVybiBBfHwoQT1uZXcgRnJhbWVNYW5hZ2VyKSxBfWZ1bmN0aW9uIE1vdXNlSGFuZGxlcigpe3ZhciB0PXRoaXM7Zm9yKHZhciByIGluIHRoaXMuX3RhcmdldD1nZXRUYXJnZXQoKSx0aGlzLl9tYW5hZ2Vycz17fSx0aGlzLl9oYW5kbGVycz17bW91c2Vkb3duOmZ1bmN0aW9uKHIpe3Qub25FdmVudChcXFwibW91c2Vkb3duXFxcIixyKX0sbW91c2V1cDpmdW5jdGlvbihyKXt0Lm9uRXZlbnQoXFxcIm1vdXNldXBcXFwiLHIpfSxtb3VzZW1vdmU6ZnVuY3Rpb24ocil7dC5vbkV2ZW50KFxcXCJtb3VzZW1vdmVcXFwiLHIpfX0sdGhpcy5faGFuZGxlcnMpdGhpcy5fdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocix0aGlzLl9oYW5kbGVyc1tyXSl9ZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKGUsdCl7dGhpcy5fdHlwZT1lLHRoaXMuX3RhcmdldD10LHRoaXMuX2hhbmRsZXJzPXZvaWQgMCxnZXRNb3VzZUhhbmRsZXIoKS5hZGRNYW5hZ2VyKGUsdGhpcyl9ZnVuY3Rpb24gVHVydGxlKGUpe2lmKGdldEZyYW1lTWFuYWdlcigpLmFkZFR1cnRsZSh0aGlzKSx0aGlzLl9zY3JlZW49Z2V0U2NyZWVuKCksdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fc2hhcGU9ZS52LCF2Lmhhc093blByb3BlcnR5KHRoaXMuX3NoYXBlKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFxcXCJTaGFwZTonXFxcIit0aGlzLl9zaGFwZStcXFwiJyBub3QgaW4gZGVmYXVsdCBzaGFwZSwgcGxlYXNlIGNoZWNrIHNoYXBlIGFnYWluIVxcXCIpO3RoaXMucmVzZXQoKX1mdW5jdGlvbiBTY3JlZW4oKXt2YXIgZSx0O3RoaXMuX2ZyYW1lcz0xLHRoaXMuX2RlbGF5PXZvaWQgMCx0aGlzLl9iZ2NvbG9yPVxcXCJub25lXFxcIix0aGlzLl9tb2RlPVxcXCJzdGFuZGFyZFxcXCIsdGhpcy5fbWFuYWdlcnM9e30sdGhpcy5fa2V5TG9nZ2VyPXt9LGU9KGcud29ybGRXaWR0aHx8Zy53aWR0aHx8Z2V0V2lkdGgoKSkvMix0PShnLndvcmxkSGVpZ2h0fHxnLmhlaWdodHx8Z2V0SGVpZ2h0KCkpLzIsdGhpcy5zZXRVcFdvcmxkKC1lLC10LGUsdCl9ZnVuY3Rpb24gZW5zdXJlQW5vbnltb3VzKCl7cmV0dXJuIGZ8fChmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh5LlR1cnRsZSkpLGYuaW5zdGFuY2V9ZnVuY3Rpb24gZ2V0VGFyZ2V0KCl7cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0U2NyZWVuKCl7cmV0dXJuIHB8fChwPW5ldyBTY3JlZW4pLHB9ZnVuY3Rpb24gZ2V0TW91c2VIYW5kbGVyKCl7cmV0dXJuIGh8fChoPW5ldyBNb3VzZUhhbmRsZXIpLGh9ZnVuY3Rpb24gZ2V0V2lkdGgoKXtyZXR1cm4gMHwocCYmcC5fd2lkdGh8fGcud2lkdGh8fGdldFRhcmdldCgpLmNsaWVudFdpZHRofHxULndpZHRoKX1mdW5jdGlvbiBnZXRIZWlnaHQoKXtyZXR1cm4gMHwocCYmcC5faGVpZ2h0fHxnLmhlaWdodHx8Z2V0VGFyZ2V0KCkuY2xpZW50SGVpZ2h0fHxULmhlaWdodCl9ZnVuY3Rpb24gY3JlYXRlTGF5ZXIoZSx0KXt2YXIgcixuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImNhbnZhc1xcXCIpLGE9Z2V0V2lkdGgoKSxzPWdldEhlaWdodCgpLGw9Z2V0VGFyZ2V0KCkuZmlyc3RDaGlsZD8tcytcXFwicHhcXFwiOlxcXCIwXFxcIjtyZXR1cm4gbi53aWR0aD1hLG4uaGVpZ2h0PXMsbi5zdHlsZS5wb3NpdGlvbj1cXFwicmVsYXRpdmVcXFwiLG4uc3R5bGUuZGlzcGxheT1cXFwiYmxvY2tcXFwiLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcIm1hcmdpbi10b3BcXFwiLGwpLG4uc3R5bGUuc2V0UHJvcGVydHkoXFxcInotaW5kZXhcXFwiLGUpLHQmJihuLnN0eWxlLmRpc3BsYXk9XFxcIm5vbmVcXFwiKSxnZXRUYXJnZXQoKS5hcHBlbmRDaGlsZChuKSxyPW4uZ2V0Q29udGV4dChcXFwiMmRcXFwiKSxyLmxpbmVDYXA9XFxcInJvdW5kXFxcIixyLmxpbmVKb2luPVxcXCJyb3VuZFxcXCIsYXBwbHlXb3JsZChnZXRTY3JlZW4oKSxyKSxyfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCl7dSYmKCh3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZSkodSksdT12b2lkIDApLG0mJih3aW5kb3cuY2xlYXJUaW1lb3V0KG0pLG09dm9pZCAwKX1mdW5jdGlvbiBhcHBseVdvcmxkKGUsdCl7dmFyIHI9ZS5sbHgsbj1lLmxseSxhPWUudXJ4LHM9ZS51cnksbD1lLnhTY2FsZSxpPWUueVNjYWxlO3QmJihjbGVhckxheWVyKHQpLHQucmVzdG9yZSgpLHQuc2F2ZSgpLHQuc2NhbGUoMS9sLDEvaSksdC50cmFuc2xhdGUoLXIsLXMpKX1mdW5jdGlvbiBwdXNoVW5kbyhlKXt2YXIgdCxyLG47aWYoZy5hbGxvd1VuZG8mJmUuX2J1ZmZlclNpemUpe2ZvcihlLl91bmRvQnVmZmVyfHwoZS5fdW5kb0J1ZmZlcj1bXSk7ZS5fdW5kb0J1ZmZlci5sZW5ndGg+ZS5fYnVmZmVyU2l6ZTspZS5fdW5kb0J1ZmZlci5zaGlmdCgpO2ZvcihyPXt9LHQ9W1xcXCJ4XFxcIixcXFwieVxcXCIsXFxcImFuZ2xlXFxcIixcXFwicmFkaWFuc1xcXCIsXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImRvd25cXFwiLFxcXCJmaWxsaW5nXFxcIixcXFwic2hvd25cXFwiLFxcXCJzaGFwZVxcXCIsXFxcInNpemVcXFwiXSxuPTA7bjx0Lmxlbmd0aDtuKyspclt0W25dXT1lW1xcXCJfXFxcIit0W25dXTtyZXR1cm4gZS5fdW5kb0J1ZmZlci5wdXNoKHIpLGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7ci5maWxsQnVmZmVyPXRoaXMuZmlsbEJ1ZmZlcj90aGlzLmZpbGxCdWZmZXIuc2xpY2UoKTp2b2lkIDAsZS5fcGFwZXImJmUuX3BhcGVyLmNhbnZhcyYmKHIuaW1hZ2U9ZS5fcGFwZXIuY2FudmFzLnRvRGF0YVVSTCgpKX0sITEpfX1mdW5jdGlvbiBwb3BVbmRvKGUpe3ZhciB0O2lmKGUuX2J1ZmZlclNpemUmJmUuX3VuZG9CdWZmZXImJih0PWUuX3VuZG9CdWZmZXIucG9wKCksISF0KSl7Zm9yKHZhciByIGluIHQpXFxcImltYWdlXFxcIiE9ciYmXFxcImZpbGxCdWZmZXJcXFwiIT09ciYmKGVbXFxcIl9cXFwiK3JdPXRbcl0pO3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbigpe3ZhciBlO3QuaW1hZ2UmJihMLnNyYz10LmltYWdlLGU9TCksY2xlYXJMYXllcih0aGlzLmNvbnRleHQoKSwhMSxMKSxkZWxldGUgdC5pbWFnZX0sITAsdCl9fWZ1bmN0aW9uIHJlbW92ZUxheWVyKGUpe2UmJmUuY2FudmFzJiZlLmNhbnZhcy5wYXJlbnROb2RlJiZlLmNhbnZhcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuY2FudmFzKX1mdW5jdGlvbiBjbGVhckxheWVyKGUsdCxyKXtlJiYoZS5zYXZlKCksZS5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQ/KGUuZmlsbFN0eWxlPXQsZS5maWxsUmVjdCgwLDAsZS5jYW52YXMud2lkdGgsZS5jYW52YXMuaGVpZ2h0KSk6ZS5jbGVhclJlY3QoMCwwLGUuY2FudmFzLndpZHRoLGUuY2FudmFzLmhlaWdodCksciYmZS5kcmF3SW1hZ2UociwwLDApLGUucmVzdG9yZSgpKX1mdW5jdGlvbiBkcmF3VHVydGxlKGUsdCl7dmFyIHIsbixhLHM9dltlLnNoYXBlXSxsPWdldFNjcmVlbigpLHU9Z2V0V2lkdGgoKSxtPWdldEhlaWdodCgpLHA9bC54U2NhbGUsZz1sLnlTY2FsZTtpZih0KXtpZihyPWMoZS5yYWRpYW5zKS9wLG49XyhlLnJhZGlhbnMpL2csYT1kKG4sciktby8yLHQuc2F2ZSgpLHQudHJhbnNsYXRlKGUueCxlLnkpLHQuc2NhbGUocCxnKSxzLm5vZGVOYW1lKXt2YXIgZj1zLm5hdHVyYWxXaWR0aCxoPXMubmF0dXJhbEhlaWdodDt0LmRyYXdJbWFnZShzLDAsMCxmLGgsLWYvMiwtaC8yLGYsaCl9ZWxzZXt0LnJvdGF0ZShhKSx0LmJlZ2luUGF0aCgpLHQubGluZVdpZHRoPTEsdC5zdHJva2VTdHlsZT1lLmNvbG9yLHQuZmlsbFN0eWxlPWUuZmlsbCx0Lm1vdmVUbygtc1swXVswXSxzWzBdWzFdKTtmb3IodmFyICQ9MTskPHMubGVuZ3RoOyQrKyl0LmxpbmVUbygtc1skXVswXSxzWyRdWzFdKTt0LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9dC5yZXN0b3JlKCl9fWZ1bmN0aW9uIGRyYXdEb3QoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKSxuPWdldFNjcmVlbigpLGw9bi54U2NhbGUsaT1uLnlTY2FsZTtyJiYoci5iZWdpblBhdGgoKSxyLm1vdmVUbyh0aGlzLngsdGhpcy55KSxlKj1hKHMobCkscyhpKSksci5hcmModGhpcy54LHRoaXMueSxlLzIsMCxUdXJ0bGUuUkFESUFOUyksci5jbG9zZVBhdGgoKSxyLmZpbGxTdHlsZT10fHx0aGlzLmNvbG9yLHIuZmlsbCgpKX1mdW5jdGlvbiBtZWFzdXJlVGV4dChlLHQpe3JldHVybiB0JiYoUy5mb250PXQpLFMubWVhc3VyZVRleHQoZSkud2lkdGh9ZnVuY3Rpb24gZHJhd1RleHQoZSx0LHIpe3ZhciBuPXRoaXMuY29udGV4dCgpO24mJihuLnNhdmUoKSxyJiYobi5mb250PXIpLHQmJnQubWF0Y2goL14obGVmdHxyaWdodHxjZW50ZXIpJC8pJiYobi50ZXh0QWxpZ249dCksbi5zY2FsZSgxLC0xKSxuLmZpbGxTdHlsZT10aGlzLmZpbGwsbi5maWxsVGV4dChlLHRoaXMueCwtdGhpcy55KSxuLnJlc3RvcmUoKSl9ZnVuY3Rpb24gZHJhd0xpbmUoZSx0KXt2YXIgcj10aGlzLmNvbnRleHQoKTtyJiYodCYmKHIuYmVnaW5QYXRoKCksci5tb3ZlVG8odGhpcy54LHRoaXMueSkpLHIubGluZVdpZHRoPXRoaXMuc2l6ZSpnZXRTY3JlZW4oKS5saW5lU2NhbGUsci5zdHJva2VTdHlsZT10aGlzLmNvbG9yLHIubGluZVRvKGUueCxlLnkpLHIuc3Ryb2tlKCkpfWZ1bmN0aW9uIGRyYXdGaWxsKCl7dmFyIGUsdD10aGlzLmNvbnRleHQoKSxyPXRoaXMuZmlsbEJ1ZmZlcjtpZih0JiZyJiZyLmxlbmd0aCl7Zm9yKHQuc2F2ZSgpLHQuYmVnaW5QYXRoKCksdC5tb3ZlVG8oclswXS54LHJbMF0ueSksZT0xO2U8ci5sZW5ndGg7ZSsrKXQubGluZVRvKHJbZV0ueCxyW2VdLnkpO2Zvcih0LmNsb3NlUGF0aCgpLHQuZmlsbFN0eWxlPXRoaXMuZmlsbCx0LmZpbGwoKSxlPTE7ZTxyLmxlbmd0aDtlKyspcltlXS5zdHJva2UmJih0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHJbZS0xXS54LHJbZS0xXS55KSx0LmxpbmVXaWR0aD1yW2VdLnNpemUqZ2V0U2NyZWVuKCkubGluZVNjYWxlLHQuc3Ryb2tlU3R5bGU9cltlXS5jb2xvcix0LmxpbmVUbyhyW2VdLngscltlXS55KSx0LnN0cm9rZSgpKTt0LnJlc3RvcmUoKX19ZnVuY3Rpb24gcGFydGlhbFRyYW5zbGF0ZShlLHQscixuLGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFkZFVwZGF0ZShmdW5jdGlvbihlKXt0aGlzLmRvd24mJmRyYXdMaW5lLmNhbGwodGhpcyxlLG4pfSxhLHt4OnQseTpyfSxuKX19ZnVuY3Rpb24gdHJhbnNsYXRlKGUsYSxsLG8sZCxfLGMpe3ZhciB1LG09ZS5fY29tcHV0ZWRfc3BlZWQscD1nZXRTY3JlZW4oKSxnPXMocC54U2NhbGUpLGY9cyhwLnlTY2FsZSksaD1hLCQ9bCx3PW4obypvKmcrZCpkKmYpLGI9bT90KHIoMSx3L20pKToxLHY9Z2V0RnJhbWVNYW5hZ2VyKCkud2lsbFJlbmRlck5leHQoKT9Qcm9taXNlLnJlc29sdmUoKTpuZXcgSW5zdGFudFByb21pc2U7Zm9yKGUuYWRkVXBkYXRlKGZ1bmN0aW9uKCl7dGhpcy5maWxsaW5nJiZ0aGlzLmZpbGxCdWZmZXIucHVzaCh7eDp0aGlzLngseTp0aGlzLnksc3Ryb2tlOnRoaXMuZG93bixjb2xvcjp0aGlzLmNvbG9yLHNpemU6dGhpcy5zaXplfSl9LCExKSx1PTA7dTxiO3UrKyloPWErby9iKih1KzEpLCQ9bCtkL2IqKHUrMSksdj12LnRoZW4ocGFydGlhbFRyYW5zbGF0ZShlLGgsJCxfLG18fCFjKSksXz0hMTtyZXR1cm4gdi50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuW2ErbyxsK2RdfSl9ZnVuY3Rpb24gcGFydGlhbFJvdGF0ZShlLHQscixuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLG4se2FuZ2xlOnQscmFkaWFuczpyfSl9fWZ1bmN0aW9uIHJvdGF0ZShlLG4sYSxsKXt2YXIgbyxkPWUuX2NvbXB1dGVkX3NwZWVkLF89MzYwKihhL2UuX2Z1bGxDaXJjbGUpLGM9ZD90KHIoMSxzKF8pL2QpKToxLHU9e30sbT1nZXRGcmFtZU1hbmFnZXIoKS53aWxsUmVuZGVyTmV4dCgpP1Byb21pc2UucmVzb2x2ZSgpOm5ldyBJbnN0YW50UHJvbWlzZTtmb3Iobz0wO288YztvKyspY2FsY3VsYXRlSGVhZGluZyhlLG4rYS9jKihvKzEpLHUpLG09bS50aGVuKHBhcnRpYWxSb3RhdGUoZSx1LmFuZ2xlLHUucmFkaWFucyxkfHwhbCkpO3JldHVybiBtLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY2FsY3VsYXRlSGVhZGluZyhlLG4rYSl9KX1mdW5jdGlvbiBnZXRDb29yZGluYXRlcyhlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1lJiYoZS55fHxlLl95fHxlWzFdKXx8MCxlPWUmJihlLnh8fGUuX3h8fGVbMF0pfHwwKSx7eDplLHk6dH19ZnVuY3Rpb24gaGV4VG9SR0IoZSl7dmFyIHQscixuO3JldHVybih0PS9ecmdiYT9cXFxcKChcXFxcZCspLChcXFxcZCspLChcXFxcZCspKD86LChbLlxcXFxkXSspKT9cXFxcKSQvLmV4ZWMoZSkpPyhuPVtwYXJzZUludCh0WzFdKSxwYXJzZUludCh0WzJdKSxwYXJzZUludCh0WzNdKV0sdFs0XSYmbi5wdXNoKHBhcnNlRmxvYXQodFs0XSkpKTovXiM/W2EtZlxcXFxkXXszfXxbYS1mXFxcXGRdezZ9JC9pLmV4ZWMoZSk/KDQ9PT1lLmxlbmd0aCYmKGU9ZS5yZXBsYWNlKC9eIz8oW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkoW2EtZlxcXFxkXSkkL2ksZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHQrdCtyK3IrbitufSkpLHI9L14jPyhbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KShbYS1mXFxcXGRdezJ9KSQvaS5leGVjKGUpLG49W3BhcnNlSW50KHJbMV0sMTYpLHBhcnNlSW50KHJbMl0sMTYpLHBhcnNlSW50KHJbM10sMTYpXSk6bj1lLG59ZnVuY3Rpb24gY3JlYXRlQ29sb3IoZSx0LG4scyxsKXt2YXIgbztpZih2b2lkIDAhPT1uJiYodD1bdCxuLHMsbF0pLHQuY29uc3RydWN0b3I9PT1BcnJheSYmdC5sZW5ndGgpe2lmKDI1NT09PWUpe2ZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIj09dHlwZW9mIHRbb10pdFtvXT1yKDAsYSgyNTUscGFyc2VJbnQodFtvXSkpKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcImJhZCBjb2xvciBzZXF1ZW5jZVxcXCIpO31lbHNlIGZvcihvPTA7Mz5vO28rKylpZihcXFwibnVtYmVyXFxcIiE9dHlwZW9mIHRbb10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7ZWxzZSBpZigxPj10W29dKXRbb109cigwLGEoMjU1LHBhcnNlSW50KDI1NSp0W29dKSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcXFwiYmFkIGNvbG9yIHNlcXVlbmNlXFxcIik7XFxcIm51bWJlclxcXCI9PXR5cGVvZiB0W29dPyh0WzNdPXIoMCxhKDEsdFtvXSkpLHQ9XFxcInJnYmEoXFxcIit0LmpvaW4oXFxcIixcXFwiKStcXFwiKVxcXCIpOnQ9XFxcInJnYihcXFwiK3Quc2xpY2UoMCwzKS5qb2luKFxcXCIsXFxcIikrXFxcIilcXFwifWVsc2UgaWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiB0JiYhdC5tYXRjaCgvXFxcXHMqdXJsXFxcXHMqXFxcXCgvaSkpdD10LnJlcGxhY2UoL1xcXFxzKy9nLFxcXCJcXFwiKTtlbHNlIHJldHVyblxcXCJibGFja1xcXCI7cmV0dXJuIHR9ZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGluZyhlLHQscil7dmFyIG49ZS5fYW5nbGV8fDAsYT1lLl9yYWRpYW5zfHwwO3JldHVybiByfHwocj17fSksXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYoZS5faXNSYWRpYW5zP249YT10JVR1cnRsZS5SQURJQU5TOmUuX2Z1bGxDaXJjbGU/KG49dCVlLl9mdWxsQ2lyY2xlLGE9bi9lLl9mdWxsQ2lyY2xlKlR1cnRsZS5SQURJQU5TKTpuPWE9MCwwPm4mJihuKz1lLl9mdWxsQ2lyY2xlLGErPVR1cnRsZS5SQURJQU5TKSksci5hbmdsZT1uLHIucmFkaWFucz1hLHJ9ZnVuY3Rpb24gcHl0aG9uVG9KYXZhc2NyaXB0RnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLG49ci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoZSl9KTtyZXR1cm5cXFwidW5kZWZpbmVkXFxcIiE9dHlwZW9mIHQmJm4udW5zaGlmdCh0KSxTay5taXNjZXZhbC5hcHBseUFzeW5jKHZvaWQgMCxlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4pLmNhdGNoKFNrLnVuY2F1Z2h0RXhjZXB0aW9uKX19ZnVuY3Rpb24gYWRkTW9kdWxlTWV0aG9kKGUsdCxyLG4pe3ZhciBhLHM9ci5yZXBsYWNlKC9eXFxcXCQvLFxcXCJcXFwiKSxsPXMucmVwbGFjZSgvX1xcXFwkW2Etel0rXFxcXCQkL2ksXFxcIlxcXCIpLG89ZS5wcm90b3R5cGVbcl0ubGVuZ3RoLGQ9ZS5wcm90b3R5cGVbcl0ubWluQXJncyxfPWUucHJvdG90eXBlW3JdLmNvX3Zhcm5hbWVzfHxbXSxjPWUucHJvdG90eXBlW3JdLnJldHVyblR5cGUsdT1lLnByb3RvdHlwZVtyXS5pc1NrO3ZvaWQgMD09PWQmJihkPW8pLGE9ZnVuY3Rpb24oKXt2YXIgZSx0LGEscyxfLG09QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHA9bj9uKCk6bS5zaGlmdCgpLmluc3RhbmNlO2lmKG0ubGVuZ3RoPGR8fG0ubGVuZ3RoPm8pdGhyb3cgXz1kPT09bz9cXFwiZXhhY3RseSBcXFwiK286XFxcImJldHdlZW4gXFxcIitkK1xcXCIgYW5kIFxcXCIrbyxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IobCtcXFwiKCkgdGFrZXMgXFxcIitfK1xcXCIgcG9zaXRpb25hbCBhcmd1bWVudChzKSAoXFxcIittLmxlbmd0aCtcXFwiIGdpdmVuKVxcXCIpO2ZvcihlPW0ubGVuZ3RoOzA8PS0tZTspdm9pZCAwIT09bVtlXSYmKG1bZV09bVtlXWluc3RhbmNlb2YgU2suYnVpbHRpbi5mdW5jP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0pOm1bZV1pbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kP3B5dGhvblRvSmF2YXNjcmlwdEZ1bmN0aW9uKG1bZV0uaW1fZnVuYyxtW2VdLmltX3NlbGYpOm1bZV0mJm1bZV0uJGQgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJm1bZV0uaW5zdGFuY2U/bVtlXS5pbnN0YW5jZTpTay5mZmkucmVtYXBUb0pzKG1bZV0pKTt2YXIgZz1tLnNsaWNlKDApO2ZvcihtPVtdLGU9Zy5sZW5ndGg7MDw9ZTstLWUpbnVsbCE9PWdbZV0mJihtW2VdPWdbZV0pO3RyeXt0PXBbcl0uYXBwbHkocCxtKX1jYXRjaCh0KXt0aHJvdyB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUubG9nKFxcXCJ3cmFwcGVkIG1ldGhvZCBmYWlsZWRcXFwiKSx3aW5kb3cuY29uc29sZS5sb2codC5zdGFjaykpLHR9cmV0dXJuIHQgaW5zdGFuY2VvZiBJbnN0YW50UHJvbWlzZSYmKHQ9dC5sYXN0UmVzdWx0KSx0IGluc3RhbmNlb2YgUHJvbWlzZT8odD10LmNhdGNoKGZ1bmN0aW9uKHQpe3Rocm93IHdpbmRvdyYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5sb2coXFxcInByb21pc2UgZmFpbGVkXFxcIiksd2luZG93LmNvbnNvbGUubG9nKHQuc3RhY2spKSx0fSksYT1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbixhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDpTay5mZmkucmVtYXBUb1B5KHMpfSxhLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6dC50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBzPWUsZX0pfSxhKTp2b2lkIDA9PT10P1NrLmJ1aWx0aW4ubm9uZS5ub25lJDp1P3Q6XFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGM/Yyh0KTpTay5mZmkucmVtYXBUb1B5KHQpfSxhLmNvX25hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKGwpLGEuY29fdmFybmFtZXM9Xy5zbGljZSgpLGEuJGRlZmF1bHRzPVtdO2Zvcih2YXIgbT1kO208Xy5sZW5ndGg7bSsrKWEuJGRlZmF1bHRzLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKTtufHxhLmNvX3Zhcm5hbWVzLnVuc2hpZnQoXFxcInNlbGZcXFwiKSx0W3NdPW5ldyBTay5idWlsdGluLmZ1bmMoYSl9ZnVuY3Rpb24gaW5pdFR1cnRsZShlLHQpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3MoXFxcIl9faW5pdF9fXFxcIixhcmd1bWVudHMsMiwzLCExLCExKSxlLmluc3RhbmNlPW5ldyBUdXJ0bGUodCksZS5pbnN0YW5jZS5za0luc3RhbmNlPWV9ZnVuY3Rpb24gZm9jdXNUdXJ0bGUoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJih3PSEhZSx3P2dldFRhcmdldCgpLmZvY3VzKCk6Z2V0VGFyZ2V0KCkuYmx1cigpKSx3fWZ1bmN0aW9uIHJlc2V0VHVydGxlKCl7Zm9yKGNhbmNlbEFuaW1hdGlvbkZyYW1lKCksZ2V0U2NyZWVuKCkucmVzZXQoKSxnZXRGcmFtZU1hbmFnZXIoKS5yZXNldCgpO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2gmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfWZ1bmN0aW9uIHN0b3BUdXJ0bGUoKXtjYW5jZWxBbmltYXRpb25GcmFtZSgpLGgmJmgucmVzZXQoKSwkPTAscD12b2lkIDAsZj12b2lkIDAsaD12b2lkIDAsaz0wfXZhciB1LG0scCxnLGYsaCx5PXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcInR1cnRsZVxcXCIpfSwkPTAsdz0hMCxiPTFlMy8zMCx2PXt9LGs9MCx4PXt9LFQ9e3RhcmdldDpcXFwidHVydGxlXFxcIix3aWR0aDo0MDAsaGVpZ2h0OjQwMCx3b3JsZFdpZHRoOjAsd29ybGRIZWlnaHQ6MCxhbmltYXRlOiEwLGJ1ZmZlclNpemU6MCxhbGxvd1VuZG86ITAsYXNzZXRzOnt9fTtlLmhhc0F0dHJpYnV0ZShcXFwidGFiaW5kZXhcXFwiKXx8ZS5zZXRBdHRyaWJ1dGUoXFxcInRhYmluZGV4XFxcIiwwKSx4LkZMT0FUPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oZSl9LHguQ09MT1I9ZnVuY3Rpb24oZSl7aWYoXFxcInN0cmluZ1xcXCI9PXR5cGVvZiBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSk7Zm9yKHZhciB0PTA7Mz50O3QrKyllW3RdPVNrLmJ1aWx0aW4uYXNzayQoZVt0XSk7cmV0dXJuIDQ9PT1lLmxlbmd0aCYmKGVbM109bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGVbM10pKSxuZXcgU2suYnVpbHRpbi50dXBsZShlKX0seC5UVVJUTEVfTElTVD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7cisrKXQucHVzaChlW3JdLnNrSW5zdGFuY2UpO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0KX0sdi5hcnJvdz1bWy0xMCwwXSxbMTAsMF0sWzAsMTBdXSx2LnNxdWFyZT1bWzEwLC0xMF0sWzEwLDEwXSxbLTEwLDEwXSxbLTEwLC0xMF1dLHYudHJpYW5nbGU9W1sxMCwtNS43N10sWzAsMTEuNTVdLFstMTAsLTUuNzddXSx2LmNsYXNzaWM9W1swLDBdLFstNSwtOV0sWzAsLTddLFs1LC05XV0sdi50dXJ0bGU9W1swLDE2XSxbLTIsMTRdLFstMSwxMF0sWy00LDddLFstNyw5XSxbLTksOF0sWy02LDVdLFstNywxXSxbLTUsLTNdLFstOCwtNl0sWy02LC04XSxbLTQsLTVdLFswLC03XSxbNCwtNV0sWzYsLThdLFs4LC02XSxbNSwtM10sWzcsMV0sWzYsNV0sWzksOF0sWzcsOV0sWzQsN10sWzEsMTBdLFsyLDE0XV0sdi5jaXJjbGU9W1sxMCwwXSxbOS41MSwzLjA5XSxbOC4wOSw1Ljg4XSxbNS44OCw4LjA5XSxbMy4wOSw5LjUxXSxbMCwxMF0sWy0zLjA5LDkuNTFdLFstNS44OCw4LjA5XSxbLTguMDksNS44OF0sWy05LjUxLDMuMDldLFstMTAsMF0sWy05LjUxLC0zLjA5XSxbLTguMDksLTUuODhdLFstNS44OCwtOC4wOV0sWy0zLjA5LC05LjUxXSxbLTAsLTEwXSxbMy4wOSwtOS41MV0sWzUuODgsLTguMDldLFs4LjA5LC01Ljg4XSxbOS41MSwtMy4wOV1dLGc9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gU2suVHVydGxlR3JhcGhpY3N8fChTay5UdXJ0bGVHcmFwaGljcz17fSksVClTay5UdXJ0bGVHcmFwaGljcy5oYXNPd25Qcm9wZXJ0eShlKXx8KFNrLlR1cnRsZUdyYXBoaWNzW2VdPVRbZV0pO3JldHVybiBTay5UdXJ0bGVHcmFwaGljc30oKSxJbnN0YW50UHJvbWlzZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0UmVzdWx0KX1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9LEluc3RhbnRQcm9taXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihlKXtpZih0aGlzLmxhc3RFcnJvcil0cnl7dGhpcy5sYXN0UmVzdWx0PWUodGhpcy5sYXN0RXJyb3IpLHRoaXMubGFzdEVycm9yPXZvaWQgMH1jYXRjaCh0KXt0aGlzLmxhc3RSZXN1bHQ9dm9pZCAwLHRoaXMubGFzdEVycm9yPXR9cmV0dXJuIHRoaXMubGFzdFJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2U/dGhpcy5sYXN0UmVzdWx0OnRoaXN9O3ZhciBBOyhmdW5jdGlvbihlKXtmdW5jdGlvbiBhbmltYXRpb25GcmFtZShlKXtyZXR1cm4gZy5hbmltYXRlPyFlJiZ0P3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG09d2luZG93LnNldFRpbWVvdXQodCxlfHxiKSxtfTpmdW5jdGlvbihlKXtlKCl9fXZhciB0OyhmdW5jdGlvbihlKXtlJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gdT1lKHQpfSl9KSh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lKSxlLndpbGxSZW5kZXJOZXh0PWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fYnVmZmVyJiZ0aGlzLl9mcmFtZUNvdW50KzE9PT10aGlzLmZyYW1lQnVmZmVyKCkpfSxlLnR1cnRsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdHVydGxlc30sZS5hZGRUdXJ0bGU9ZnVuY3Rpb24oZSl7dGhpcy5fdHVydGxlcy5wdXNoKGUpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7aWYodGhpcy5fdHVydGxlcylmb3IodmFyIGU9dGhpcy5fdHVydGxlcy5sZW5ndGg7MDw9LS1lOyl0aGlzLl90dXJ0bGVzW2VdLnJlc2V0KCk7dGhpcy5fdHVydGxlcz1bXSx0aGlzLl9mcmFtZXM9W10sdGhpcy5fZnJhbWVDb3VudD0wLHRoaXMuX2J1ZmZlcj0xLHRoaXMuX3JhdGU9MCx0aGlzLl9hbmltYXRpb25GcmFtZT1hbmltYXRpb25GcmFtZSgpfSxlLmFkZEZyYW1lPWZ1bmN0aW9uKGUsdCl7dmFyIHI9ITE7cmV0dXJuIHQmJih0aGlzLl9mcmFtZUNvdW50Kz0xKSx0aGlzLmZyYW1lcygpLnB1c2goZSkscj0hZy5hbmltYXRlfHx0aGlzLl9idWZmZXImJnRoaXMuX2ZyYW1lQ291bnQ9PT10aGlzLmZyYW1lQnVmZmVyKCkscj90aGlzLnVwZGF0ZSgpOm5ldyBJbnN0YW50UHJvbWlzZX0sZS5mcmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVzfSxlLmZyYW1lQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX2J1ZmZlcj0wfGUsZSYmZTw9dGhpcy5fZnJhbWVDb3VudCk/dGhpcy51cGRhdGUoKTp0aGlzLl9idWZmZXJ9LGUucmVmcmVzaEludGVydmFsPWZ1bmN0aW9uKGUpe3JldHVyblxcXCJudW1iZXJcXFwiPT10eXBlb2YgZSYmKHRoaXMuX3JhdGU9MHxlLHRoaXMuX2FuaW1hdGlvbkZyYW1lPWFuaW1hdGlvbkZyYW1lKGUpKSx0aGlzLl9yYXRlfSxlLnVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mcmFtZXMmJnRoaXMuX2ZyYW1lcy5sZW5ndGg/dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTpuZXcgSW5zdGFudFByb21pc2V9LGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKCl7dmFyIGUsdCxyPXRoaXMuX2ZyYW1lcyxuPXRoaXMuX2FuaW1hdGlvbkZyYW1lLGE9dGhpcy5fdHVydGxlcyxzPWdldFNjcmVlbigpLnNwcml0ZUxheWVyKCk7cmV0dXJuIHRoaXMuX2ZyYW1lcz1bXSx0aGlzLl9mcmFtZUNvdW50PTAsbmV3IFByb21pc2UoZnVuY3Rpb24obCl7bihmdW5jdGlvbiBwYWludCgpe2Zvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XSYmclt0XSgpO2ZvcihjbGVhckxheWVyKHMpLHQ9MDt0PGEubGVuZ3RoO3QrKyllPWFbdF0sZS5nZXRTdGF0ZSgpLnNob3duJiZkcmF3VHVydGxlKGUuZ2V0U3RhdGUoKSxzKTtsKCl9KX0pfX0pKEZyYW1lTWFuYWdlci5wcm90b3R5cGUpLGZ1bmN0aW9uKGUpe2Uub25FdmVudD1mdW5jdGlvbih0LHIpe2Z1bmN0aW9uIGNvbXB1dGVDb29yZGluYXRlcygpe2lmKCFfKXt2YXIgdD1nZXRTY3JlZW4oKSxsPXQuc3ByaXRlTGF5ZXIoKS5jYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZT0wfHIuY2xpZW50WC1sLmxlZnQsbj0wfHIuY2xpZW50WS1sLnRvcCxhPWUqdC54U2NhbGUrdC5sbHgscz1uKnQueVNjYWxlK3QudXJ5LF89ITB9fXZhciBlLG4sYSxzLGwsbz10aGlzLl9tYW5hZ2Vyc1t0XSxkPXRoaXMuX21hbmFnZXJzLm1vdXNlbW92ZSxfPSExO2lmKChcXFwibW91c2Vkb3duXFxcIj09PXR8fFxcXCJtb3VzZXVwXFxcIj09PXQpJiZkJiZkLmxlbmd0aClmb3IoY29tcHV0ZUNvb3JkaW5hdGVzKCksbD1kLmxlbmd0aDswPD0tLWw7KWRbbF0udGVzdChlLG4sYSxzKSYmZFtsXS5jYW5Nb3ZlKFxcXCJtb3VzZWRvd25cXFwiPT09dCk7aWYobyYmby5sZW5ndGgpZm9yKGNvbXB1dGVDb29yZGluYXRlcygpLGw9by5sZW5ndGg7MDw9LS1sOylcXFwibW91c2Vtb3ZlXFxcIj09PXQmJm9bbF0uY2FuTW92ZSgpJiZvW2xdLnRlc3QoZSxuLGEscyk/b1tsXS50cmlnZ2VyKFthLHNdKTpcXFwibW91c2Vkb3duXFxcIj09PXQmJm9bbF0udGVzdChlLG4sYSxzKSYmb1tsXS50cmlnZ2VyKFthLHNdKX0sZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX21hbmFnZXJzPXt9fSxlLmFkZE1hbmFnZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPVtdKSx0aGlzLl9tYW5hZ2Vyc1tlXS5wdXNoKHQpfX0oTW91c2VIYW5kbGVyLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuX2hhbmRsZXJzPXZvaWQgMH0sZS5jYW5Nb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiEhKHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3QpJiYodm9pZCAwIT09ZSYmKHRoaXMuX3RhcmdldC5oaXRUZXN0LmhpdD1lKSx0aGlzLl90YXJnZXQuaGl0VGVzdC5oaXQpfSxlLnRlc3Q9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHRoaXMuX3RhcmdldCYmdGhpcy5fdGFyZ2V0LmhpdFRlc3Q/dGhpcy5fdGFyZ2V0LmhpdFRlc3QoZSx0LHIsbik6ISF0aGlzLl90YXJnZXR9LGUudHJpZ2dlcj1mdW5jdGlvbihlKXt2YXIgdCxyPXRoaXMuX2hhbmRsZXJzO2lmKHImJnIubGVuZ3RoKWZvcih0PTA7dDxyLmxlbmd0aDt0Kyspclt0XS5hcHBseSh7fSxlKX0sZS5hZGRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5faGFuZGxlcnM7aWYoIXQmJnImJnIubGVuZ3RoKWZvcig7ci5zaGlmdCgpOyk7cmV0dXJuXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIGU/dm9pZCghciYmKHI9dGhpcy5faGFuZGxlcnM9W10pLHIucHVzaChlKSk6dm9pZChyJiYhci5sZW5ndGgmJnRoaXMucmVzZXQoKSl9fShFdmVudE1hbmFnZXIucHJvdG90eXBlKSxUdXJ0bGUuUkFESUFOUz0yKm8sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gY2lyY2xlUm90YXRlKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGRVcGRhdGUodm9pZCAwLCExLHthbmdsZTp0LHJhZGlhbnM6cn0pfX1mdW5jdGlvbiBjaXJjbGVTZWdtZW50KGUsdCxyLG4sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS50cmFuc2xhdGUodCxyLG4sYSxzLCEwKX19ZS5oaXRUZXN0PWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0U2NyZWVuKCkuaGl0VGVzdExheWVyKCk7Y2xlYXJMYXllcihyKSxkcmF3VHVydGxlKHRoaXMuZ2V0U3RhdGUoKSxyKTt2YXIgbj1yLmdldEltYWdlRGF0YShlLHQsMSwxKS5kYXRhO3JldHVybiBuWzNdfHxuWzBdfHxuWzFdfHxuWzJdfSxlLmFkZFVwZGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcyxhPXRoaXMuZ2V0U3RhdGUoKSxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxyPzI6Myk7cmV0dXJuIGdldEZyYW1lTWFuYWdlcigpLmFkZEZyYW1lKGZ1bmN0aW9uKCl7aWYoZSYmZS5hcHBseShhLHMpLHIpZm9yKHZhciB0IGluIHIpYVt0XT1yW3RdfSx0KX0sZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX3N0YXRlfHwodGhpcy5fc3RhdGU9e3g6dGhpcy5feCx5OnRoaXMuX3ksYW5nbGU6dGhpcy5fYW5nbGUscmFkaWFuczp0aGlzLl9yYWRpYW5zLHNoYXBlOnRoaXMuX3NoYXBlLGNvbG9yOnRoaXMuX2NvbG9yLGZpbGw6dGhpcy5fZmlsbCxmaWxsaW5nOnRoaXMuX2ZpbGxpbmcsc2l6ZTp0aGlzLl9zaXplLHNwZWVkOnRoaXMuX2NvbXB1dGVkX3NwZWVkLGRvd246dGhpcy5fZG93bixzaG93bjp0aGlzLl9zaG93bixjb2xvck1vZGU6dGhpcy5fY29sb3JNb2RlLGNvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRQYXBlcigpfX0pLHRoaXMuX3N0YXRlfSxlLnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQscixuLGEscyl7dmFyIGw9dGhpcztyZXR1cm4gdHJhbnNsYXRlKHRoaXMsZSx0LHIsbixhLHMpLnRoZW4oZnVuY3Rpb24oZSl7bC5feD1lWzBdLGwuX3k9ZVsxXX0pfSxlLnJvdGF0ZT1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpcztyZXR1cm4gcm90YXRlKHRoaXMsZSx0LHIpLnRoZW4oZnVuY3Rpb24oZSl7bi5fYW5nbGU9ZS5hbmdsZSxuLl9yYWRpYW5zPWUucmFkaWFuc30pfSxlLnF1ZXVlTW92ZUJ5PWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBhPWMocikqbixzPV8ocikqbjtyZXR1cm4gdGhpcy50cmFuc2xhdGUoZSx0LGEscywhMCl9LGUucXVldWVUdXJuVG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCU9dGhpcy5fZnVsbENpcmNsZSwwPnQmJih0Kz10aGlzLl9mdWxsQ2lyY2xlKSx0aGlzLnJvdGF0ZShlLHQtZSl9LGUuZ2V0TWFuYWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFuYWdlcnNbZV18fCh0aGlzLl9tYW5hZ2Vyc1tlXT1uZXcgRXZlbnRNYW5hZ2VyKGUsdGhpcykpLHRoaXMuX21hbmFnZXJzW2VdfSxlLmdldFBhcGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcGVyfHwodGhpcy5fcGFwZXI9Y3JlYXRlTGF5ZXIoMikpfSxlLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fcmFkaWFucz0wLHRoaXMuX2FuZ2xlPTAsdGhpcy5fc2hvd249ITAsdGhpcy5fZG93bj0hMCx0aGlzLl9jb2xvcj1cXFwiYmxhY2tcXFwiLHRoaXMuX2ZpbGw9XFxcImJsYWNrXFxcIix0aGlzLl9zaXplPTEsdGhpcy5fZmlsbGluZz0hMSx0aGlzLl91bmRvQnVmZmVyPVtdLHRoaXMuX3NwZWVkPTMsdGhpcy5fY29tcHV0ZWRfc3BlZWQ9NSx0aGlzLl9jb2xvck1vZGU9MSx0aGlzLl9zdGF0ZT12b2lkIDAsdGhpcy5fbWFuYWdlcnMpdGhpcy5fbWFuYWdlcnNbZV0ucmVzZXQoKTt0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fZnVsbENpcmNsZT0zNjAsdGhpcy5fYnVmZmVyU2l6ZT1cXFwibnVtYmVyXFxcIj09dHlwZW9mIGcuYnVmZmVyU2l6ZT9nLmJ1ZmZlclNpemU6MCxyZW1vdmVMYXllcih0aGlzLl9wYXBlciksdGhpcy5fcGFwZXI9dm9pZCAwfSxlLiRkZWdyZWVzPWZ1bmN0aW9uKGUpe3JldHVybiBlPVxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT9zKGUpOjM2MCx0aGlzLl9pc1JhZGlhbnM9ITEsdGhpcy5fYW5nbGU9ZSYmdGhpcy5fZnVsbENpcmNsZT90aGlzLl9hbmdsZS90aGlzLl9mdWxsQ2lyY2xlKmU6dGhpcy5fcmFkaWFucz0wLHRoaXMuX2Z1bGxDaXJjbGU9ZSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2FuZ2xlOnRoaXMuX2FuZ2xlLHJhZGlhbnM6dGhpcy5fcmFkaWFuc30pfSxlLiRkZWdyZWVzLm1pbkFyZ3M9MCxlLiRkZWdyZWVzLmNvX3Zhcm5hbWVzPVtcXFwiZnVsbGNpcmNsZVxcXCJdLGUuJGRlZ3JlZXMucmV0dXJuVHlwZT14LkZMT0FULGUuJHJhZGlhbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNSYWRpYW5zfHwodGhpcy5faXNSYWRpYW5zPSEwLHRoaXMuX2FuZ2xlPXRoaXMuX3JhZGlhbnMsdGhpcy5fZnVsbENpcmNsZT1UdXJ0bGUuUkFESUFOUyksdGhpcy5fYW5nbGV9LGUuJHJhZGlhbnMucmV0dXJuVHlwZT14LkZMT0FULGUuJHBvc2l0aW9uPWUuJHBvcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLiR4Y29yKCksdGhpcy4keWNvcigpXX0sZS4kcG9zaXRpb24ucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmZsb2F0XyhlWzBdKSxuZXcgU2suYnVpbHRpbi5mbG9hdF8oZVsxXSldKX0sZS4kdG93YXJkcz1mdW5jdGlvbihlLHQpe3ZhciByPWdldENvb3JkaW5hdGVzKGUsdCksbj1vK2QodGhpcy5feS1yLnksdGhpcy5feC1yLngpLGE9bioodGhpcy5fZnVsbENpcmNsZS9UdXJ0bGUuUkFESUFOUyk7cmV0dXJuIGF9LGUuJHRvd2FyZHMuY29fdmFybmFtZXM9W1xcXCJ4XFxcIixcXFwieVxcXCJdLGUuJHRvd2FyZHMubWluQXJncz0xLGUuJHRvd2FyZHMucmV0dXJuVHlwZT14LkZMT0FULGUuJGRpc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9Z2V0Q29vcmRpbmF0ZXMoZSx0KSxhPXIueC10aGlzLl94LHM9ci55LXRoaXMuX3k7cmV0dXJuIG4oYSphK3Mqcyl9LGUuJGRpc3RhbmNlLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRkaXN0YW5jZS5taW5BcmdzPTEsZS4kZGlzdGFuY2UucmV0dXJuVHlwZT14LkZMT0FULGUuJGhlYWRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtMTM+cyh0aGlzLl9hbmdsZSk/MDp0aGlzLl9hbmdsZX0sZS4kaGVhZGluZy5yZXR1cm5UeXBlPXguRkxPQVQsZS4keGNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3gpPzA6dGhpcy5feH0sZS4keGNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4keWNvcj1mdW5jdGlvbigpe3JldHVybiAxZS0xMz5zKHRoaXMuX3kpPzA6dGhpcy5feX0sZS4keWNvci5yZXR1cm5UeXBlPXguRkxPQVQsZS4kZm9yd2FyZD1lLiRmZD1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucyxlKX0sZS4kZm9yd2FyZC5jb192YXJuYW1lcz1lLiRmZC5jb192YXJuYW1lcz1bXFxcImRpc3RhbmNlXFxcIl0sZS4kdW5kbz1mdW5jdGlvbigpe3BvcFVuZG8odGhpcyl9LGUuJHVuZG9idWZmZXJlbnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VuZG9CdWZmZXIubGVuZ3RofSxlLiRzZXR1bmRvYnVmZmVyPWZ1bmN0aW9uKGUpe3RoaXMuX2J1ZmZlclNpemU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP2EocyhlKSwxZTMpOjB9LGUuJHNldHVuZG9idWZmZXIuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIl0sZS4kYmFja3dhcmQ9ZS4kYmFjaz1lLiRiaz1mdW5jdGlvbihlKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5xdWV1ZU1vdmVCeSh0aGlzLl94LHRoaXMuX3ksdGhpcy5fcmFkaWFucywtZSl9LGUuJGJhY2t3YXJkLmNvX3Zhcm5hbWVzPWUuJGJhY2suY29fdmFybmFtZXM9ZS4kYmsuY29fdmFybmFtZXM9W1xcXCJkaXN0YW5jZVxcXCJdLGUuJGdvdG9fJHJ3JD1lLiRzZXRwb3M9ZS4kc2V0cG9zaXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgcj1nZXRDb29yZGluYXRlcyhlLHQpO3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksci54LXRoaXMuX3gsci55LXRoaXMuX3ksITApfSxlLiRnb3RvXyRydyQuY29fdmFybmFtZXM9ZS4kc2V0cG9zLmNvX3Zhcm5hbWVzPWUuJHNldHBvc2l0aW9uLmNvX3Zhcm5hbWVzPVtcXFwieFxcXCIsXFxcInlcXFwiXSxlLiRnb3RvXyRydyQubWluQXJncz1lLiRzZXRwb3MubWluQXJncz1lLiRzZXRwb3NpdGlvbi5taW5BcmdzPTEsZS4kc2V0eD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUodGhpcy5feCx0aGlzLl95LGUtdGhpcy5feCwwLCEwKX0sZS4kc2V0eC5jb192YXJuYW1lcz1bXFxcInhcXFwiXSxlLiRzZXR5PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyYW5zbGF0ZSh0aGlzLl94LHRoaXMuX3ksMCxlLXRoaXMuX3ksITApfSxlLiRzZXR5LmNvX3Zhcm5hbWVzPVtcXFwieVxcXCJdLGUuJGhvbWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fYW5nbGU7cmV0dXJuIHB1c2hVbmRvKHRoaXMpLGUudHJhbnNsYXRlKHRoaXMuX3gsdGhpcy5feSwtdGhpcy5feCwtdGhpcy5feSwhMCkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnF1ZXVlVHVyblRvKHQsMCl9KS50aGVuKGZ1bmN0aW9uKCl7fSl9LGUuJHJpZ2h0PWUuJHJ0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSwtZSl9LGUuJHJpZ2h0LmNvX3Zhcm5hbWVzPWUuJHJ0LmNvX3Zhcm5hbWVzPVtcXFwiYW5nbGVcXFwiXSxlLiRsZWZ0PWUuJGx0PWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnJvdGF0ZSh0aGlzLl9hbmdsZSxlKX0sZS4kbGVmdC5jb192YXJuYW1lcz1lLiRsdC5jb192YXJuYW1lcz1bXFxcImFuZ2xlXFxcIl0sZS4kc2V0aGVhZGluZz1lLiRzZXRoPWZ1bmN0aW9uKGUpe3JldHVybiBwdXNoVW5kbyh0aGlzKSx0aGlzLnF1ZXVlVHVyblRvKHRoaXMuX2FuZ2xlLGUpfSxlLiRzZXRoZWFkaW5nLmNvX3Zhcm5hbWVzPWUuJHNldGguY29fdmFybmFtZXM9W1xcXCJhbmdsZVxcXCJdLGUuJGNpcmNsZT1mdW5jdGlvbihlLHQscil7dmFyIG4sZCx1LG0scCxnLGYsaCwkLGI9dGhpcyx2PXRoaXMuX3gsaz10aGlzLl95LFQ9dGhpcy5fYW5nbGUsQT17fSxMPTEvZ2V0U2NyZWVuKCkubGluZVNjYWxlLFM9ITA7Zm9yKHB1c2hVbmRvKHRoaXMpLHZvaWQgMD09PXQmJih0PWIuX2Z1bGxDaXJjbGUpLHZvaWQgMD09PXImJihkPXModCkvYi5fZnVsbENpcmNsZSxyPTErKDB8YSgxMStzKGUqTCkvNiw1OSkqZCkpLHU9dC9yLG09LjUqdSxwPTIqZSpfKHUqby9iLl9mdWxsQ2lyY2xlKSwwPmU/KHA9LXAsdT0tdSxtPS1tLG49VC10KTpuPVQrdCwkPWdldEZyYW1lTWFuYWdlcigpLndpbGxSZW5kZXJOZXh0KCk/UHJvbWlzZS5yZXNvbHZlKCk6bmV3IEluc3RhbnRQcm9taXNlLFQrPW0sZz0wO2c8cjtnKyspY2FsY3VsYXRlSGVhZGluZyhiLFQrdSpnLEEpLGY9YyhBLnJhZGlhbnMpKnAsaD1fKEEucmFkaWFucykqcCwkPSQudGhlbihjaXJjbGVSb3RhdGUoYixBLmFuZ2xlLEEucmFkaWFucykpLnRoZW4oY2lyY2xlU2VnbWVudChiLHYsayxmLGgsUykpLHYrPWYsays9aCxTPSExO3JldHVybiAkPSQudGhlbihmdW5jdGlvbigpe3JldHVybiBjYWxjdWxhdGVIZWFkaW5nKGIsbixBKSxiLl9hbmdsZT1BLmFuZ2xlLGIuX3JhZGlhbnM9QS5yYWRpYW5zLGIuYWRkVXBkYXRlKHZvaWQgMCwhMCxBKX0pLCR9LGUuJGNpcmNsZS5jb192YXJuYW1lcz1bXFxcInJhZGl1c1xcXCIsXFxcImV4dGVudFxcXCIsXFxcInN0ZXBzXFxcIl0sZS4kY2lyY2xlLm1pbkFyZ3M9MSxlLiRwZW51cD1lLiR1cD1lLiRwdT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duPSExLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZG93bjohMX0pfSxlLiRwZW5kb3duPWUuJGRvd249ZS4kcGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITEse2Rvd246ITB9KX0sZS4kaXNkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd259LGUuJHNwZWVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX3NwZWVkOih0aGlzLl9zcGVlZD1yKDAsYSgxZTMsZSkpLHRoaXMuX2NvbXB1dGVkX3NwZWVkPXIoMCwyKmUtMSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLCExLHtzcGVlZDp0aGlzLl9jb21wdXRlZF9zcGVlZH0pKX0sZS4kc3BlZWQubWluQXJncz0wLGUuJHNwZWVkLmNvX3Zhcm5hbWVzPVtcXFwic3BlZWRcXFwiXSxlLiRwZW5jb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlLHQscixuKSx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsdGhpcy5fc2hvd24se2NvbG9yOnRoaXMuX2NvbG9yfSkpfSxlLiRwZW5jb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRwZW5jb2xvci5taW5BcmdzPTAsZS4kcGVuY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJGZpbGxjb2xvcj1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gdm9pZCAwPT09ZT9oZXhUb1JHQih0aGlzLl9maWxsKToodGhpcy5fZmlsbD1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGZpbGxjb2xvci5jb192YXJuYW1lcz1bXFxcInJcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiRmaWxsY29sb3IubWluQXJncz0wLGUuJGZpbGxjb2xvci5yZXR1cm5UeXBlPXguQ09MT1IsZS4kY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/W3RoaXMuJHBlbmNvbG9yKCksdGhpcy4kZmlsbGNvbG9yKCldOih2b2lkIDA9PT10fHx2b2lkIDAhPT1yPyh0aGlzLl9jb2xvcj1jcmVhdGVDb2xvcih0aGlzLl9jb2xvck1vZGUsZSx0LHIsbiksdGhpcy5fZmlsbD10aGlzLl9jb2xvcik6KHRoaXMuX2NvbG9yPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSxlKSx0aGlzLl9maWxsPWNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0KSksdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtjb2xvcjp0aGlzLl9jb2xvcixmaWxsOnRoaXMuX2ZpbGx9KSl9LGUuJGNvbG9yLm1pbkFyZ3M9MCxlLiRjb2xvci5jb192YXJuYW1lcz1bXFxcImNvbG9yXFxcIixcXFwiZmlsbFxcXCIsXFxcImJcXFwiLFxcXCJhXFxcIl0sZS4kY29sb3IucmV0dXJuVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3guQ09MT1IoZVswXSkseC5DT0xPUihlWzFdKV0pfSxlLiRmaWxsPWZ1bmN0aW9uKGUpe3RoaXM7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fZmlsbGluZzooZT0hIWUsZT09PXRoaXMuX2ZpbGxpbmcpP3ZvaWQgMDoodGhpcy5fZmlsbGluZz1lLGU/KHB1c2hVbmRvKHRoaXMpLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCwhMSx7ZmlsbGluZzohMCxmaWxsQnVmZmVyOlt7eDp0aGlzLl94LHk6dGhpcy5feX1dfSkpOihwdXNoVW5kbyh0aGlzKSx0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe3RoaXMuZmlsbEJ1ZmZlci5wdXNoKHRoaXMpLGRyYXdGaWxsLmNhbGwodGhpcyl9LCEwLHtmaWxsaW5nOiExLGZpbGxCdWZmZXI6dm9pZCAwfSkpKX0sZS4kZmlsbC5jb192YXJuYW1lcz1bXFxcImZsYWdcXFwiXSxlLiRmaWxsLm1pbkFyZ3M9MCxlLiRiZWdpbl9maWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZpbGwoITApfSxlLiRlbmRfZmlsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmaWxsKCExKX0sZS4kc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gcHVzaFVuZG8odGhpcyksdGhpcy5hZGRVcGRhdGUoZnVuY3Rpb24oKXtkcmF3VHVydGxlKHRoaXMsdGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdD1mdW5jdGlvbihlLHQsbixsLGkpe3JldHVybiBwdXNoVW5kbyh0aGlzKSxlPVNrLmJ1aWx0aW4uYXNudW0kKGUpLGU9XFxcIm51bWJlclxcXCI9PXR5cGVvZiBlP3IoMSwwfHMoZSkpOnIodGhpcy5fc2l6ZSs0LDIqdGhpcy5fc2l6ZSksdD12b2lkIDA9PT10P3RoaXMuX2NvbG9yOmNyZWF0ZUNvbG9yKHRoaXMuX2NvbG9yTW9kZSx0LG4sbCxpKSx0aGlzLmFkZFVwZGF0ZShkcmF3RG90LCEwLHZvaWQgMCxlLHQpfSxlLiRkb3QuY29fdmFybmFtZXM9W1xcXCJzaXplXFxcIixcXFwiY29sb3JcXFwiLFxcXCJnXFxcIixcXFwiYlxcXCIsXFxcImFcXFwiXSxlLiR3cml0ZT1mdW5jdGlvbihlLHQscixuKXt2YXIgYSxzLGwsaSxvLGQ9dGhpcztyZXR1cm4gcHVzaFVuZG8odGhpcyksZSs9XFxcIlxcXCIsbiYmbi5jb25zdHJ1Y3Rvcj09PUFycmF5JiYocz1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMF0/blswXTpcXFwiQXJpYWxcXFwiLGw9KG5bMV18fFxcXCIxMnB0XFxcIikrXFxcIlxcXCIsaT1cXFwic3RyaW5nXFxcIj09dHlwZW9mIG5bMl0/blsyXTpcXFwibm9ybWFsXFxcIiwvXlxcXFxkKyQvLnRlc3QobCkmJihsKz1cXFwicHRcXFwiKSxuPVtpLGwsc10uam9pbihcXFwiIFxcXCIpKSxyfHwocj1cXFwibGVmdFxcXCIpLGE9dGhpcy5hZGRVcGRhdGUoZHJhd1RleHQsITAsdm9pZCAwLGUscixuKSx0JiYoXFxcImxlZnRcXFwiPT09cnx8XFxcImNlbnRlclxcXCI9PT1yKSYmKG89bWVhc3VyZVRleHQoZSxuKSxcXFwiY2VudGVyXFxcIj09PXImJihvLz0yKSxhPWEudGhlbihmdW5jdGlvbigpe3ZhciBlPWQuZ2V0U3RhdGUoKTtyZXR1cm4gZC50cmFuc2xhdGUoZS54LGUueSxvLDAsITApfSkpLGF9LGUuJHdyaXRlLmNvX3Zhcm5hbWVzPVtcXFwibWVzc2FnZVxcXCIsXFxcIm1vdmVcXFwiLFxcXCJhbGlnblxcXCIsXFxcImZvbnRcXFwiXSxlLiR3cml0ZS5taW5BcmdzPTEsZS4kcGVuc2l6ZT1lLiR3aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9zaXplOih0aGlzLl9zaXplPWUsdGhpcy5hZGRVcGRhdGUodm9pZCAwLHRoaXMuX3Nob3duLHtzaXplOmV9KSl9LGUuJHBlbnNpemUubWluQXJncz1lLiR3aWR0aC5taW5BcmdzPTAsZS4kcGVuc2l6ZS5jb192YXJuYW1lcz1lLiR3aWR0aC5jb192YXJuYW1lcz1bXFxcIndpZHRoXFxcIl0sZS4kc2hvd3R1cnRsZT1lLiRzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93bj0hMCx0aGlzLmFkZFVwZGF0ZSh2b2lkIDAsITAse3Nob3duOiEwfSl9LGUuJGhpZGV0dXJ0bGU9ZS4kaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd249ITEsdGhpcy5hZGRVcGRhdGUodm9pZCAwLCEwLHtzaG93bjohMX0pfSxlLiRpc3Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hvd259LGUuJHNoYXBlPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZ2W2VdPyh0aGlzLl9zaGFwZT1lLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7c2hhcGU6ZX0pKTp0aGlzLl9zaGFwZX0sZS4kc2hhcGUubWluQXJncz0wLGUuJHNoYXBlLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGNvbG9ybW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT90aGlzLl9jb2xvck1vZGU6KHRoaXMuX2NvbG9yTW9kZT0yNTU9PT1lPzI1NToxLHRoaXMuYWRkVXBkYXRlKHZvaWQgMCx0aGlzLl9zaG93bix7Y29sb3JNb2RlOnRoaXMuX2NvbG9yTW9kZX0pKX0sZS4kY29sb3Jtb2RlLm1pbkFyZ3M9MCxlLiRjb2xvcm1vZGUuY29fdmFybmFtZXM9W1xcXCJjbW9kZVxcXCJdLGUuJGNvbG9ybW9kZS5yZXR1cm5UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiAyNTU9PT1lP25ldyBTay5idWlsdGluLmludF8oMjU1KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oMSl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY3JlZW4uJHdpbmRvd193aWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kd2luZG93X2hlaWdodCgpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR0cmFjZXIoZSx0KX0sZS4kdHJhY2VyLm1pbkFyZ3M9MCxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJuXFxcIixcXFwiZGVsYXlcXFwiXSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiR1cGRhdGUoKX0sZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NjcmVlbi4kZGVsYXkoZSl9LGUuJGRlbGF5Lm1pbkFyZ3M9MCxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS4kcmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXNldCgpLHRoaXMuJGNsZWFyKCl9LGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NyZWVuLiRtYWlubG9vcCgpfSxlLiRjbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZFVwZGF0ZShmdW5jdGlvbigpe2NsZWFyTGF5ZXIodGhpcy5jb250ZXh0KCkpfSwhMCl9LGUuJGRvdC5taW5BcmdzPTAsZS4kb25jbGljaz1mdW5jdGlvbihlLHQscil7dGhpcy5nZXRNYW5hZ2VyKFxcXCJtb3VzZWRvd25cXFwiKS5hZGRIYW5kbGVyKGUscil9LGUuJG9uY2xpY2subWluQXJncz0xLGUuJG9uY2xpY2suY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbnJlbGVhc2U9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2V1cFxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25yZWxlYXNlLm1pbkFyZ3M9MSxlLiRvbnJlbGVhc2UuY29fdmFybmFtZXM9W1xcXCJtZXRob2RcXFwiLFxcXCJidG5cXFwiLFxcXCJhZGRcXFwiXSxlLiRvbmRyYWc9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuZ2V0TWFuYWdlcihcXFwibW91c2Vtb3ZlXFxcIikuYWRkSGFuZGxlcihlLHIpfSxlLiRvbmRyYWcubWluQXJncz0xLGUuJG9uZHJhZy5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJGdldHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoeS5TY3JlZW4pfSxlLiRnZXRzY3JlZW4uaXNTaz0hMCxlLiRjbG9uZT1mdW5jdGlvbigpe3ZhciBlPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh5LlR1cnRsZSk7cmV0dXJuIGUuaW5zdGFuY2UuX3g9dGhpcy5feCxlLmluc3RhbmNlLl95PXRoaXMuX3ksZS5pbnN0YW5jZS5fYW5nbGU9dGhpcy5fYW5nbGUsZS5pbnN0YW5jZS5fcmFkaWFucz10aGlzLl9yYWRpYW5zLGUuaW5zdGFuY2UuX3NoYXBlPXRoaXMuX3NoYXBlLGUuaW5zdGFuY2UuX2NvbG9yPXRoaXMuX2NvbG9yLGUuaW5zdGFuY2UuX2ZpbGw9dGhpcy5fZmlsbCxlLmluc3RhbmNlLl9maWxsaW5nPXRoaXMuX2ZpbGxpbmcsZS5pbnN0YW5jZS5fc2l6ZT10aGlzLl9zaXplLGUuaW5zdGFuY2UuX2NvbXB1dGVkX3NwZWVkPXRoaXMuX2NvbXB1dGVkX3NwZWVkLGUuaW5zdGFuY2UuX2Rvd249dGhpcy5fZG93bixlLmluc3RhbmNlLl9zaG93bj10aGlzLl9zaG93bixlLmluc3RhbmNlLl9jb2xvck1vZGU9dGhpcy5fY29sb3JNb2RlLGUuaW5zdGFuY2UuX2lzUmFkaWFucz10aGlzLl9pc1JhZGlhbnMsZS5pbnN0YW5jZS5fZnVsbENpcmNsZT10aGlzLl9mdWxsQ2lyY2xlLGUuaW5zdGFuY2UuX2J1ZmZlclNpemU9dGhpcy5fYnVmZmVyU2l6ZSxlLmluc3RhbmNlLl91bmRvQnVmZmVyPXRoaXMuX3VuZG9CdWZmZXIsZS5fY2xvbmVkRnJvbT10aGlzLGV9LGUuJGNsb25lLnJldHVyblR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGUuJGdldHR1cnRsZT1lLiRnZXRwZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5za0luc3RhbmNlfSxlLiRnZXR0dXJ0bGUuaXNTaz0hMH0oVHVydGxlLnByb3RvdHlwZSksZnVuY3Rpb24oZSl7ZS5zcHJpdGVMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcHJpdGVzfHwodGhpcy5fc3ByaXRlcz1jcmVhdGVMYXllcigzKSl9LGUuYmdMYXllcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kfHwodGhpcy5fYmFja2dyb3VuZD1jcmVhdGVMYXllcigxKSl9LGUuaGl0VGVzdExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpdFRlc3R8fCh0aGlzLl9oaXRUZXN0PWNyZWF0ZUxheWVyKDAsITApKX0sZS5nZXRNYW5hZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYW5hZ2Vyc1tlXXx8KHRoaXMuX21hbmFnZXJzW2VdPW5ldyBFdmVudE1hbmFnZXIoZSx0aGlzKSksdGhpcy5fbWFuYWdlcnNbZV19LGUucmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5fa2V5TGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9rZXlMb2dnZXIpd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fa2V5TG9nZ2VyW2VdKSx3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2tleUxvZ2dlcltlXSksZGVsZXRlIHRoaXMuX2tleUxvZ2dlcltlXTtmb3IoZSBpbiB0aGlzLl9rZXlEb3duTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXlkb3duXFxcIix0aGlzLl9rZXlEb3duTGlzdGVuZXIpLHRoaXMuX2tleURvd25MaXN0ZW5lcj12b2lkIDApLHRoaXMuX2tleVVwTGlzdGVuZXImJihnZXRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lciksdGhpcy5fa2V5VXBMaXN0ZW5lcj12b2lkIDApLHRoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9dm9pZCAwKSx0aGlzLl9tYW5hZ2Vycyl0aGlzLl9tYW5hZ2Vyc1tlXS5yZXNldCgpO3RoaXMuX21vZGU9XFxcInN0YW5kYXJkXFxcIixyZW1vdmVMYXllcih0aGlzLl9zcHJpdGVzKSx0aGlzLl9zcHJpdGVzPXZvaWQgMCxyZW1vdmVMYXllcih0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLl9iYWNrZ3JvdW5kPXZvaWQgMH0sZS5zZXRVcFdvcmxkPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBsPXRoaXM7bC5sbHg9ZSxsLmxseT10LGwudXJ4PXIsbC51cnk9bixsLnhTY2FsZT0oci1lKS9nZXRXaWR0aCgpLGwueVNjYWxlPS0xKihuLXQpL2dldEhlaWdodCgpLGwubGluZVNjYWxlPWEocyhsLnhTY2FsZSkscyhsLnlTY2FsZSkpfSxlLiRzZXR1cD1mdW5jdGlvbihlLHQscixuKXtyZXR1cm4gaXNOYU4ocGFyc2VGbG9hdChlKSkmJihlPWdldFdpZHRoKCkpLGlzTmFOKHBhcnNlRmxvYXQodCkpJiYodD1nZXRIZWlnaHQoKSksMT49ZSYmKGU9Z2V0V2lkdGgoKSplKSwxPj10JiYodD1nZXRIZWlnaHQoKSp0KSx0aGlzLl93aWR0aD1lLHRoaXMuX2hlaWdodD10LHRoaXMuX3hPZmZzZXQ9dm9pZCAwPT09cnx8aXNOYU4ocGFyc2VJbnQocikpPzA6cGFyc2VJbnQociksdGhpcy5feU9mZnNldD12b2lkIDA9PT1ufHxpc05hTihwYXJzZUludChuKSk/MDpwYXJzZUludChuKSxcXFwid29ybGRcXFwiPT09dGhpcy5fbW9kZT90aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKHRoaXMubGx4LHRoaXMubGx5LHRoaXMudXJ4LHRoaXMudXJ5KTp0aGlzLl9zZXR3b3JsZGNvb3JkaW5hdGVzKC1lLzIsLXQvMixlLzIsdC8yKX0sZS4kc2V0dXAubWluQXJncz0wLGUuJHNldHVwLmNvX3Zhcm5hbWVzPVtcXFwid2lkdGhcXFwiLFxcXCJoZWlnaHRcXFwiLFxcXCJzdGFydHhcXFwiLFxcXCJzdGFydHlcXFwiXSxlLiRyZWdpc3Rlcl9zaGFwZT1lLiRhZGRzaGFwZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P3ZvaWQodltlXT10KTpnZXRBc3NldChlKS50aGVuKGZ1bmN0aW9uKHQpe3ZbZV09dH0pfSxlLiRyZWdpc3Rlcl9zaGFwZS5taW5BcmdzPTEsZS4kZ2V0c2hhcGVzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHYpfSxlLiR0cmFjZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZXx8dm9pZCAwIT09dD8oXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fZGVsYXk9dCxnZXRGcmFtZU1hbmFnZXIoKS5yZWZyZXNoSW50ZXJ2YWwodCkpLFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZT8odGhpcy5fZnJhbWVzPWUsZ2V0RnJhbWVNYW5hZ2VyKCkuZnJhbWVCdWZmZXIoZSkpOnZvaWQgMCk6dGhpcy5fZnJhbWVzfSxlLiR0cmFjZXIuY29fdmFybmFtZXM9W1xcXCJmcmFtZXNcXFwiLFxcXCJkZWxheVxcXCJdLGUuJHRyYWNlci5taW5BcmdzPTAsZS4kZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwPT09dGhpcy5fZGVsYXk/Yjp0aGlzLl9kZWxheTp0aGlzLiR0cmFjZXIodm9pZCAwLGUpfSxlLiRkZWxheS5jb192YXJuYW1lcz1bXFxcImRlbGF5XFxcIl0sZS5fc2V0d29ybGRjb29yZGluYXRlcz1mdW5jdGlvbihlLHQscixuKXt2YXIgYT10aGlzLHM9Z2V0RnJhbWVNYW5hZ2VyKCkudHVydGxlcygpO3JldHVybiB0aGlzLnNldFVwV29ybGQoZSx0LHIsbiksdGhpcy5fc3ByaXRlcyYmYXBwbHlXb3JsZCh0aGlzLHRoaXMuX3Nwcml0ZXMpLHRoaXMuX2JhY2tncm91bmQmJmFwcGx5V29ybGQodGhpcyx0aGlzLl9iYWNrZ3JvdW5kKSx0aGlzLiRjbGVhcigpfSxlLiRzZXR3b3JsZGNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiB0aGlzLl9tb2RlPVxcXCJ3b3JsZFxcXCIsdGhpcy5fc2V0d29ybGRjb29yZGluYXRlcyhlLHQscixuKX0sZS4kc2V0d29ybGRjb29yZGluYXRlcy5jb192YXJuYW1lcz1bXFxcImxseFxcXCIsXFxcImxseVxcXCIsXFxcInVyeFxcXCIsXFxcInVyeVxcXCJdLGUubWluQXJncz00LGUuJGNsZWFyPWUuJGNsZWFyc2NyZWVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzZXQoKSx0aGlzLiRyZXNldCgpfSxlLiR1cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkudXBkYXRlKCl9LGUuJHJlc2V0PWUuJHJlc2V0c2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWdldEZyYW1lTWFuYWdlcigpLnR1cnRsZXMoKTtyZXR1cm4gZ2V0RnJhbWVNYW5hZ2VyKCkuYWRkRnJhbWUoZnVuY3Rpb24oKXthcHBseVdvcmxkKGUsZS5fc3ByaXRlcyksYXBwbHlXb3JsZChlLGUuX2JhY2tncm91bmQpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXRbcl0ucmVzZXQoKSxhcHBseVdvcmxkKGUsdFtyXS5fcGFwZXIpfSwhMCl9LGUuJHdpbmRvd193aWR0aD1mdW5jdGlvbigpe3JldHVybiBnZXRXaWR0aCgpfSxlLiR3aW5kb3dfaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGdldEhlaWdodCgpfSxlLiRkZWxheS5taW5BcmdzPTAsZS4kdHVydGxlcz1mdW5jdGlvbigpe3JldHVybiBnZXRGcmFtZU1hbmFnZXIoKS50dXJ0bGVzKCl9LGUuJHR1cnRsZXMucmV0dXJuVHlwZT14LlRVUlRMRV9MSVNULGUuJGJncGljPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlPyh0PXRoaXMsZ2V0QXNzZXQoZSkudGhlbihmdW5jdGlvbihlKXtjbGVhckxheWVyKHQuYmdMYXllcigpLHZvaWQgMCxlKX0pKTp0aGlzLl9iZ3BpY30sZS4kYmdwaWMubWluQXJncz0wLGUuJGJncGljLmNvX3Zhcm5hbWVzPVtcXFwibmFtZVxcXCJdLGUuJGJnY29sb3I9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHZvaWQgMD09PWU/aGV4VG9SR0IodGhpcy5fYmdjb2xvcik6KHRoaXMuX2JnY29sb3I9Y3JlYXRlQ29sb3IodGhpcy5fY29sb3JNb2RlLGUsdCxyLG4pLHZvaWQgY2xlYXJMYXllcih0aGlzLmJnTGF5ZXIoKSx0aGlzLl9iZ2NvbG9yKSl9LGUuJGJnY29sb3IubWluQXJncz0wLGUuJGJnY29sb3IuY29fdmFybmFtZXM9W1xcXCJjb2xvclxcXCIsXFxcImdcXFwiLFxcXCJiXFxcIixcXFwiYVxcXCJdLGUuJGJnY29sb3IucmV0dXJuVHlwZT14LkNPTE9SLGUuJG1haW5sb29wPWUuJGRvbmU9ZnVuY3Rpb24oKXt9LGUuJGJ5ZT1mdW5jdGlvbigpe3JldHVybiBTay5UdXJ0bGVHcmFwaGljcy5yZXNldCgpfSxlLiRleGl0b25jbGljaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leGl0T25DbGljaz0hMCx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZnVuY3Rpb24oKXtyZXNldFR1cnRsZSgpfSwhMSl9LGUuJG9uY2xpY2s9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2V4aXRPbkNsaWNrfHx0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25jbGljay5taW5BcmdzPTEsZS4kb25jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdO3ZhciB0PXs4Oi9eYmFjayhzcGFjZSk/JC9pLDk6L150YWIkL2ksMTM6L14oZW50ZXJ8cmV0dXJuKSQvaSwxNjovXnNoaWZ0JC9pLDE3Oi9eKGN0cmx8Y29udHJvbCkkL2ksMTg6L15hbHQkL2ksMjc6L15lc2MoYXBlKT8kL2ksMzI6L15zcGFjZSQvaSwzMzovXnBhZ2VbXFxcXHNcXFxcLV0/dXAkL2ksMzQ6L15wYWdlW1xcXFxzXFxcXC1dP2Rvd24kL2ksMzU6L15lbmQkL2ksMzY6L15ob21lJC9pLDM3Oi9ebGVmdChbXFxcXHNcXFxcLV0/YXJyb3cpPyQvaSwzODovXnVwKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDM5Oi9ecmlnaHQoW1xcXFxzXFxcXC1dP2Fycm93KT8kL2ksNDA6L15kb3duKFtcXFxcc1xcXFwtXT9hcnJvdyk/JC9pLDQ1Oi9eaW5zZXJ0JC9pLDQ2Oi9eZGVsKGV0ZSk/JC9pfTtlLl9jcmVhdGVLZXlSZXBlYXRlcj1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7ci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fa2V5TGlzdGVuZXJzW2VdKCksci5fa2V5TG9nZ2VyW3RdPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3IuX2tleUxpc3RlbmVyc1tlXSgpfSw1MCl9LDMzMyl9LGUuX2NyZWF0ZUtleURvd25MaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciByPXRoaXM7dGhpcy5fa2V5RG93bkxpc3RlbmVyfHwodGhpcy5fa2V5RG93bkxpc3RlbmVyPWZ1bmN0aW9uKG4pe3ZhciBlPVN0cmluZy5mcm9tQ2hhckNvZGU7aWYoZm9jdXNUdXJ0bGUoKSl7dmFyIGEscyxsPW4uY2hhckNvZGV8fG4ua2V5Q29kZSxpPWUobCkudG9Mb3dlckNhc2UoKTtpZighci5fa2V5TG9nZ2VyW2xdKWZvcihhIGluIHIuX2tleUxpc3RlbmVycylpZihzPTE8YS5sZW5ndGgmJnRbbF0mJnRbbF0udGVzdChhKSxhPT09aXx8cyl7ci5fa2V5TGlzdGVuZXJzW2FdKCksci5fY3JlYXRlS2V5UmVwZWF0ZXIoYSxsKSxuLnByZXZlbnREZWZhdWx0KCk7YnJlYWt9fX0sZ2V0VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcihcXFwia2V5ZG93blxcXCIsdGhpcy5fa2V5RG93bkxpc3RlbmVyKSl9LGUuX2NyZWF0ZUtleVVwTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2tleVVwTGlzdGVuZXJ8fCh0aGlzLl9rZXlVcExpc3RlbmVyPWZ1bmN0aW9uKHIpe3ZhciBlPXQuX2tleUxvZ2dlcltyLmNoYXJDb2RlfHxyLmtleUNvZGVdO3ZvaWQgMCE9PWUmJihyLnByZXZlbnREZWZhdWx0KCksd2luZG93LmNsZWFySW50ZXJ2YWwoZSksd2luZG93LmNsZWFyVGltZW91dChlKSxkZWxldGUgdC5fa2V5TG9nZ2VyW3IuY2hhckNvZGV8fHIua2V5Q29kZV0pfSxnZXRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKFxcXCJrZXl1cFxcXCIsdGhpcy5fa2V5VXBMaXN0ZW5lcikpfSxlLiRsaXN0ZW49ZnVuY3Rpb24oKXt0aGlzLl9jcmVhdGVLZXlVcExpc3RlbmVyKCksdGhpcy5fY3JlYXRlS2V5RG93bkxpc3RlbmVyKCl9LGUuJG9ua2V5PWZ1bmN0aW9uKGUsdCl7aWYoXFxcImZ1bmN0aW9uXFxcIj09dHlwZW9mIHQpe3ZhciByPWU7ZT10LHQ9cn10PSh0K1xcXCJcXFwiKS50b0xvd2VyQ2FzZSgpLGUmJlxcXCJmdW5jdGlvblxcXCI9PXR5cGVvZiBlPyghdGhpcy5fa2V5TGlzdGVuZXJzJiYodGhpcy5fa2V5TGlzdGVuZXJzPXt9KSx0aGlzLl9rZXlMaXN0ZW5lcnNbdF09ZSk6ZGVsZXRlIHRoaXMuX2tleUxpc3RlbmVyc1t0XX0sZS4kb25rZXkubWluQXJncz0yLGUuJG9ua2V5LmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwia2V5VmFsdWVcXFwiXSxlLiRvbnNjcmVlbmNsaWNrPWZ1bmN0aW9uKGUsdCxyKXt0aGlzLmdldE1hbmFnZXIoXFxcIm1vdXNlZG93blxcXCIpLmFkZEhhbmRsZXIoZSxyKX0sZS4kb25zY3JlZW5jbGljay5taW5BcmdzPTEsZS4kb25zY3JlZW5jbGljay5jb192YXJuYW1lcz1bXFxcIm1ldGhvZFxcXCIsXFxcImJ0blxcXCIsXFxcImFkZFxcXCJdLGUuJG9udGltZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPXZvaWQgMCksZSYmXFxcIm51bWJlclxcXCI9PXR5cGVvZiB0JiYodGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoZSxyKDAsMHx0KSkpfSxlLiRvbnRpbWVyLm1pbkFyZ3M9MCxlLiRvbnRpbWVyLmNvX3Zhcm5hbWVzPVtcXFwibWV0aG9kXFxcIixcXFwiaW50ZXJ2YWxcXFwiXX0oU2NyZWVuLnByb3RvdHlwZSk7dmFyIEw9bmV3IEltYWdlLFM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwiY2FudmFzXFxcIikuZ2V0Q29udGV4dChcXFwiMmRcXFwiKTtmb3IodmFyIEMgaW4gaW5pdFR1cnRsZS5jb192YXJuYW1lcz1bXFxcInNlbGZcXFwiLFxcXCJzaGFwZVxcXCJdLGluaXRUdXJ0bGUuY29fbmFtZT1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIlR1cnRsZVxcXCIpLGluaXRUdXJ0bGUuY29fYXJnY291bnQ9Mixpbml0VHVydGxlLiRkZWZhdWx0cz1bU2suYnVpbHRpbi5ub25lLm5vbmUkLG5ldyBTay5idWlsdGluLnN0cihcXFwiY2xhc3NpY1xcXCIpXSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KEMpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHksQyxlbnN1cmVBbm9ueW1vdXMpO3JldHVybiBhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRtYWlubG9vcFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiRkb25lXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGJ5ZVxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR0cmFjZXJcXFwiLGdldFNjcmVlbiksYWRkTW9kdWxlTWV0aG9kKFNjcmVlbix5LFxcXCIkdXBkYXRlXFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJGRlbGF5XFxcIixnZXRTY3JlZW4pLGFkZE1vZHVsZU1ldGhvZChTY3JlZW4seSxcXFwiJHdpbmRvd193aWR0aFxcXCIsZ2V0U2NyZWVuKSxhZGRNb2R1bGVNZXRob2QoU2NyZWVuLHksXFxcIiR3aW5kb3dfaGVpZ2h0XFxcIixnZXRTY3JlZW4pLHkuVHVydGxlPVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoeSxmdW5jdGlvbiBUdXJ0bGVXcmFwcGVyKGUsdCl7Zm9yKHZhciByIGluIHQuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhpbml0VHVydGxlKSxUdXJ0bGUucHJvdG90eXBlKS9eXFxcXCRbYS16X10rLy50ZXN0KHIpJiZhZGRNb2R1bGVNZXRob2QoVHVydGxlLHQscil9LFxcXCJUdXJ0bGVcXFwiLFtdKSx5LlNjcmVlbj1Tay5taXNjZXZhbC5idWlsZENsYXNzKHksZnVuY3Rpb24gU2NyZWVuV3JhcHBlcihlLHQpe2Zvcih2YXIgciBpbiB0Ll9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oZSl7ZS5pbnN0YW5jZT1nZXRTY3JlZW4oKX0pLFNjcmVlbi5wcm90b3R5cGUpL15cXFxcJFthLXpfXSsvLnRlc3QocikmJmFkZE1vZHVsZU1ldGhvZChTY3JlZW4sdCxyKX0sXFxcIlNjcmVlblxcXCIsW10pLHtza01vZHVsZTp5LHJlc2V0OnJlc2V0VHVydGxlLHN0b3A6c3RvcFR1cnRsZSxmb2N1czpmb2N1c1R1cnRsZSxUdXJ0bGU6VHVydGxlLFNjcmVlbjpTY3JlZW59fShlKSxTay5UdXJ0bGVHcmFwaGljcy5tb2R1bGU9ZS50dXJ0bGVJbnN0YW5jZS5za01vZHVsZSxTay5UdXJ0bGVHcmFwaGljcy5yZXNldD1lLnR1cnRsZUluc3RhbmNlLnJlc2V0LFNrLlR1cnRsZUdyYXBoaWNzLnN0b3A9ZS50dXJ0bGVJbnN0YW5jZS5zdG9wLFNrLlR1cnRsZUdyYXBoaWNzLmZvY3VzPWUudHVydGxlSW5zdGFuY2UuZm9jdXMsU2suVHVydGxlR3JhcGhpY3MucmF3PXtUdXJ0bGU6ZS50dXJ0bGVJbnN0YW5jZS5UdXJ0bGUsU2NyZWVuOmUudHVydGxlSW5zdGFuY2UuU2NyZWVufSxlLnR1cnRsZUluc3RhbmNlLnNrTW9kdWxlfTtcIixcInNyYy9saWIvdHlwZXMucHlcIjpcIlxcXCJcXFwiXFxcIlxcblRoaXMgZmlsZSB3YXMgbW9kaWZpZWQgZnJvbSBDUHl0aG9uLlxcbkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCxcXG4yMDExLCAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBBbGwgUmlnaHRzIFJlc2VydmVkXFxuXFxcIlxcXCJcXFwiXFxuXFxcIlxcXCJcXFwiRGVmaW5lIG5hbWVzIGZvciBhbGwgdHlwZSBzeW1ib2xzIGtub3duIGluIHRoZSBzdGFuZGFyZCBpbnRlcnByZXRlci5cXG5UeXBlcyB0aGF0IGFyZSBwYXJ0IG9mIG9wdGlvbmFsIG1vZHVsZXMgKGUuZy4gYXJyYXkpIGFyZSBub3QgbGlzdGVkLlxcblxcXCJcXFwiXFxcIlxcbmltcG9ydCBzeXNcXG5cXG4jIEl0ZXJhdG9ycyBpbiBQeXRob24gYXJlbid0IGEgbWF0dGVyIG9mIHR5cGUgYnV0IG9mIHByb3RvY29sLiAgQSBsYXJnZVxcbiMgYW5kIGNoYW5naW5nIG51bWJlciBvZiBidWlsdGluIHR5cGVzIGltcGxlbWVudCAqc29tZSogZmxhdm9yIG9mXFxuIyBpdGVyYXRvci4gIERvbid0IGNoZWNrIHRoZSB0eXBlISAgVXNlIGhhc2F0dHIgdG8gY2hlY2sgZm9yIGJvdGhcXG4jIFxcXCJfX2l0ZXJfX1xcXCIgYW5kIFxcXCJuZXh0XFxcIiBhdHRyaWJ1dGVzIGluc3RlYWQuXFxuTWFwcGluZ1Byb3h5VHlwZSA9IHR5cGUodHlwZS5fX2RpY3RfXylcXG5XcmFwcGVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKG9iamVjdC5fX2luaXRfXylcXG5NZXRob2RXcmFwcGVyVHlwZSA9IHR5cGUob2JqZWN0KCkuX19zdHJfXylcXG5NZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoc3RyLmpvaW4pXFxuQ2xhc3NNZXRob2REZXNjcmlwdG9yVHlwZSA9IHR5cGUoZGljdC5fX2RpY3RfX1snZnJvbWtleXMnXSlcXG5cXG5Ob25lVHlwZSA9IHR5cGUoTm9uZSlcXG5UeXBlVHlwZSA9IHR5cGVcXG5PYmplY3RUeXBlID0gb2JqZWN0XFxuSW50VHlwZSA9IGludFxcbnRyeTpcXG4gICAgTG9uZ1R5cGUgPSBsb25nXFxuZXhjZXB0OiBwYXNzXFxuRmxvYXRUeXBlID0gZmxvYXRcXG5Cb29sZWFuVHlwZSA9IGJvb2xcXG50cnk6XFxuICAgIENvbXBsZXhUeXBlID0gY29tcGxleFxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIHBhc3NcXG5TdHJpbmdUeXBlID0gc3RyXFxuXFxuIyBTdHJpbmdUeXBlcyBpcyBhbHJlYWR5IG91dGRhdGVkLiAgSW5zdGVhZCBvZiB3cml0aW5nIFxcXCJ0eXBlKHgpIGluXFxuIyB0eXBlcy5TdHJpbmdUeXBlc1xcXCIsIHlvdSBzaG91bGQgdXNlIFxcXCJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpXFxcIi4gIEJ1dFxcbiMgd2Uga2VlcCBhcm91bmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yLlxcbnRyeTpcXG4gICAgVW5pY29kZVR5cGUgPSB1bmljb2RlXFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlKVxcbmV4Y2VwdCBOYW1lRXJyb3I6XFxuICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsKVxcblxcbkJ1ZmZlclR5cGUgPSBidWZmZXJcXG5cXG5UdXBsZVR5cGUgPSB0dXBsZVxcbkxpc3RUeXBlID0gbGlzdFxcbkRpY3RUeXBlID0gRGljdGlvbmFyeVR5cGUgPSBkaWN0XFxuXFxuZGVmIF9mKCk6IHBhc3NcXG5GdW5jdGlvblR5cGUgPSB0eXBlKF9mKVxcbkxhbWJkYVR5cGUgPSB0eXBlKGxhbWJkYTogTm9uZSkgICAgICAgICAjIFNhbWUgYXMgRnVuY3Rpb25UeXBlXFxuI0NvZGVUeXBlID0gdHlwZShfZi5mdW5jX2NvZGUpXFxuXFxuZGVmIF9nKCk6XFxuICAgIHlpZWxkIDFcXG5HZW5lcmF0b3JUeXBlID0gdHlwZShfZygpKVxcblxcbmNsYXNzIF9DOlxcbiAgICBkZWYgX20oc2VsZik6IHBhc3NcXG5DbGFzc1R5cGUgPSB0eXBlKF9DKVxcblVuYm91bmRNZXRob2RUeXBlID0gdHlwZShfQy5fbSkgICAgICAgICAjIFNhbWUgYXMgTWV0aG9kVHlwZVxcbl94ID0gX0MoKVxcbkluc3RhbmNlVHlwZSA9IHR5cGUoX3gpXFxuTWV0aG9kVHlwZSA9IHR5cGUoX3guX20pXFxuQnVpbHRpbkZ1bmN0aW9uVHlwZSA9IHR5cGUobGVuKVxcbkJ1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZVxcblxcbk1vZHVsZVR5cGUgPSB0eXBlKHN5cylcXG5GaWxlVHlwZSA9IGZpbGVcXG50cnk6XFxuICAgIFhSYW5nZVR5cGUgPSB4cmFuZ2VcXG5leGNlcHQgTmFtZUVycm9yOlxcbiAgICBwYXNzXFxuXFxuIyB0cnk6XFxuIyAgICAgcmFpc2UgVHlwZUVycm9yXFxuIyBleGNlcHQgVHlwZUVycm9yOlxcbiMgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl1cXG4jICAgICBUcmFjZWJhY2tUeXBlID0gdHlwZSh0YilcXG4jICAgICBGcmFtZVR5cGUgPSB0eXBlKHRiLnRiX2ZyYW1lKVxcbiMgICAgIGRlbCB0YlxcblxcblNsaWNlVHlwZSA9IHNsaWNlXFxuIyBFbGxpcHNpc1R5cGUgPSB0eXBlKEVsbGlwc2lzKVxcblxcbiMgRGljdFByb3h5VHlwZSA9IHR5cGUoVHlwZVR5cGUuX19kaWN0X18pXFxuTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZClcXG5cXG4jIEZvciBKeXRob24sIHRoZSBmb2xsb3dpbmcgdHdvIHR5cGVzIGFyZSBpZGVudGljYWxcXG4jIEdldFNldERlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19jb2RlKVxcbiMgTWVtYmVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2dsb2JhbHMpXFxuXFxuZGVsIHN5cywgX2YsIF9nLCBfQywgX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0XFxuX19hbGxfXyA9IGxpc3QobiBmb3IgbiBpbiBnbG9iYWxzKCkgaWYgbls6MV0gIT0gJ18nKVxcblwiLFwic3JjL2xpYi91bml0dGVzdC9fX2luaXRfXy5weVwiOlwiX19hdXRob3JfXyA9ICdibWlsbGVyJ1xcbicnJ1xcblRoaXMgaXMgdGhlIHN0YXJ0IG9mIHNvbWV0aGluZyB0aGF0IGJlaGF2ZXMgbGlrZVxcbnRoZSB1bml0dGVzdCBtb2R1bGUgZnJvbSBjcHl0aG9uLlxcblxcbicnJ1xcbmltcG9ydCByZVxcblxcbmNsYXNzIF9Bc3NlcnRSYWlzZXNDb250ZXh0KG9iamVjdCk6XFxuICAgIFxcXCJcXFwiXFxcIkEgY29udGV4dCBtYW5hZ2VyIHVzZWQgdG8gaW1wbGVtZW50IFRlc3RDYXNlLmFzc2VydFJhaXNlcyogbWV0aG9kcy5cXFwiXFxcIlxcXCJcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkLCB0ZXN0X2Nhc2UpOlxcbiAgICAgICAgc2VsZi50ZXN0X2Nhc2UgPSB0ZXN0X2Nhc2VcXG4gICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZFxcbiAgICAgICAgc2VsZi5leGNlcHRpb24gPSBOb25lXFxuXFxuICAgIGRlZiBfaXNfc3VidHlwZShzZWxmLCBleHBlY3RlZCwgYmFzZXR5cGUpOlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgdHVwbGUpOlxcbiAgICAgICAgICAgIHJldHVybiBhbGwoc2VsZi5faXNfc3VidHlwZShlLCBiYXNldHlwZSkgZm9yIGUgaW4gZXhwZWN0ZWQpXFxuICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShleHBlY3RlZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoZXhwZWN0ZWQsIGJhc2V0eXBlKVxcblxcbiAgICBkZWYgaGFuZGxlKHNlbGYsIGFyZ3MsIGt3YXJncyk6XFxuICAgICAgICBcXFwiXFxcIlxcXCJcXG4gICAgICAgIElmIGFyZ3MgaXMgZW1wdHksIGFzc2VydFJhaXNlcyBpcyBiZWluZyB1c2VkIGFzIGFcXG4gICAgICAgIGNvbnRleHQgbWFuYWdlciwgc28gcmV0dXJuIHNlbGYuXFxuICAgICAgICBJZiBhcmdzIGlzIG5vdCBlbXB0eSwgY2FsbCBhIGNhbGxhYmxlIHBhc3NpbmcgcG9zaXRpb25hbCBhbmQga2V5d29yZFxcbiAgICAgICAgYXJndW1lbnRzLlxcbiAgICAgICAgXFxcIlxcXCJcXFwiXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX3N1YnR5cGUoc2VsZi5leHBlY3RlZCwgQmFzZUV4Y2VwdGlvbik6XFxuICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXNzZXJ0UmFpc2VzKCkgYXJnIDEgbXVzdCBiZSBhbiBleGNlcHRpb24gdHlwZSBvciB0dXBsZSBvZiBleGNlcHRpb24gdHlwZXMnKVxcbiAgICAgICAgICAgIGlmIG5vdCBhcmdzOlxcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZlxcblxcbiAgICAgICAgICAgIGNhbGxhYmxlX29iaiA9IGFyZ3NbMF1cXG4gICAgICAgICAgICBhcmdzID0gYXJnc1sxOl1cXG4gICAgICAgICAgICB3aXRoIHNlbGY6XFxuICAgICAgICAgICAgICAgIGNhbGxhYmxlX29iaigqYXJncywgKiprd2FyZ3MpIFxcblxcbiAgICAgICAgZmluYWxseTpcXG4gICAgICAgICAgICAjIGJwby0yMzg5MDogbWFudWFsbHkgYnJlYWsgYSByZWZlcmVuY2UgY3ljbGVcXG4gICAgICAgICAgICBzZWxmID0gTm9uZVxcblxcbiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIHNlbGZcXG5cXG4gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKTpcXG4gICAgICAgIHJlcyA9IFRydWVcXG4gICAgICAgIGZlZWRiYWNrID0gXFxcIlxcXCJcXG4gICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjX3ZhbHVlXFxuICAgICAgICB0cnk6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IGV4Y190eXBlLl9fbmFtZV9fXFxuICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6XFxuICAgICAgICAgICAgYWN0X2V4YyA9IHN0cihleGNfdHlwZSlcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBleHBfZXhjID0gc2VsZi5leHBlY3RlZC5fX25hbWVfX1xcbiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOlxcbiAgICAgICAgICAgIGV4cF9leGMgPSBzdHIoc2VsZi5leHBlY3RlZClcXG5cXG4gICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJ7fSBub3QgcmFpc2VkXFxcIi5mb3JtYXQoZXhwX2V4YylcXG4gICAgICAgIGVsaWYgbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuZXhwZWN0ZWQpOlxcbiAgICAgICAgICAgIHJlcyA9IEZhbHNlXFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQge30gYnV0IGdvdCB7fVxcXCIuZm9ybWF0KGV4cF9leGMsIGFjdF9leGMpXFxuXFxuICAgICAgICBzZWxmLnRlc3RfY2FzZS5hcHBlbmRSZXN1bHQocmVzLCBhY3RfZXhjLCBleHBfZXhjLCBmZWVkYmFjaylcXG4gICAgICAgIHJldHVybiBUcnVlXFxuXFxuXFxuY2xhc3MgVGVzdENhc2Uob2JqZWN0KTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgc2VsZi5udW1QYXNzZWQgPSAwXFxuICAgICAgICBzZWxmLm51bUZhaWxlZCA9IDBcXG4gICAgICAgIHNlbGYuYXNzZXJ0UGFzc2VkID0gMFxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgPSAwXFxuICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IDFcXG4gICAgICAgIHNlbGYudGxpc3QgPSBbXVxcbiAgICAgICAgdGVzdE5hbWVzID0ge31cXG4gICAgICAgIGZvciBuYW1lIGluIGRpcihzZWxmKTpcXG4gICAgICAgICAgICBpZiBuYW1lWzo0XSA9PSAndGVzdCcgYW5kIG5hbWUgbm90IGluIHRlc3ROYW1lczpcXG4gICAgICAgICAgICAgICAgc2VsZi50bGlzdC5hcHBlbmQoZ2V0YXR0cihzZWxmLG5hbWUpKVxcbiAgICAgICAgICAgICAgICB0ZXN0TmFtZXNbbmFtZV09VHJ1ZVxcblxcbiAgICBkZWYgc2V0VXAoc2VsZik6XFxuICAgICAgICBwYXNzXFxuXFxuICAgIGRlZiB0ZWFyRG93bihzZWxmKTpcXG4gICAgICAgIHBhc3NcXG4gICAgXFxuICAgIGRlZiBjbGVhbk5hbWUoc2VsZixmdW5jTmFtZSk6XFxuICAgICAgICByZXR1cm4gZnVuY05hbWUuX19mdW5jX18uX19uYW1lX19cXG5cXG4gICAgZGVmIG1haW4oc2VsZik6XFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zaXR5ID4gMTpcXG4gICAgICAgICAgICAgICAgcHJpbnQoJ1J1bm5pbmcgJXMnICUgc2VsZi5jbGVhbk5hbWUoZnVuYykpXFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICBzZWxmLnNldFVwKClcXG4gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRQYXNzZWQgPSAwXFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkID0gMFxcbiAgICAgICAgICAgICAgICBmdW5jKClcXG4gICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpXFxuICAgICAgICAgICAgICAgIGlmIHNlbGYuYXNzZXJ0RmFpbGVkID09IDA6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICAgICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICAgICAgICAgICAgICBwcmludCgnVGVzdHMgZmFpbGVkIGluICVzICcgJSBzZWxmLmNsZWFuTmFtZShmdW5jKSlcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG4gICAgICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcbiAgICAgICAgICAgICAgICBwcmludCgnVGVzdCB0aHJldyBleGNlcHRpb24gaW4gJXMgKCVzKScgJSAoc2VsZi5jbGVhbk5hbWUoZnVuYyksIGUpKVxcbiAgICAgICAgc2VsZi5zaG93U3VtbWFyeSgpXFxuXFxuICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWw9PWV4cGVjdGVkXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsICxleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RFcXVhbChzZWxmLCBhY3R1YWwsIGV4cGVjdGVkLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhY3R1YWwgIT0gZXhwZWN0ZWRcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBlcXVhbCAlc1xcXCIgJSAoc3RyKGFjdHVhbCksc3RyKGV4cGVjdGVkKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYWN0dWFsLCBleHBlY3RlZCwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYseCwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYm9vbCh4KSBpcyBUcnVlXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBUcnVlXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIFRydWUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZix4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBub3QgYm9vbCh4KVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgRmFsc2VcXFwiICUgKHN0cih4KSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgeCwgRmFsc2UsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXMoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgaXMgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90KHNlbGYsYSxiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIGlzIG5vdCBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgdGhlIHNhbWUgb2JqZWN0IGFzICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgTm9uZVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgTm9uZVxcXCIgJSAoc3RyKHgpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCB4LCBOb25lLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydElzTm90Tm9uZShzZWxmLHgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IHggaXMgbm90IE5vbmVcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIG5vdCBiZSBOb25lXFxcIiAlIChzdHIoeCkpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHgsIE5vbmUsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SW4oc2VsZiwgYSwgYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBpbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnROb3RJbihzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIG5vdCBpbiBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgYmUgaW4gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gaXNpbnN0YW5jZShhLGIpXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSBhbiBpbnN0YW5jZSBvZiAlc1xcXCIgJSAoc3RyKGEpLCBzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gbm90IGlzaW5zdGFuY2UoYSxiKVxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gbm90IGJlIGFuIGluc3RhbmNlIG9mICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydFJlZ2V4KHNlbGYsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICBcXFwiXFxcIlxcXCJGYWlsIHRoZSB0ZXN0IHVubGVzcyB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXFxcIlxcXCJcXFwiXFxuICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogI2J5dGVzXFxuICAgICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX3JlZ2V4LCBcXFwiZXhwZWN0ZWRfcmVnZXggbXVzdCBub3QgYmUgZW1wdHkuXFxcIlxcbiAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4ID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleClcXG4gICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleC5zZWFyY2godGV4dCk6XFxuICAgICAgICAgICAgcmVzID0gRmFsc2VcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJSZWdleCBkaWRuJ3QgbWF0Y2g6ICVyIG5vdCBmb3VuZCBpbiAlclxcXCIgJSAoXFxuICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRfcmVnZXgpLCB0ZXh0KVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICByZXMgPSBUcnVlXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIHRleHQsIGV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdFJlZ2V4KHNlbGYsIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXgsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIFxcXCJcXFwiXFxcIkZhaWwgdGhlIHRlc3QgaWYgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLlxcXCJcXFwiXFxcIlxcbiAgICAgICAgaWYgaXNpbnN0YW5jZSh1bmV4cGVjdGVkX3JlZ2V4LCAoc3RyLCApKTogIyBieXRlc1xcbiAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXggPSByZS5jb21waWxlKHVuZXhwZWN0ZWRfcmVnZXgpXFxuICAgICAgICBtYXRjaCA9IHVuZXhwZWN0ZWRfcmVnZXguc2VhcmNoKHRleHQpXFxuICAgICAgICBpZiBtYXRjaDpcXG4gICAgICAgICAgICBmZWVkYmFjayA9ICdSZWdleCBtYXRjaGVkOiAlciBtYXRjaGVzICVyIGluICVyJyAlIChcXG4gICAgICAgICAgICAgICAgdGV4dFttYXRjaC5zdGFydCgpIDogbWF0Y2guZW5kKCldLFxcbiAgICAgICAgICAgICAgICByZXByKHVuZXhwZWN0ZWRfcmVnZXgpLFxcbiAgICAgICAgICAgICAgICB0ZXh0KVxcbiAgICAgICAgICAgICMgX2Zvcm1hdE1lc3NhZ2UgZW5zdXJlcyB0aGUgbG9uZ01lc3NhZ2Ugb3B0aW9uIGlzIHJlc3BlY3RlZFxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQobm90IGJvb2wobWF0Y2gpLCB0ZXh0LCB1bmV4cGVjdGVkX3JlZ2V4LCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBhYnMoYS1iKSA8PSBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSA9PSAwXFxuICAgICAgICBcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGVxdWFsICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydE5vdEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHBsYWNlcz03LCBmZWVkYmFjaz1cXFwiXFxcIiwgZGVsdGE9Tm9uZSk6XFxuXFxuICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZTpcXG4gICAgICAgICAgICByZXMgPSBub3QgKGEgPT0gYikgYW5kIGFicyhhIC0gYikgPiBkZWx0YVxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZTpcXG4gICAgICAgICAgICAgICAgcGxhY2VzID0gN1xcblxcbiAgICAgICAgICAgIHJlcyA9IHJvdW5kKGEtYiwgcGxhY2VzKSAhPSAwXFxuXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBub3QgZXF1YWwgJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0R3JlYXRlcihzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA+IGJcXG4gICAgICAgIGlmIG5vdCByZXMgYW5kIGZlZWRiYWNrID09IFxcXCJcXFwiOlxcbiAgICAgICAgICAgIGZlZWRiYWNrID0gXFxcIkV4cGVjdGVkICVzIHRvIGJlIGdyZWF0ZXIgdGhhbiAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZixhLGIsIGZlZWRiYWNrPVxcXCJcXFwiKTpcXG4gICAgICAgIHJlcyA9IGEgPj0gYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgPj0gJXNcXFwiICUgKHN0cihhKSxzdHIoYikpXFxuICAgICAgICBzZWxmLmFwcGVuZFJlc3VsdChyZXMsIGEsIGIsIGZlZWRiYWNrKVxcblxcbiAgICBkZWYgYXNzZXJ0TGVzcyhzZWxmLCBhLCBiLCBmZWVkYmFjaz1cXFwiXFxcIik6XFxuICAgICAgICByZXMgPSBhIDwgYlxcbiAgICAgICAgaWYgbm90IHJlcyBhbmQgZmVlZGJhY2sgPT0gXFxcIlxcXCI6XFxuICAgICAgICAgICAgZmVlZGJhY2sgPSBcXFwiRXhwZWN0ZWQgJXMgdG8gYmUgbGVzcyB0aGFuICVzXFxcIiAlIChzdHIoYSksc3RyKGIpKVxcbiAgICAgICAgc2VsZi5hcHBlbmRSZXN1bHQocmVzLCBhLCBiLCBmZWVkYmFjaylcXG5cXG4gICAgZGVmIGFzc2VydExlc3NFcXVhbChzZWxmLGEsYiwgZmVlZGJhY2s9XFxcIlxcXCIpOlxcbiAgICAgICAgcmVzID0gYSA8PSBiXFxuICAgICAgICBpZiBub3QgcmVzIGFuZCBmZWVkYmFjayA9PSBcXFwiXFxcIjpcXG4gICAgICAgICAgICBmZWVkYmFjayA9IFxcXCJFeHBlY3RlZCAlcyB0byBiZSA8PSAlc1xcXCIgJSAoc3RyKGEpLHN0cihiKSlcXG4gICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KHJlcywgYSwgYiwgZmVlZGJhY2spXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZixyZXMsYWN0dWFsLGV4cGVjdGVkLGZlZWRiYWNrKTpcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBtc2cgPSAnUGFzcydcXG4gICAgICAgICAgICBzZWxmLmFzc2VydFBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsOiAnICsgIGZlZWRiYWNrXFxuICAgICAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbGVkICs9IDFcXG5cXG4gICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLCBleHBlY3RlZF9leGNlcHRpb24sICphcmdzLCAqKmt3YXJncyk6XFxuICAgICAgICBjb250ZXh0ID0gX0Fzc2VydFJhaXNlc0NvbnRleHQoZXhwZWN0ZWRfZXhjZXB0aW9uLCBzZWxmKVxcbiAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmhhbmRsZShhcmdzLCBrd2FyZ3MpXFxuICAgICAgICBmaW5hbGx5OlxcbiAgICAgICAgICAgICMgYnBvLTIzODkwOiBtYW51YWxseSBicmVhayBhIHJlZmVyZW5jZSBjeWNsZVxcbiAgICAgICAgICAgIGNvbnRleHQgPSBOb25lXFxuXFxuICAgIGRlZiBmYWlsKHNlbGYsIG1zZz1Ob25lKTpcXG4gICAgICAgIGlmIG1zZyBpcyBOb25lOlxcbiAgICAgICAgICAgIG1zZyA9ICdGYWlsJ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBtc2cgPSAnRmFpbDogJyArIG1zZ1xcbiAgICAgICAgcHJpbnQobXNnKVxcbiAgICAgICAgc2VsZi5hc3NlcnRGYWlsZWQgKz0gMVxcblxcbiAgICBkZWYgc2hvd1N1bW1hcnkoc2VsZik6XFxuICAgICAgICBwY3QgPSBzZWxmLm51bVBhc3NlZCAvIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCkgKiAxMDBcXG4gICAgICAgIHByaW50KFxcXCJSYW4gJWQgdGVzdHMsIHBhc3NlZDogJWQgZmFpbGVkOiAlZFxcXFxuXFxcIiAlIChzZWxmLm51bVBhc3NlZCtzZWxmLm51bUZhaWxlZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubnVtUGFzc2VkLCBzZWxmLm51bUZhaWxlZCkpXFxuXFxuXFxuXFxuZGVmIG1haW4odmVyYm9zaXR5PTEpOlxcbiAgICBnbG9iID0gZ2xvYmFscygpICMgZ2xvYmFscygpIHN0aWxsIG5lZWRzIHdvcmtcXG4gICAgZm9yIG5hbWUgaW4gZ2xvYjpcXG4gICAgICAgIGlmIHR5cGUoZ2xvYltuYW1lXSkgPT0gdHlwZSBhbmQgaXNzdWJjbGFzcyhnbG9iW25hbWVdLCBUZXN0Q2FzZSk6XFxuICAgICAgICAgICAgdHJ5OlxcbiAgICAgICAgICAgICAgICB0YyA9IGdsb2JbbmFtZV0oKVxcbiAgICAgICAgICAgICAgICB0Yy52ZXJib3NpdHkgPSB2ZXJib3NpdHlcXG4gICAgICAgICAgICAgICAgdGMubWFpbigpXFxuICAgICAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgICAgICBwcmludChcXFwiVW5jYXVnaHQgRXJyb3IgaW46IFxcXCIsIG5hbWUpXFxuXCIsXCJzcmMvbGliL3VuaXR0ZXN0L2d1aS5weVwiOlwiaW1wb3J0IGRvY3VtZW50XFxuZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2VcXG5mcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuXFxuZnJvbSB0aW1lIGltcG9ydCBzbGVlcFxcblxcblxcbmNsYXNzIFRlc3RDYXNlR3VpKFRlc3RDYXNlKTpcXG4gICAgZGVmIF9faW5pdF9fKHNlbGYpOlxcbiAgICAgICAgVGVzdENhc2UuX19pbml0X18oc2VsZilcXG4gICAgICAgIHNlbGYuY2xvc2VzdERpdiA9IGRvY3VtZW50LmN1cnJlbnREaXYoKVxcbiAgICAgICAgc2VsZi5kaXZpZCA9IGRvY3VtZW50LmN1cnJlbnRHcmFkaW5nQ29udGFpbmVyKClcXG4gICAgICAgIHNlbGYubXlkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxmLmRpdmlkKVxcbiAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXYgdGhlbiBjcmVhdGUgYSBkdW1teSB0byBhdm9pZCBlcnJvcnMgd2hlbiBydW5uaW5nXFxuICAgICAgICAjIGdyYWRpbmcgXFxcIm9mZiBzY3JlZW5cXFwiXFxuICAgICAgICBpZiBzZWxmLm15ZGl2IGlzIE5vbmU6XFxuICAgICAgICAgICAgc2VsZi5teWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRBdHRyaWJ1dGUoXFxcImlkXFxcIiwgc2VsZi5kaXZpZCArIFxcXCJfb2Zmc2NyZWVuX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5teWRpdi5zZXRDU1MoXFxcImRpc3BsYXlcXFwiLCBcXFwibm9uZVxcXCIpXFxuICAgICAgICAgICAgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFxcXCJib2R5XFxcIilbMF1cXG4gICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKHNlbGYubXlkaXYpXFxuICAgICAgICAgICAgc2VsZi51bml0X3Jlc3VsdHNfZGl2aWQgPSBzZWxmLmRpdmlkICsgXFxcIl9vZmZzY3JlZW5fdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICAgICAgcmVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIilcXG4gICAgICAgIGlmIHJlczpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IHJlc1xcbiAgICAgICAgICAgIHJlcy5pbm5lckhUTUwgPSBcXFwiXFxcIlxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBzZWxmLnJlc2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcImRpdlxcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJpZFxcXCIsIHNlbGYuZGl2aWQgKyBcXFwiX3VuaXRfcmVzdWx0c1xcXCIpXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJ1bml0dGVzdC1yZXN1bHRzXFxcIilcXG4gICAgICAgICAgICBzZWxmLm15ZGl2LmFwcGVuZENoaWxkKHNlbGYucmVzZGl2KVxcbiAgICAgICAgICAgIHNlbGYudW5pdF9yZXN1bHRzX2RpdmlkID0gc2VsZi5kaXZpZCArIFxcXCJfdW5pdF9yZXN1bHRzXFxcIlxcblxcbiAgICBkZWYgbWFpbihzZWxmKTpcXG4gICAgICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0YWJsZVxcXCIpXFxuICAgICAgICBzZWxmLnJlc1RhYmxlID0gdFxcbiAgICAgICAgeCA9IHNlbGYucmVzZGl2LmNsb3Nlc3QoXFxcIi50aW1lZENvbXBvbmVudFxcXCIpXFxuICAgICAgICBpZiB4OlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBUcnVlXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIHNlbGYuaXNfdGltZWQgPSBGYWxzZVxcbiAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQoc2VsZi5yZXNUYWJsZSlcXG4gICAgICAgIGlmIHNlbGYuaXNfdGltZWQ6XFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuc2V0Q1NTKFxcXCJkaXNwbGF5XFxcIiwgXFxcIm5vbmVcXFwiKVxcblxcbiAgICAgICAgaGVhZGVycyA9IFtcXFwiUmVzdWx0XFxcIiwgXFxcIkFjdHVhbCBWYWx1ZVxcXCIsIFxcXCJFeHBlY3RlZCBWYWx1ZVxcXCIsIFxcXCJOb3Rlc1xcXCJdXFxuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0clxcXCIpXFxuICAgICAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOlxcbiAgICAgICAgICAgIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0aFxcXCIpXFxuICAgICAgICAgICAgaGVhZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGl0ZW1cXG4gICAgICAgICAgICBoZWFkLnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKVxcbiAgICAgICAgc2VsZi5yZXNUYWJsZS5hcHBlbmRDaGlsZChyb3cpXFxuXFxuICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRsaXN0OlxcbiAgICAgICAgICAgIHRyeTpcXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpXFxuICAgICAgICAgICAgICAgIGZ1bmMoKVxcbiAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKClcXG4gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6XFxuICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kUmVzdWx0KFxcXCJFcnJvclxcXCIsIE5vbmUsIE5vbmUsIHN0cihlKS5zcGxpdChcXFwib24gbGluZVxcXCIpWzBdKVxcbiAgICAgICAgICAgICAgICBzZWxmLm51bUZhaWxlZCArPSAxXFxuICAgICAgICBzZWxmLnNob3dTdW1tYXJ5KClcXG5cXG4gICAgZGVmIGdldE91dHB1dChzZWxmKTpcXG4gICAgICAgIHNsZWVwKDAuMilcXG4gICAgICAgICMgc2VsZi5kaXZpZCB3aWxsIGJlIHRoZSBncmFkaW5nV3JhcHBlciB3aGVuIGluIGdyYWRpbmcgbW9kZVxcbiAgICAgICAgaWYgc2VsZi5jbG9zZXN0RGl2ICE9IHNlbGYuZGl2aWQ6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXG4gICAgICAgICAgICAgICAgXFxcIiN7fSAje31fc3Rkb3V0XFxcIi5mb3JtYXQoc2VsZi5kaXZpZCwgc2VsZi5jbG9zZXN0RGl2KVxcbiAgICAgICAgICAgIClcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZi5kaXZpZCArIFxcXCJfc3Rkb3V0XFxcIilcXG4gICAgICAgIHJldHVybiBvdXRwdXQuaW5uZXJUZXh0XFxuXFxuICAgIGRlZiBnZXRFZGl0b3JUZXh0KHNlbGYpOlxcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEN1cnJlbnRFZGl0b3JWYWx1ZSgpXFxuXFxuICAgIGRlZiBhcHBlbmRSZXN1bHQoc2VsZiwgcmVzLCBhY3R1YWwsIGV4cGVjdGVkLCBwYXJhbSk6XFxuICAgICAgICB0cmltQWN0dWFsID0gRmFsc2VcXG4gICAgICAgIGlmIGxlbihzdHIoYWN0dWFsKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltQWN0dWFsID0gVHJ1ZVxcbiAgICAgICAgICAgIGFjdHVhbFR5cGUgPSB0eXBlKGFjdHVhbClcXG4gICAgICAgIHRyaW1FeHBlY3RlZCA9IEZhbHNlXFxuICAgICAgICBpZiBsZW4oc3RyKGV4cGVjdGVkKSkgPiAxNTpcXG4gICAgICAgICAgICB0cmltRXhwZWN0ZWQgPSBUcnVlXFxuICAgICAgICAgICAgZXhwZWN0ZWRUeXBlID0gdHlwZShleHBlY3RlZClcXG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRyXFxcIilcXG4gICAgICAgIGVyciA9IEZhbHNlXFxuICAgICAgICBpZiByZXMgPT0gXFxcIkVycm9yXFxcIjpcXG4gICAgICAgICAgICBlcnIgPSBUcnVlXFxuICAgICAgICAgICAgbXNnID0gXFxcIkVycm9yOiAlc1xcXCIgJSBwYXJhbVxcbiAgICAgICAgICAgIGVycm9yRGF0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuICAgICAgICAgICAgZXJyb3JEYXRhLmlubmVySFRNTCA9IFxcXCJFUlJPUlxcXCJcXG4gICAgICAgICAgICBlcnJvckRhdGEuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGVycm9yRGF0YS5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZXJyb3JEYXRhKVxcbiAgICAgICAgZWxpZiByZXM6XFxuICAgICAgICAgICAgcGFzc2VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgICAgIHBhc3NlZC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuaW5uZXJIVE1MID0gXFxcIlBhc3NcXFwiXFxuICAgICAgICAgICAgcGFzc2VkLnNldENTUyhcXFwiYmFja2dyb3VuZC1jb2xvclxcXCIsIFxcXCIjODNkMzgyXFxcIilcXG4gICAgICAgICAgICBwYXNzZWQuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHBhc3NlZClcXG4gICAgICAgICAgICBzZWxmLm51bVBhc3NlZCArPSAxXFxuICAgICAgICBlbHNlOlxcbiAgICAgICAgICAgIGZhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICAgICAgZmFpbC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG4gICAgICAgICAgICBmYWlsLmlubmVySFRNTCA9IFxcXCJGYWlsXFxcIlxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJiYWNrZ3JvdW5kLWNvbG9yXFxcIiwgXFxcIiNkZThlOTZcXFwiKVxcbiAgICAgICAgICAgIGZhaWwuc2V0Q1NTKFxcXCJ0ZXh0LWFsaWduXFxcIiwgXFxcImNlbnRlclxcXCIpXFxuICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGZhaWwpXFxuICAgICAgICAgICAgc2VsZi5udW1GYWlsZWQgKz0gMVxcblxcbiAgICAgICAgYWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwidGRcXFwiKVxcbiAgICAgICAgYWN0LnNldEF0dHJpYnV0ZShcXFwiY2xhc3NcXFwiLCBcXFwiYWMtZmVlZGJhY2tcXFwiKVxcbiAgICAgICAgaWYgdHJpbUFjdHVhbDpcXG4gICAgICAgICAgICBhY3RIVE1MID0gc3RyKGFjdHVhbClbOjVdICsgXFxcIi4uLlxcXCIgKyBzdHIoYWN0dWFsKVstNTpdXFxuICAgICAgICAgICAgaWYgYWN0dWFsVHlwZSA9PSBzdHI6XFxuICAgICAgICAgICAgICAgIGFjdEhUTUwgPSByZXByKGFjdEhUTUwpXFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IGFjdEhUTUxcXG4gICAgICAgIGVsc2U6XFxuICAgICAgICAgICAgYWN0LmlubmVySFRNTCA9IHJlcHIoYWN0dWFsKVxcbiAgICAgICAgYWN0LnNldENTUyhcXFwidGV4dC1hbGlnblxcXCIsIFxcXCJjZW50ZXJcXFwiKVxcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKGFjdClcXG5cXG4gICAgICAgIGV4cGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXFxcInRkXFxcIilcXG4gICAgICAgIGV4cGVjdC5zZXRBdHRyaWJ1dGUoXFxcImNsYXNzXFxcIiwgXFxcImFjLWZlZWRiYWNrXFxcIilcXG5cXG4gICAgICAgIGlmIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBlY3RlZEhUTUwgPSBzdHIoZXhwZWN0ZWQpWzo1XSArIFxcXCIuLi5cXFwiICsgc3RyKGV4cGVjdGVkKVstNTpdXFxuICAgICAgICAgICAgaWYgZXhwZWN0ZWRUeXBlID09IHN0cjpcXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRIVE1MID0gcmVwcihleHBlY3RlZEhUTUwpXFxuICAgICAgICAgICAgZXhwZWN0LmlubmVySFRNTCA9IGV4cGVjdGVkSFRNTFxcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBleHBlY3QuaW5uZXJIVE1MID0gcmVwcihleHBlY3RlZClcXG4gICAgICAgIGV4cGVjdC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBlY3QpXFxuICAgICAgICBpbnAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJ0ZFxcXCIpXFxuICAgICAgICBpbnAuc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJhYy1mZWVkYmFja1xcXCIpXFxuXFxuICAgICAgICBpZiBlcnI6XFxuICAgICAgICAgICAgaW5wLmlubmVySFRNTCA9IG1zZ1xcbiAgICAgICAgZWxzZTpcXG4gICAgICAgICAgICBpbnAuaW5uZXJIVE1MID0gcGFyYW1cXG4gICAgICAgIGlucC5zZXRDU1MoXFxcInRleHQtYWxpZ25cXFwiLCBcXFwiY2VudGVyXFxcIilcXG4gICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnApXFxuXFxuICAgICAgICBpZiB0cmltQWN0dWFsIG9yIHRyaW1FeHBlY3RlZDpcXG4gICAgICAgICAgICBleHBhbmRidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJidXR0b25cXFwiKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5pbm5lckhUTUwgPSBcXFwiRXhwYW5kIERpZmZlcmVuY2VzXFxcIlxcbiAgICAgICAgICAgIGV4cGFuZG1zZyA9IFxcXCJBY3R1YWw6IFxcXCIgKyBzdHIoYWN0dWFsKSArIFxcXCJcXFxcbkV4cGVjdGVkOiBcXFwiICsgc3RyKGV4cGVjdGVkKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInZhbHVlXFxcIiwgZXhwYW5kbXNnKVxcbiAgICAgICAgICAgIGV4cGFuZGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXFxcInR5cGVcXFwiLCBcXFwiYnV0dG9uXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJvbmNsaWNrXFxcIiwgXFxcImFsZXJ0KHRoaXMudmFsdWUpXFxcIilcXG4gICAgICAgICAgICBleHBhbmRidXR0b24uc2V0QXR0cmlidXRlKFxcXCJjbGFzc1xcXCIsIFxcXCJidG4gYnRuLWluZm9cXFwiKVxcbiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChleHBhbmRidXR0b24pXFxuXFxuICAgICAgICBzZWxmLnJlc1RhYmxlLmFwcGVuZENoaWxkKHJvdylcXG5cXG4gICAgZGVmIHNob3dTdW1tYXJ5KHNlbGYpOlxcbiAgICAgICAgcGN0ID0gZmxvYXQoc2VsZi5udW1QYXNzZWQpIC8gKHNlbGYubnVtUGFzc2VkICsgc2VsZi5udW1GYWlsZWQpICogMTAwXFxuICAgICAgICBwY3Rjb3JyZWN0ID0gKFxcbiAgICAgICAgICAgIFxcXCJwZXJjZW50OlxcXCJcXG4gICAgICAgICAgICArIHN0cihwY3QpXFxuICAgICAgICAgICAgKyBcXFwiOnBhc3NlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1QYXNzZWQpXFxuICAgICAgICAgICAgKyBcXFwiOmZhaWxlZDpcXFwiXFxuICAgICAgICAgICAgKyBzdHIoc2VsZi5udW1GYWlsZWQpXFxuICAgICAgICApXFxuICAgICAgICBwVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcXFwicFxcXCIpXFxuICAgICAgICBpZiBub3Qgc2VsZi5pc190aW1lZDpcXG4gICAgICAgICAgICBwVGFnLmlubmVySFRNTCA9IFxcXCJZb3UgcGFzc2VkOiBcXFwiICsgc3RyKHBjdCkgKyBcXFwiJSBvZiB0aGUgdGVzdHNcXFwiXFxuICAgICAgICAgICAgc2VsZi5yZXNkaXYuYXBwZW5kQ2hpbGQocFRhZylcXG4gICAgICAgIHRyeTpcXG4gICAgICAgICAgICBqc2V2YWwoXFxcIndpbmRvdy5lZExpc3RbJ3t9J10ucGN0X2NvcnJlY3QgPSB7fVxcXCIuZm9ybWF0KHNlbGYuY2xvc2VzdERpdiwgcGN0KSlcXG4gICAgICAgICAgICBqc2V2YWwoXFxuICAgICAgICAgICAgICAgIFxcXCJ3aW5kb3cuZWRMaXN0Wyd7fSddLnVuaXRfcmVzdWx0cyA9ICd7fSdcXFwiLmZvcm1hdChcXG4gICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VzdERpdiwgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcbiAgICAgICAgICAgIGpzZXZhbChcXG4gICAgICAgICAgICAgICAgXFxcIndpbmRvdy5lZExpc3RbJ3t9J10udW5pdF9yZXN1bHRzX2RpdmlkID0gJ3t9J1xcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZXN0RGl2LCBzZWxmLm15ZGl2LmdldEF0dHJpYnV0ZShcXFwiaWRcXFwiKVxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblxcbiAgICAgICAgZXhjZXB0OlxcbiAgICAgICAgICAgIHByaW50KFxcbiAgICAgICAgICAgICAgICBcXFwiZmFpbGVkIHRvIGZpbmQgb2JqZWN0IHRvIHJlY29yZCB1bml0dGVzdCByZXN1bHRzISB7fVxcXCIuZm9ybWF0KFxcbiAgICAgICAgICAgICAgICAgICAgcGN0Y29ycmVjdFxcbiAgICAgICAgICAgICAgICApXFxuICAgICAgICAgICAgKVxcblwiLFwic3JjL2xpYi91cmxsaWIvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3JldHVybnt9fTtcIixcInNyYy9saWIvdXJsbGliL3JlcXVlc3QvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9O2EuUmVzcG9uc2U9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS5kYXRhJD1iLnJlc3BvbnNlVGV4dCxhLmxpbmVMaXN0PWEuZGF0YSQuc3BsaXQoXFxcIlxcXFxuXFxcIiksYS5saW5lTGlzdD1hLmxpbmVMaXN0LnNsaWNlKDAsLTEpO2Zvcih2YXIgYz0wO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWEubGluZUxpc3RbY10rPVxcXCJcXFxcblxcXCI7YS5jdXJyZW50TGluZT0wLGEucG9zJD0wfSksYi5fX3N0cl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oKXtyZXR1cm4gU2suZmZpLnJlbWFwVG9QeShcXFwiPFJlc3BvbnNlPlxcXCIpfSksYi5fX2l0ZXJfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPWEubGluZUxpc3Q7cmV0dXJuIFNrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcihmdW5jdGlvbigpe3JldHVybiB0aGlzLiRpbmRleD49dGhpcy4kbGluZXMubGVuZ3RoP3ZvaWQgMDpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kbGluZXNbdGhpcy4kaW5kZXgrK10pfSx7JG9iajphLCRpbmRleDowLCRsaW5lczpifSl9KSxiLnJlYWQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2lmKGEuY2xvc2VkKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXFxcIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGVcXFwiKTt2YXIgYz1hLmRhdGEkLmxlbmd0aDt2b2lkIDA9PT1iJiYoYj1jKTt2YXIgZD1uZXcgU2suYnVpbHRpbi5zdHIoYS5kYXRhJC5zdWJzdHIoYS5wb3MkLGIpKTtyZXR1cm4gYS5wb3MkKz1iLGEucG9zJD49YyYmKGEucG9zJD1jKSxkfSksYi5yZWFkbGluZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3ZhciBiPVxcXCJcXFwiO3JldHVybiBhLmN1cnJlbnRMaW5lPGEubGluZUxpc3QubGVuZ3RoJiYoYj1hLmxpbmVMaXN0W2EuY3VycmVudExpbmVdLGEuY3VycmVudExpbmUrKyksbmV3IFNrLmJ1aWx0aW4uc3RyKGIpfSksYi5yZWFkbGluZXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9LFxcXCJSZXNwb25zZVxcXCIsW10pO3ZhciBiPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFTay5qc29ucFNpdGVzKXJldHVybiExO2ZvcihiPTA7YjxTay5qc29ucFNpdGVzLmxlbmd0aDtiKyspaWYoYS5zdGFydHNXaXRoKFNrLmpzb25wU2l0ZXNbYl0pKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4gYS51cmxvcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxkKXt2YXIgZT1iKGMudik/bmV3IFByb21pc2UoZnVuY3Rpb24oYixkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFxcXCJzY3JpcHRcXFwiKTtlLnNyYz1jLnYrXFxcIiZjYWxsYmFjaz1Tay5qc29ucGNhbGxiYWNrXFxcIixlLm9uZXJyb3I9ZnVuY3Rpb24oKXtkKFxcXCJBbiBlcnJvciBvY2N1cmVkIGdldHRpbmcgdGhlIGRhdGFcXFwiKX0sU2suanNvbnBjYWxsYmFjaz1mdW5jdGlvbihjKXt2YXIgZD17cmVzcG9uc2VUZXh0OkpTT04uc3RyaW5naWZ5KGMpfTtiKFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlJlc3BvbnNlLFtkXSkpfTt0cnl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKX1jYXRjaChhKXtjb25zb2xlLmxvZyhcXFwiY2F1Z2h0IGVycm9yIGluIHVybG9wZW5cXFwiK2EpfX0pOm5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe3ZhciBlPW5ldyBYTUxIdHRwUmVxdWVzdDtlLmFkZEV2ZW50TGlzdGVuZXIoXFxcImxvYWRlbmRcXFwiLGZ1bmN0aW9uKCl7YihTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5SZXNwb25zZSxbZV0pKX0pLGQ/KGUub3BlbihcXFwiUE9TVFxcXCIsYy52KSxlLnNldFJlcXVlc3RIZWFkZXIoXFxcIkNvbnRlbnQtdHlwZVxcXCIsXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXCIpLGUuc2VuZChkLnYpKTooZS5vcGVuKFxcXCJHRVRcXFwiLGMudiksZS5zZW5kKG51bGwpKX0pO3ZhciBmPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uO3JldHVybiBmLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiByZXNvbHV0aW9ufSxmLmRhdGE9e3R5cGU6XFxcIlNrLnByb21pc2VcXFwiLHByb21pc2U6ZS50aGVuKGZ1bmN0aW9uKGEpe3JldHVybiByZXNvbHV0aW9uPWEsYX0sZnVuY3Rpb24oYSl7cmV0dXJuIHJlc29sdXRpb249XFxcIlxcXCIsYX0pfSxmfSksYX07XCIsXCJzcmMvbGliL3VybGxpYjIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInVybGxpYjIgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91cmxwYXJzZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXJscGFyc2UgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi91c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ1c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInV1IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvdXVpZC5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwidXVpZCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhcm5pbmdzLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3YXJuaW5ncyBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3dhdmUucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcIndhdmUgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi93ZWFrcmVmLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWFrcmVmIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViYnJvd3Nlci5qc1wiOlwidmFyICRidWlsdGlubW9kdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb3Blbl90YWIoYSl7cmV0dXJuKFNrLmJ1aWx0aW4ucHlDaGVja1R5cGUoXFxcInVybFxcXCIsXFxcInN0cmluZ1xcXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSksIWIpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6KGE9YS4kanNzdHIoKSx3aW5kb3cub3BlbihhLFxcXCJfYmxhbmtcXFwiKSxTay5idWlsdGluLmJvb2wudHJ1ZSQpfXZhciBhPXt9LGI9XFxcInVuZGVmaW5lZFxcXCIhPXR5cGVvZiB3aW5kb3cmJlxcXCJ1bmRlZmluZWRcXFwiIT10eXBlb2Ygd2luZG93Lm5hdmlnYXRvcjtyZXR1cm4gYS5fX25hbWVfXz1uZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmJyb3dzZXJcXFwiKSxhLm9wZW49bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoKzEsMSwzKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXc9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbiBvcGVuX25ldyhhKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuX25ld190YWJcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMSwxKSxvcGVuX3RhYihhKX0pLGEuRGVmYXVsdEJyb3dzZXI9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uIGRmbGJyb3dzZXIoYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gX19pbml0X18oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSksYi5vcGVuPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3BlbihhLGIpe3JldHVybiBTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJvcGVuXFxcIixhcmd1bWVudHMubGVuZ3RoLDIsNCksb3Blbl90YWIoYil9KSxiLm9wZW5fbmV3PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXcoYSxiKXtyZXR1cm4gU2suYnVpbHRpbi5weUNoZWNrQXJnc0xlbihcXFwib3Blbl9uZXdcXFwiLGFyZ3VtZW50cy5sZW5ndGgsMiwyKSxvcGVuX3RhYihiKX0pLGIub3Blbl9uZXdfdGFiPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gb3Blbl9uZXdfdGFiKGEsYil7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIm9wZW5fbmV3X3RhYlxcXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpLG9wZW5fdGFiKGIpfSl9LFxcXCJEZWZhdWx0QnJvd3NlclxcXCIsW10pLGEuZ2V0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIFNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcImdldFxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDEpLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLkRlZmF1bHRCcm93c2VyLFtdKX0pLGF9O1wiLFwic3JjL2xpYi93ZWJicm93c2VyLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3ZWJicm93c2VyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd2ViZ2wvX19pbml0X18uanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXtfX25hbWVfXzpuZXcgU2suYnVpbHRpbi5zdHIoXFxcIndlYmdsXFxcIil9LGM9ZnVuY3Rpb24oYSl7cmV0dXJuXFxcIjx0YWJsZSBzdHlsZT1cXFxcXFxcImJhY2tncm91bmQtY29sb3I6ICM4Q0U7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7XFxcXFxcXCI+PHRyPjx0ZCBhbGlnbj1cXFxcXFxcImNlbnRlclxcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJkaXNwbGF5OiB0YWJsZS1jZWxsOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXFxcXFwiPjxkaXYgc3R5bGU9XFxcXFxcXCJcXFxcXFxcIj5cXFwiK2ErXFxcIjwvZGl2PjwvZGl2PjwvdGQ+PC90cj48L3RhYmxlPlxcXCJ9LGQ9XFxcIlRoaXMgcGFnZSByZXF1aXJlcyBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cyBXZWJHTC48YnIvPjxhIGhyZWY9XFxcXFxcXCJodHRwOi8vZ2V0LndlYmdsLm9yZ1xcXFxcXFwiPkNsaWNrIGhlcmUgdG8gdXBncmFkZSB5b3VyIGJyb3dzZXIuPC9hPlxcXCIsZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9W1xcXCJ3ZWJnbFxcXCIsXFxcImV4cGVyaW1lbnRhbC13ZWJnbFxcXCIsXFxcIndlYmtpdC0zZFxcXCIsXFxcIm1vei13ZWJnbFxcXCJdLGM9bnVsbCxkPTA7ZDxiLmxlbmd0aDsrK2Qpe3RyeXtjPWEuZ2V0Q29udGV4dChiW2RdKX1jYXRjaChhKXt9aWYoYylicmVha31pZihjKXtmdW5jdGlvbiByZXR1cm5GYWxzZSgpe3JldHVybiExfWEub25zZWxlY3RzdGFydD1yZXR1cm5GYWxzZSxhLm9ubW91c2Vkb3duPXJldHVybkZhbHNlfXJldHVybiBjfSxmPWZ1bmN0aW9uKGEsZil7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7aWYoZnx8KGY9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZShcXFwiY2FudmFzXFxcIilbMF0pLCFmKXJldHVybiB2b2lkKGcuaW5uZXJIVE1MPWMoZCkpO3ZhciBoPWUoZik7aWYoIWgpe3ZhciBpPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhcXFxcdytcXFxcLy4qPyApL2cpLGo9e307dHJ5e2Zvcih2YXIgaz0wO2s8aS5sZW5ndGg7KytrKXtmb3IodmFyIGw9aVtrXS5tYXRjaCgvKFxcXFx3KykvZyksbT1bXSxuPTE7bjxsLmxlbmd0aDsrK24pbS5wdXNoKHBhcnNlSW50KGxbbl0pKTtqW2xbMF1dPW19fWNhdGNoKGEpe31nLmlubmVySFRNTD1qLkNocm9tZSYmKDc8ai5DaHJvbWVbMF18fDc9PWouQ2hyb21lWzBdJiYwPGouQ2hyb21lWzFdfHw3PT1qLkNocm9tZVswXSYmMD09ai5DaHJvbWVbMV0mJjUyMTw9ai5DaHJvbWVbMl0pP2MoXFxcIkl0IGRvZXNuJ3QgYXBwZWFyIHlvdXIgY29tcHV0ZXIgY2FuIHN1cHBvcnQgV2ViR0wuPGJyLz48YSBocmVmPVxcXFxcXFwiaHR0cDovL2dldC53ZWJnbC5vcmdcXFxcXFxcIj5DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvYT5cXFwiKTpjKGQpfXJldHVybiBofTtyZXR1cm4gYS5Db250ZXh0PVNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoYSxmdW5jdGlvbihhLGIpe2IuX19pbml0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIudiksZD1mKGIudixjKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoXFxcIllvdXIgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBXZWJHTC5cXFwiKTtmb3IodmFyIGUgaW4gYS5nbD1kLGQuX19wcm90b19fKWlmKFxcXCJudW1iZXJcXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pU2suYWJzdHIub2JqZWN0U2V0SXRlbShhLiRkLG5ldyBTay5idWlsdGluLnN0cihlKSxkLl9fcHJvdG9fX1tlXSk7ZWxzZSBpZihcXFwiZnVuY3Rpb25cXFwiPT10eXBlb2YgZC5fX3Byb3RvX19bZV0pc3dpdGNoKGUpe2Nhc2VcXFwiYnVmZmVyRGF0YVxcXCI6YnJlYWs7Y2FzZVxcXCJjbGVhckNvbG9yXFxcIjpicmVhaztjYXNlXFxcImRyYXdBcnJheXNcXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0QXR0cmliTG9jYXRpb25cXFwiOmJyZWFrO2Nhc2VcXFwiZ2V0VW5pZm9ybUxvY2F0aW9uXFxcIjpicmVhaztjYXNlXFxcInNoYWRlclNvdXJjZVxcXCI6YnJlYWs7Y2FzZVxcXCJ1bmlmb3JtTWF0cml4NGZ2XFxcIjpicmVhaztjYXNlXFxcInZlcnRleEF0dHJpYlBvaW50ZXJcXFwiOmJyZWFrO2Nhc2VcXFwidmlld3BvcnRcXFwiOmJyZWFrO2RlZmF1bHQ6KGZ1bmN0aW9uKGIpe1NrLmFic3RyLm9iamVjdFNldEl0ZW0oYS4kZCxuZXcgU2suYnVpbHRpbi5zdHIoZSksbmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbigpe3ZhciBhPWQuX19wcm90b19fW2JdO3JldHVybiBhLmFwcGx5KGQsYXJndW1lbnRzKX0pKX0pKGUpO31kLmNsZWFyQ29sb3IoMTAwLzI1NSwxNDkvMjU1LDIzNy8yNTUsMSksZC5jbGVhcihkLkNPTE9SX0JVRkZFUl9CSVQpfSksYi50cCRnZXRhdHRyPVNrLmdlbmVyaWMuZ2V0QXR0cixiLmJ1ZmZlckRhdGE9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmJ1ZmZlckRhdGEoYixjLnYsZCl9KSxiLmNsZWFyQ29sb3I9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkLGUpe2EuZ2wuY2xlYXJDb2xvcihTay5idWlsdGluLmFzbnVtJChiKSxTay5idWlsdGluLmFzbnVtJChjKSxTay5idWlsdGluLmFzbnVtJChkKSxTay5idWlsdGluLmFzbnVtJChlKSl9KSxiLmdldEF0dHJpYkxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldEF0dHJpYkxvY2F0aW9uKGIsYy52KX0pLGIuZ2V0VW5pZm9ybUxvY2F0aW9uPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmdsLmdldFVuaWZvcm1Mb2NhdGlvbihiLGMudil9KSxiLnNoYWRlclNvdXJjZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjKXthLmdsLnNoYWRlclNvdXJjZShiLGMudil9KSxiLmRyYXdBcnJheXM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIsYyxkKXthLmdsLmRyYXdBcnJheXMoU2suYnVpbHRpbi5hc251bSQoYiksU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCkpfSksYi52ZXJ0ZXhBdHRyaWJQb2ludGVyPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7YS5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGIsU2suYnVpbHRpbi5hc251bSQoYyksU2suYnVpbHRpbi5hc251bSQoZCksZSxTay5idWlsdGluLmFzbnVtJChmKSxTay5idWlsdGluLmFzbnVtJChnKSl9KSxiLnZpZXdwb3J0PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiLGMsZCxlKXthLmdsLnZpZXdwb3J0KFNrLmJ1aWx0aW4uYXNudW0kKGIpLFNrLmJ1aWx0aW4uYXNudW0kKGMpLFNrLmJ1aWx0aW4uYXNudW0kKGQpLFNrLmJ1aWx0aW4uYXNudW0kKGUpKX0pLGIudW5pZm9ybU1hdHJpeDRmdj1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EuZ2wudW5pZm9ybU1hdHJpeDRmdihTay5idWlsdGluLmFzbnVtJChiKSxjLGQudil9KSxiLnNldERyYXdGdW5jPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgRGF0ZSgpLmdldFRpbWUoKSxkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW2EsbmV3IERhdGUoKS5nZXRUaW1lKCktY10pfSwxZTMvNjApfSl9LFxcXCJDb250ZXh0XFxcIixbXSksYS5GbG9hdDMyQXJyYXk9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGEsYil7Yi5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7YS52PVxcXCJudW1iZXJcXFwiPT10eXBlb2YgYj9uZXcgRmxvYXQzMkFycmF5KGIpOm5ldyBGbG9hdDMyQXJyYXkoU2suZmZpLnJlbWFwVG9KcyhiKSl9KSxiLl9fcmVwcl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEudi5sZW5ndGg7KytjKWIucHVzaChhLnZbY10pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXFxcIltcXFwiK2Iuam9pbihcXFwiLCBcXFwiKStcXFwiXVxcXCIpfSl9LFxcXCJGbG9hdDMyQXJyYXlcXFwiLFtdKSxhLk1hdHJpeDR4ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXthLnY9bmV3IEZsb2F0MzJBcnJheShTay5mZmkucmVtYXBUb0pzKGIpKX0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7YlswXT0xLGJbMV09MCxiWzJdPTAsYlszXT0wLGJbNF09MCxiWzVdPTEsYls2XT0wLGJbN109MCxiWzhdPTAsYls5XT0wLGJbMTBdPTEsYlsxMV09MCxiWzEyXT0wLGJbMTNdPTAsYlsxNF09MCxiWzE1XT0xfSksYi5wZXJzcGVjdGl2ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGIsYyxkLGUsZyl7dmFyIGg9TWF0aC50YW4saT1NYXRoLlBJLGo9aCguNSppLS41KihTay5idWlsdGluLmFzbnVtJChjKSppLzE4MCkpLGw9U2suYnVpbHRpbi5hc251bSQoZCksYT1Tay5idWlsdGluLmFzbnVtJChlKSxuPVNrLmJ1aWx0aW4uYXNudW0kKGcpLGY9MS8oYS1uKSxrPWIudjtrWzBdPWovbCxrWzFdPTAsa1syXT0wLGtbM109MCxrWzRdPTAsa1s1XT1qLGtbNl09MCxrWzddPTAsa1s4XT0wLGtbOV09MCxrWzEwXT0oYStuKSpmLGtbMTFdPS0xLGtbMTJdPTAsa1sxM109MCxrWzE0XT0yKihhKm4qZiksa1sxNV09MH0pLGIudHJhbnNsYXRlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnYsZD1Tay5mZmkucmVtYXBUb0pzKGIpO2NbMF09MSxjWzFdPTAsY1syXT0wLGNbM109MCxjWzRdPTAsY1s1XT0xLGNbNl09MCxjWzddPTAsY1s4XT0wLGNbOV09MCxjWzEwXT0xLGNbMTFdPTAsY1sxMl09ZFswXSxjWzEzXT1kWzFdLGNbMTRdPWRbMl0sY1sxNV09MX0pLGIuX19yZXByX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS52Lmxlbmd0aDsrK2MpYi5wdXNoKGEudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcXFwiW1xcXCIrYi5qb2luKFxcXCIsIFxcXCIpK1xcXCJdXFxcIil9KX0sXFxcIk1hdHJpeDR4NFxcXCIsW10pLGF9O1wiLFwic3JjL2xpYi93ZWJnbC9tYXRoLmpzXCI6XCJ2YXIgJGJ1aWx0aW5tb2R1bGU9ZnVuY3Rpb24oKXt2YXIgYT17fTtyZXR1cm4gYS5NYXQ0ND1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYixjKXt2YXIgZD1NYXRoLnNxcnQ7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLmxvYWRJZGVudGl0eSxbYV0pLGEuc3RhY2s9W119KSxjLnB1c2g9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLnN0YWNrLnB1c2goYS5lbGVtZW50cy5zbGljZSgwKSl9KSxjLnBvcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9YS5zdGFjay5wb3AoKX0pLGMubG9hZElkZW50aXR5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7YS5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV19KSxjLnRyYW5zZm9ybTM9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3ZhciBkPWIuZWxlbWVudHM7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLlZlYzMsW2RbMF0qYy54K2RbNF0qYy55K2RbOF0qYy56LGRbMV0qYy54K2RbNV0qYy55K2RbOV0qYy56LGRbMl0qYy54K2RbNl0qYy55K2RbMTBdKmMuel0pfSksYy5zY2FsZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzBdKj1iLGEuZWxlbWVudHNbMV0qPWIsYS5lbGVtZW50c1syXSo9YixhLmVsZW1lbnRzWzNdKj1iLGEuZWxlbWVudHNbNF0qPWMsYS5lbGVtZW50c1s1XSo9YyxhLmVsZW1lbnRzWzZdKj1jLGEuZWxlbWVudHNbN10qPWMsYS5lbGVtZW50c1s4XSo9ZCxhLmVsZW1lbnRzWzldKj1kLGEuZWxlbWVudHNbMTBdKj1kLGEuZWxlbWVudHNbMTFdKj1kLGF9KSxjLnRyYW5zbGF0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLmVsZW1lbnRzWzEyXSs9YS5lbGVtZW50c1swXSpiK2EuZWxlbWVudHNbNF0qYythLmVsZW1lbnRzWzhdKmQsYS5lbGVtZW50c1sxM10rPWEuZWxlbWVudHNbMV0qYithLmVsZW1lbnRzWzVdKmMrYS5lbGVtZW50c1s5XSpkLGEuZWxlbWVudHNbMTRdKz1hLmVsZW1lbnRzWzJdKmIrYS5lbGVtZW50c1s2XSpjK2EuZWxlbWVudHNbMTBdKmQsYS5lbGVtZW50c1sxNV0rPWEuZWxlbWVudHNbM10qYithLmVsZW1lbnRzWzddKmMrYS5lbGVtZW50c1sxMV0qZCxhfSksYy5yb3RhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcpe3ZhciBoPU1hdGguY29zLGk9TWF0aC5zaW4saj1NYXRoLlBJLGs9ZChlKmUrZipmK2cqZyksbD1pKGMqai8xODApLG09aChjKmovMTgwKTtpZigwPGspe3ZhciBuLG8scCxxLHIscyx0LHUsdix3LEE7ZS89ayxmLz1rLGcvPWssbj1lKmUsbz1mKmYscD1nKmcscT1lKmYscj1mKmcscz1nKmUsdD1lKmwsdT1mKmwsdj1nKmwsdz0xLW0sQT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5NYXQ0NCksQS5lbGVtZW50c1swXT13Km4rbSxBLmVsZW1lbnRzWzFdPXcqcS12LEEuZWxlbWVudHNbMl09dypzK3UsQS5lbGVtZW50c1szXT0wLEEuZWxlbWVudHNbNF09dypxK3YsQS5lbGVtZW50c1s1XT13Km8rbSxBLmVsZW1lbnRzWzZdPXcqci10LEEuZWxlbWVudHNbN109MCxBLmVsZW1lbnRzWzhdPXcqcy11LEEuZWxlbWVudHNbOV09dypyK3QsQS5lbGVtZW50c1sxMF09dypwK20sQS5lbGVtZW50c1sxMV09MCxBLmVsZW1lbnRzWzEyXT0wLEEuZWxlbWVudHNbMTNdPTAsQS5lbGVtZW50c1sxNF09MCxBLmVsZW1lbnRzWzE1XT0xLEE9QS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPUEuZWxlbWVudHN9cmV0dXJuIGJ9KSxjLm11bHRpcGx5PW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtmb3IodmFyIGQ9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuTWF0NDQpLGU9MDs0PmU7ZSsrKWQuZWxlbWVudHNbNCplKzBdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMF0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s0XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzhdK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTJdLGQuZWxlbWVudHNbNCplKzFdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMV0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s1XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzldK2IuZWxlbWVudHNbNCplKzNdKmMuZWxlbWVudHNbMTNdLGQuZWxlbWVudHNbNCplKzJdPWIuZWxlbWVudHNbNCplKzBdKmMuZWxlbWVudHNbMl0rYi5lbGVtZW50c1s0KmUrMV0qYy5lbGVtZW50c1s2XStiLmVsZW1lbnRzWzQqZSsyXSpjLmVsZW1lbnRzWzEwXStiLmVsZW1lbnRzWzQqZSszXSpjLmVsZW1lbnRzWzE0XSxkLmVsZW1lbnRzWzQqZSszXT1iLmVsZW1lbnRzWzQqZSswXSpjLmVsZW1lbnRzWzNdK2IuZWxlbWVudHNbNCplKzFdKmMuZWxlbWVudHNbN10rYi5lbGVtZW50c1s0KmUrMl0qYy5lbGVtZW50c1sxMV0rYi5lbGVtZW50c1s0KmUrM10qYy5lbGVtZW50c1sxNV07cmV0dXJuIGIuZWxlbWVudHM9ZC5lbGVtZW50cyxifSksYy5sb29rQXQ9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMsZSxmLGcsaCxpLGosayxsKXt2YXIgbT1bYy1nLGUtaCxmLWldLG49ZChtWzBdKm1bMF0rbVsxXSptWzFdK21bMl0qbVsyXSk7biYmKG1bMF0vPW4sbVsxXS89bixtWzJdLz1uKTt2YXIgbz1baixrLGxdLHA9W107cFswXT1vWzFdKm1bMl0tb1syXSptWzFdLHBbMV09LW9bMF0qbVsyXStvWzJdKm1bMF0scFsyXT1vWzBdKm1bMV0tb1sxXSptWzBdLG9bMF09bVsxXSpwWzJdLW1bMl0qcFsxXSxvWzFdPS1tWzBdKnBbMl0rbVsyXSpwWzBdLG9bMl09bVswXSpwWzFdLW1bMV0qcFswXSxuPWQocFswXSpwWzBdK3BbMV0qcFsxXStwWzJdKnBbMl0pLG4mJihwWzBdLz1uLHBbMV0vPW4scFsyXS89biksbj1kKG9bMF0qb1swXStvWzFdKm9bMV0rb1syXSpvWzJdKSxuJiYob1swXS89bixvWzFdLz1uLG9bMl0vPW4pO3ZhciBxPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLk1hdDQ0KTtyZXR1cm4gcS5lbGVtZW50c1swXT1wWzBdLHEuZWxlbWVudHNbNF09cFsxXSxxLmVsZW1lbnRzWzhdPXBbMl0scS5lbGVtZW50c1sxMl09MCxxLmVsZW1lbnRzWzFdPW9bMF0scS5lbGVtZW50c1s1XT1vWzFdLHEuZWxlbWVudHNbOV09b1syXSxxLmVsZW1lbnRzWzEzXT0wLHEuZWxlbWVudHNbMl09bVswXSxxLmVsZW1lbnRzWzZdPW1bMV0scS5lbGVtZW50c1sxMF09bVsyXSxxLmVsZW1lbnRzWzE0XT0wLHEuZWxlbWVudHNbM109MCxxLmVsZW1lbnRzWzddPTAscS5lbGVtZW50c1sxMV09MCxxLmVsZW1lbnRzWzE1XT0xLHE9cS5tdWx0aXBseShiKSxiLmVsZW1lbnRzPXEuZWxlbWVudHMsYi50cmFuc2xhdGUoLWMsLWUsLWYpLGJ9KX0sXFxcIk1hdDQ0XFxcIixbXSksYS5NYXQzMz1Tay5taXNjZXZhbC5idWlsZENsYXNzKGEsZnVuY3Rpb24oYSxiKXtiLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIubG9hZElkZW50aXR5LFthXSl9KSxiLmxvYWRJZGVudGl0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2EuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXX0pfSxcXFwiTWF0MzNcXFwiLFtdKSxhLlZlYzM9U2subWlzY2V2YWwuYnVpbGRDbGFzcyhhLGZ1bmN0aW9uKGIsYyl7Yy5fX2luaXRfXz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixjLGQpe2EueD1iLGEueT1jLGEuej1kfSksYy5fX3N1Yl9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEuVmVjMyxbYi54LWMueCxiLnktYy55LGIuei1jLnpdKX0pfSxcXFwiVmVjM1xcXCIsW10pLGEuY3Jvc3M9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihiLGMpe3JldHVybiBTay5hc3NlcnRzLmFzc2VydChiIGluc3RhbmNlb2YgYS5WZWMzJiZjIGluc3RhbmNlb2YgYS5WZWMzKSxTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5WZWMzLFtiLnkqYy56LWIueipjLnksYi56KmMueC1iLngqYy56LGIueCpjLnktYi55KmMueF0pfSksYX07XCIsXCJzcmMvbGliL3dlYmdsL21hdHJpeDQuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPU1hdGguUEksYj17fSxjPW5ldyBGbG9hdDMyQXJyYXkoMyksZD1uZXcgRmxvYXQzMkFycmF5KDMpLGU9bmV3IEZsb2F0MzJBcnJheSgzKSxmPW5ldyBGbG9hdDMyQXJyYXkoNCksZz1uZXcgRmxvYXQzMkFycmF5KDQpLGg9bmV3IEZsb2F0MzJBcnJheSg0KSxpPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGo9bmV3IEZsb2F0MzJBcnJheSgxNiksaz1uZXcgRmxvYXQzMkFycmF5KDE2KSxsPWZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPU1hdGguc3FydCxkPTAsZT1jLmxlbmd0aCxmPTA7ZjxlOysrZilkKz1jW2ZdKmNbZl07aWYoZD1hKGQpLDFlLTU8ZClmb3IodmFyIGY9MDtmPGU7KytmKWJbZl09Y1tmXS9kO2Vsc2UgZm9yKHZhciBmPTA7ZjxlOysrZiliW2ZdPTA7cmV0dXJuIGJ9LG09ZnVuY3Rpb24oYyxkLGEpe3JldHVybiBjWzBdPWRbMV0qYVsyXS1kWzJdKmFbMV0sY1sxXT1kWzJdKmFbMF0tZFswXSphWzJdLGNbMl09ZFswXSphWzFdLWRbMV0qYVswXSxjfSxuPWZ1bmN0aW9uKGMsZCxhKXtmb3IodmFyIGI9ZC5sZW5ndGgsZT0wO2U8YjsrK2UpY1tlXT1kW2VdLWFbZV07cmV0dXJuIGN9LG89ZnVuY3Rpb24oYyxhKXtyZXR1cm4gY1swXSphWzBdK2NbMV0qYVsxXStjWzJdKmFbMl19O3JldHVybiBiLmxvb2tBdD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYixmLGcpe3ZhciBoPWMsaT1kLGo9bChoLG4oaCxiLnYsZi52KSksaz1sKGksbShpLGcudixqKSkscD1tKGUsaixrKSxxPWEudjtyZXR1cm4gcVswXT1rWzBdLHFbMV09cFswXSxxWzJdPWpbMF0scVszXT0wLHFbNF09a1sxXSxxWzVdPXBbMV0scVs2XT1qWzFdLHFbN109MCxxWzhdPWtbMl0scVs5XT1wWzJdLHFbMTBdPWpbMl0scVsxMV09MCxxWzEyXT0tbyhrLGIudikscVsxM109LW8ocCxiLnYpLHFbMTRdPS1vKGosYi52KSxxWzE1XT0xLGF9KSxiLnBlcnNwZWN0aXZlPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixjLGQsZSxnKXt2YXIgaD1NYXRoLnRhbixpPWgoLjUqYS0uNSooYyphLzE4MCkpLGY9MS8oZS1nKSxqPWIudjtyZXR1cm4galswXT1pL2QsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0wLGpbNV09aSxqWzZdPTAsals3XT0wLGpbOF09MCxqWzldPTAsalsxMF09KGUrZykqZixqWzExXT0tMSxqWzEyXT0wLGpbMTNdPTAsalsxNF09MiooZSpnKmYpLGpbMTVdPTAsYn0pLGIucm90YXRpb25ZPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYixkKXt2YXIgZT1NYXRoLnNpbixmPU1hdGguY29zLGc9Yi52LGg9ZihkKmEvMTgwKSxjPWUoZCphLzE4MCk7cmV0dXJuIGdbMF09aCxnWzFdPTAsZ1syXT0tYyxnWzNdPTAsZ1s0XT0wLGdbNV09MSxnWzZdPTAsZ1s3XT0wLGdbOF09YyxnWzldPTAsZ1sxMF09aCxnWzExXT0wLGdbMTJdPTAsZ1sxM109MCxnWzE0XT0wLGdbMTVdPTEsYn0pLGIuaWRlbnRpdHk9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXt2YXIgYj1hLnY7cmV0dXJuIGJbMF09MSxiWzFdPTAsYlsyXT0wLGJbM109MCxiWzRdPTAsYls1XT0xLGJbNl09MCxiWzddPTAsYls4XT0wLGJbOV09MCxiWzEwXT0xLGJbMTFdPTAsYlsxMl09MCxiWzEzXT0wLGJbMTRdPTAsYlsxNV09MSxhfSksYi5tdWw9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihjLGQsZSl7dmFyIGY9Yy52LGc9ZC52LGE9ZS52LGI9Z1swXSxoPWdbMV0saT1nWzJdLGo9Z1szXSxrPWdbNF0sbD1nWzVdLG09Z1s2XSxuPWdbN10sbz1nWzhdLHA9Z1s5XSxxPWdbMTBdLHI9Z1sxMV0scz1nWzEyXSx0PWdbMTNdLHU9Z1sxNF0sdj1nWzE1XSx3PWFbMF0seD1hWzFdLHk9YVsyXSx6PWFbM10sQT1hWzRdLEI9YVs1XSxDPWFbNl0sRD1hWzddLEU9YVs4XSxGPWFbOV0sRz1hWzEwXSxIPWFbMTFdLEk9YVsxMl0sSj1hWzEzXSxLPWFbMTRdLEw9YVsxNV07cmV0dXJuIGZbMF09Yip3K2gqQStpKkUraipJLGZbMV09Yip4K2gqQitpKkYraipKLGZbMl09Yip5K2gqQytpKkcraipLLGZbM109Yip6K2gqRCtpKkgraipMLGZbNF09ayp3K2wqQSttKkUrbipJLGZbNV09ayp4K2wqQittKkYrbipKLGZbNl09ayp5K2wqQyttKkcrbipLLGZbN109ayp6K2wqRCttKkgrbipMLGZbOF09byp3K3AqQStxKkUrcipJLGZbOV09byp4K3AqQitxKkYrcipKLGZbMTBdPW8qeStwKkMrcSpHK3IqSyxmWzExXT1vKnorcCpEK3EqSCtyKkwsZlsxMl09cyp3K3QqQSt1KkUrdipJLGZbMTNdPXMqeCt0KkIrdSpGK3YqSixmWzE0XT1zKnkrdCpDK3UqRyt2KkssZlsxNV09cyp6K3QqRCt1KkgrdipMLGN9KSxiLmludmVydD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS52LGU9Yi52LGY9ZVswXSxnPWVbMV0saD1lWzJdLGk9ZVszXSxqPWVbNF0saz1lWzVdLGw9ZVs2XSxtPWVbN10sbj1lWzhdLG89ZVs5XSxwPWVbMTBdLHE9ZVsxMV0scj1lWzEyXSxzPWVbMTNdLHQ9ZVsxNF0sdT1lWzE1XSx2PXAqdSx3PXQqcSx4PWwqdSx5PXQqbSx6PWwqcSxBPXAqbSxCPWgqdSxDPXQqaSxEPWgqcSxFPXAqaSxGPWgqbSxHPWwqaSxIPW4qcyxJPXIqbyxKPWoqcyxLPXIqayxMPWoqbyxNPW4qayxOPWYqcyxPPXIqZyxQPWYqbyxRPW4qZyxSPWYqayxTPWoqZyxUPXYqayt5Km8reipzLSh3KmsreCpvK0EqcyksVT13KmcrQipvK0Uqcy0odipnK0MqbytEKnMpLFY9eCpnK0MqaytGKnMtKHkqZytCKmsrRypzKSxXPUEqZytEKmsrRypvLSh6KmcrRSprK0YqbyksWD0xLyhmKlQraipVK24qVityKlcpO3JldHVybiBjWzBdPVgqVCxjWzFdPVgqVSxjWzJdPVgqVixjWzNdPVgqVyxjWzRdPVgqKHcqait4Km4rQSpyLSh2KmoreSpuK3oqcikpLGNbNV09WCoodipmK0MqbitEKnItKHcqZitCKm4rRSpyKSksY1s2XT1YKih5KmYrQipqK0cqci0oeCpmK0MqaitGKnIpKSxjWzddPVgqKHoqZitFKmorRipuLShBKmYrRCpqK0cqbikpLGNbOF09WCooSCptK0sqcStMKnUtKEkqbStKKnErTSp1KSksY1s5XT1YKihJKmkrTipxK1EqdS0oSCppK08qcStQKnUpKSxjWzEwXT1YKihKKmkrTyptK1IqdS0oSyppK04qbStTKnUpKSxjWzExXT1YKihNKmkrUCptK1MqcS0oTCppK1EqbStSKnEpKSxjWzEyXT1YKihKKnArTSp0K0kqbC0oTCp0K0gqbCtLKnApKSxjWzEzXT1YKihQKnQrSCpoK08qcC0oTipwK1EqdCtJKmgpKSxjWzE0XT1YKihOKmwrUyp0K0sqaC0oUip0K0oqaCtPKmwpKSxjWzE1XT1YKihSKnArTCpoK1EqbC0oUCpsK1MqcCtNKmgpKSxhfSksYi50cmFuc3Bvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLnYsZD1iLnYsZT0wOzQ+ZTsrK2UpZm9yKHZhciBmPTA7ND5mOysrZiljWzQqZStmXT1kWzQqZitlXTtyZXR1cm4gY30pLGJ9O1wiLFwic3JjL2xpYi93ZWJnbC9tb2RlbHMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbihhKXt2YXIgYz17fSxkPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Y3x8Z2wuQVJSQVlfQlVGRkVSLGU9Z2wuY3JlYXRlQnVmZmVyKCk7aWYodGhpcy50YXJnZXQ9ZCx0aGlzLmJ1Zj1lLHRoaXMuc2V0KGEpLHRoaXMubnVtQ29tcG9uZW50c189YS5udW1Db21wb25lbnRzLHRoaXMubnVtRWxlbWVudHNfPWEubnVtRWxlbWVudHMsdGhpcy50b3RhbENvbXBvbmVudHNfPXRoaXMubnVtQ29tcG9uZW50c18qdGhpcy5udW1FbGVtZW50c18sYS5idWZmZXIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpdGhpcy50eXBlXz1nbC5GTE9BVDtlbHNlIGlmKGEuYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX0JZVEU7ZWxzZSBpZihhLmJ1ZmZlciBpbnN0YW5jZW9mIEludDhBcnJheSl0aGlzLnR5cGVfPWdsLl9CWVRFO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBVaW50MTZBcnJheSl0aGlzLnR5cGVfPWdsLlVOU0lHTkVEX1NIT1JUO2Vsc2UgaWYoYS5idWZmZXIgaW5zdGFuY2VvZiBJbnQxNkFycmF5KXRoaXMudHlwZV89Z2wuU0hPUlQ7ZWxzZSB0aHJvd1xcXCJ1bmhhbmRsZWQgdHlwZTpcXFwiK3R5cGVvZiBhLmJ1ZmZlcn07cmV0dXJuIGQucHJvdG90eXBlLnNldD1mdW5jdGlvbihhKXtnbC5iaW5kQnVmZmVyKHRoaXMudGFyZ2V0LHRoaXMuYnVmKSxnbC5idWZmZXJEYXRhKHRoaXMudGFyZ2V0LGEuYnVmZmVyLGdsLlNUQVRJQ19EUkFXKX0sZC5wcm90b3R5cGUudHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGVffSxkLnByb3RvdHlwZS5udW1Db21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtQ29tcG9uZW50c199LGQucHJvdG90eXBlLm51bUVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtRWxlbWVudHNffSxkLnByb3RvdHlwZS50b3RhbENvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbENvbXBvbmVudHNffSxkLnByb3RvdHlwZS5idWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZ9LGQucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxkLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYy5Nb2RlbD1Tay5taXNjZXZhbC5idWlsZENsYXNzKGMsZnVuY3Rpb24oYyxlKXtlLl9faW5pdF9fPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYyxlLGYsZyl7Yy5idWZmZXJzPXt9O3ZhciBoPWZ1bmN0aW9uKGEsZSl7dmFyIGY9XFxcImluZGljZXNcXFwiPT1hP2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSOmdsLkFSUkFZX0JVRkZFUjtiPWMuYnVmZmVyc1thXSxiP2Iuc2V0KGUpOmI9bmV3IGQoZSxmKSxjLmJ1ZmZlcnNbYV09Yn07Zm9yKGEgaW4gZiloKGEsZlthXSk7dmFyIGk9e30saj0wO2Zvcih2YXIgayBpbiBnKWlba109aisrO2MubW9kZT1nbC5UUklBTkdMRVMsYy50ZXh0dXJlcz1nLnYsYy50ZXh0dXJlVW5pdHM9aSxjLnNoYWRlcj1lfSksZS5kcmF3UHJlcD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5zaGFkZXIsZT1hLmJ1ZmZlcnMsZj1hLnRleHR1cmVzO2Zvcih2YXIgZyBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQudXNlLFtkXSksZSl7dmFyIGg9ZVtnXTtpZihcXFwiaW5kaWNlc1xcXCI9PWcpZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUixoLmJ1ZmZlcigpKTtlbHNle3ZhciBpPWQuYXR0cmliW2ddO2kmJmkoaCl9fWZvcih2YXIgaiBpbiBmKXt2YXIgaz1hLnRleHR1cmVVbml0c1tqXTtkLnNldFVuaWZvcm0kaW1wbChkLHRleHR1ZXIsayksZltqXS5iaW5kVG9Vbml0KGspfWZvcih2YXIgbCBpbiBjKWQuc2V0VW5pZm9ybSRpbXBsKGQsbCxjW2xdKX0pLGUuZHJhdz1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNoYWRlcjtmb3IodW5pZm9ybSBpbiBjPVNrLmZmaS5yZW1hcFRvSnMoYyksYyllLnNldFVuaWZvcm0kaW1wbChlLHVuaWZvcm0sY1t1bmlmb3JtXSk7aWYoZClmb3IodmFyIGYgaW4gZCl7dmFyIGc9YS50ZXh0dXJlVW5pdHNbZl07ZS5zZXRVbmlmb3JtJGltcGwoZSxmLGcpLGRbZl0uYmluZFRvVW5pdChnKX12YXIgaD1hLmJ1ZmZlcnM7Z2wuZHJhd0VsZW1lbnRzKGEubW9kZSxoLmluZGljZXMudG90YWxDb21wb25lbnRzKCksZ2wuVU5TSUdORURfU0hPUlQsMCl9KX0sXFxcIk1vZGVsXFxcIixbXSksY307XCIsXCJzcmMvbGliL3dlYmdsL3ByaW1pdGl2ZXMuanNcIjpcInZhciAkYnVpbHRpbm1vZHVsZT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9ZnVuY3Rpb24oYSxiLGMpe2M9Y3x8XFxcIkZsb2F0MzJBcnJheVxcXCI7dmFyIGQ9d2luZG93W2NdO2IubGVuZ3RoPyh0aGlzLmJ1ZmZlcj1uZXcgZChiKSxiPXRoaXMuYnVmZmVyLmxlbmd0aC9hLHRoaXMuY3Vyc29yPWIpOih0aGlzLmJ1ZmZlcj1uZXcgZChhKmIpLHRoaXMuY3Vyc29yPTApLHRoaXMubnVtQ29tcG9uZW50cz1hLHRoaXMubnVtRWxlbWVudHM9Yix0aGlzLnR5cGU9Y307cmV0dXJuIGIucHJvdG90eXBlLnN0cmlkZT1mdW5jdGlvbigpe3JldHVybiAwfSxiLnByb3RvdHlwZS5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYi5wcm90b3R5cGUuZ2V0RWxlbWVudD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YSp0aGlzLm51bUNvbXBvbmVudHMsYz1bXSxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKWMucHVzaCh0aGlzLmJ1ZmZlcltiK2RdKTtyZXR1cm4gY30sYi5wcm90b3R5cGUuc2V0RWxlbWVudD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hKnRoaXMubnVtQ29tcG9uZW50cyxkPTA7ZDx0aGlzLm51bUNvbXBvbmVudHM7KytkKXRoaXMuYnVmZmVyW2MrZF09YltkXX0sYi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgYih0aGlzLm51bUNvbXBvbmVudHMsdGhpcy5udW1FbGVtZW50cyx0aGlzLnR5cGUpO3JldHVybiBhLnB1c2hBcnJheSh0aGlzKSxhfSxiLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3RoaXMuc2V0RWxlbWVudCh0aGlzLmN1cnNvcisrLGEpfSxiLnByb3RvdHlwZS5wdXNoQXJyYXk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7YjxhLm51bUVsZW1lbnRzOysrYil0aGlzLnB1c2goYS5nZXRFbGVtZW50KGIpKX0sYi5wcm90b3R5cGUucHVzaEFycmF5V2l0aE9mZnNldD1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTA7ZDxhLm51bUVsZW1lbnRzOysrZCl7Yz1hLmdldEVsZW1lbnQoZCk7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDsrK2UpY1tlXSs9YltlXTt0aGlzLnB1c2goYyl9fSxiLnByb3RvdHlwZS5jb21wdXRlRXh0ZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgYT1NYXRoLm1heCxiPU1hdGgubWluLGMsZD10aGlzLm51bUVsZW1lbnRzLGU9dGhpcy5udW1Db21wb25lbnRzLGY9dGhpcy5nZXRFbGVtZW50KDApLGc9dGhpcy5nZXRFbGVtZW50KDApLGg9MTtoPGQ7KytoKXtjPXRoaXMuZ2V0RWxlbWVudChoKTtmb3IodmFyIGk9MDtpPGU7KytpKWZbaV09YihmW2ldLGNbaV0pLGdbaV09YShnW2ldLGNbaV0pfXJldHVybnttaW46ZixtYXg6Z319LGEuY3JlYXRlQ3ViZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtbMyw3LDUsMV0sWzAsNCw2LDJdLFs2LDcsMywyXSxbMCwxLDUsNF0sWzUsNyw2LDRdLFsyLDMsMSwwXV0sZT1hLzIsZz1bWy1lLC1lLC1lXSxbK2UsLWUsLWVdLFstZSwrZSwtZV0sWytlLCtlLC1lXSxbLWUsLWUsK2VdLFsrZSwtZSwrZV0sWy1lLCtlLCtlXSxbK2UsK2UsK2VdXSxoPVtbMSwwLDBdLFstMSwwLDBdLFswLDEsMF0sWzAsLTEsMF0sWzAsMCwxXSxbMCwwLC0xXV0saT1bWzAsMF0sWzEsMF0sWzEsMV0sWzAsMV1dLGo9MjQsaz1uZXcgYigzLGopLGw9bmV3IGIoMyxqKSxtPW5ldyBiKDIsaiksbj1uZXcgYigzLDEyLFxcXCJVaW50MTZBcnJheVxcXCIpLG89MDs2Pm87KytvKXtjPWRbb107Zm9yKHZhciBwPTA7ND5wOysrcCl7dmFyIHE9Z1tjW3BdXSxyPWhbb10scz1pW3BdO2sucHVzaChxKSxsLnB1c2gociksbS5wdXNoKHMpfXZhciB0PTQqbztuLnB1c2goW3QrMCx0KzEsdCsyXSksbi5wdXNoKFt0KzAsdCsyLHQrM10pfXJldHVybntwb3NpdGlvbjprLG5vcm1hbDpsLHRleENvb3JkOm0saW5kaWNlczpufX0pLGF9O1wiLFwic3JjL2xpYi93aGljaGRiLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ3aGljaGRiIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvd3NnaXJlZi9fX2luaXRfXy5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwid3NnaXJlZiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3hkcmxpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieGRybGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJ4bWwgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZG9tL19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJkb20gaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvZXRyZWUvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcImV0cmVlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIveG1sL3BhcnNlcnMvX19pbml0X18ucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInBhcnNlcnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWwvc2F4L19faW5pdF9fLnB5XCI6XCJyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKFxcXCJzYXggaXMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcXFwiKVxcblwiLFwic3JjL2xpYi94bWxsaWIucHlcIjpcInJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoXFxcInhtbGxpYiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCIsXCJzcmMvbGliL3htbHJwY2xpYi5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwieG1scnBjbGliIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XFxcIilcXG5cIixcInNyYy9saWIvemlwZmlsZS5weVwiOlwicmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihcXFwiemlwZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFxcXCIpXFxuXCJ9fSIsIihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0Jzt2YXIgJGpzY29tcD0kanNjb21wfHx7fTskanNjb21wLnNjb3BlPXt9OyRqc2NvbXAuQVNTVU1FX0VTNT0hMTskanNjb21wLkFTU1VNRV9OT19OQVRJVkVfTUFQPSExOyRqc2NvbXAuQVNTVU1FX05PX05BVElWRV9TRVQ9ITE7JGpzY29tcC5TSU1QTEVfRlJPVU5EX1BPTFlGSUxMPSExOyRqc2NvbXAuZGVmaW5lUHJvcGVydHk9JGpzY29tcC5BU1NVTUVfRVM1fHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24obSxxLGEpe20hPUFycmF5LnByb3RvdHlwZSYmbSE9T2JqZWN0LnByb3RvdHlwZSYmKG1bcV09YS52YWx1ZSl9OyRqc2NvbXAuZ2V0R2xvYmFsPWZ1bmN0aW9uKG0pe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PW0/bTpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOm19OyRqc2NvbXAuZ2xvYmFsPSRqc2NvbXAuZ2V0R2xvYmFsKHRoaXMpO1xuJGpzY29tcC5wb2x5ZmlsbD1mdW5jdGlvbihtLHEsYSxjKXtpZihxKXthPSRqc2NvbXAuZ2xvYmFsO209bS5zcGxpdChcIi5cIik7Zm9yKGM9MDtjPG0ubGVuZ3RoLTE7YysrKXt2YXIgYj1tW2NdO2IgaW4gYXx8KGFbYl09e30pO2E9YVtiXX1tPW1bbS5sZW5ndGgtMV07Yz1hW21dO3E9cShjKTtxIT1jJiZudWxsIT1xJiYkanNjb21wLmRlZmluZVByb3BlcnR5KGEsbSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnF9KX19OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0sYSl7dmFyIGM9dGhpcztjIGluc3RhbmNlb2YgU3RyaW5nJiYoYz1TdHJpbmcoYykpO3ZhciBiPWMubGVuZ3RoO2E9YXx8MDtmb3IoMD5hJiYoYT1NYXRoLm1heChhK2IsMCkpO2E8YjthKyspe3ZhciBlPWNbYV07aWYoZT09PW18fE9iamVjdC5pcyhlLG0pKXJldHVybiEwfXJldHVybiExfX0sXCJlczdcIixcImVzM1wiKTtcbiRqc2NvbXAub3ducz1mdW5jdGlvbihtLHEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxxKX07JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC5lbnRyaWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbihtKXt2YXIgYT1bXSxjO2ZvcihjIGluIG0pJGpzY29tcC5vd25zKG0sYykmJmEucHVzaChbYyxtW2NdXSk7cmV0dXJuIGF9fSxcImVzOFwiLFwiZXMzXCIpO1xuJGpzY29tcC5jaGVja1N0cmluZ0FyZ3M9ZnVuY3Rpb24obSxxLGEpe2lmKG51bGw9PW0pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuXCIrYStcIiBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZFwiKTtpZihxIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCB0byBTdHJpbmcucHJvdG90eXBlLlwiK2ErXCIgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb25cIik7cmV0dXJuIG0rXCJcIn07JGpzY29tcC5zdHJpbmdQYWRkaW5nPWZ1bmN0aW9uKG0scSl7bT12b2lkIDAhPT1tP1N0cmluZyhtKTpcIiBcIjtyZXR1cm4gMDxxJiZtP20ucmVwZWF0KE1hdGguY2VpbChxL20ubGVuZ3RoKSkuc3Vic3RyaW5nKDAscSk6XCJcIn07XG4kanNjb21wLnBvbHlmaWxsKFwiU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydFwiLGZ1bmN0aW9uKG0pe3JldHVybiBtP206ZnVuY3Rpb24obSxhKXt2YXIgYz0kanNjb21wLmNoZWNrU3RyaW5nQXJncyh0aGlzLG51bGwsXCJwYWRTdGFydFwiKTtyZXR1cm4gJGpzY29tcC5zdHJpbmdQYWRkaW5nKGEsbS1jLmxlbmd0aCkrY319LFwiZXM4XCIsXCJlczNcIik7JGpzY29tcC5wb2x5ZmlsbChcIk9iamVjdC52YWx1ZXNcIixmdW5jdGlvbihtKXtyZXR1cm4gbT9tOmZ1bmN0aW9uKG0pe3ZhciBhPVtdLGM7Zm9yKGMgaW4gbSkkanNjb21wLm93bnMobSxjKSYmYS5wdXNoKG1bY10pO3JldHVybiBhfX0sXCJlczhcIixcImVzM1wiKTskanNjb21wLmFycmF5SXRlcmF0b3JJbXBsPWZ1bmN0aW9uKG0pe3ZhciBxPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHE8bS5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6bVtxKytdfTp7ZG9uZTohMH19fTskanNjb21wLmFycmF5SXRlcmF0b3I9ZnVuY3Rpb24obSl7cmV0dXJue25leHQ6JGpzY29tcC5hcnJheUl0ZXJhdG9ySW1wbChtKX19O1xuJGpzY29tcC5TWU1CT0xfUFJFRklYPVwianNjb21wX3N5bWJvbF9cIjskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2w9ZnVuY3Rpb24oKXt9OyRqc2NvbXAuZ2xvYmFsLlN5bWJvbHx8KCRqc2NvbXAuZ2xvYmFsLlN5bWJvbD0kanNjb21wLlN5bWJvbCl9OyRqc2NvbXAuU3ltYm9sQ2xhc3M9ZnVuY3Rpb24obSxxKXt0aGlzLiRqc2NvbXAkc3ltYm9sJGlkXz1tOyRqc2NvbXAuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlc2NyaXB0aW9uXCIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpxfSl9OyRqc2NvbXAuU3ltYm9sQ2xhc3MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGpzY29tcCRzeW1ib2wkaWRffTtcbiRqc2NvbXAuU3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShhKXtpZih0aGlzIGluc3RhbmNlb2YgbSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3JldHVybiBuZXcgJGpzY29tcC5TeW1ib2xDbGFzcygkanNjb21wLlNZTUJPTF9QUkVGSVgrKGF8fFwiXCIpK1wiX1wiK3ErKyxhKX12YXIgcT0wO3JldHVybiBtfSgpO1xuJGpzY29tcC5pbml0U3ltYm9sSXRlcmF0b3I9ZnVuY3Rpb24oKXskanNjb21wLmluaXRTeW1ib2woKTt2YXIgbT0kanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3I7bXx8KG09JGpzY29tcC5nbG9iYWwuU3ltYm9sLml0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5pdGVyYXRvclwiKSk7XCJmdW5jdGlvblwiIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW21dJiYkanNjb21wLmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSxtLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gJGpzY29tcC5pdGVyYXRvclByb3RvdHlwZSgkanNjb21wLmFycmF5SXRlcmF0b3JJbXBsKHRoaXMpKX19KTskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcj1mdW5jdGlvbigpe319O1xuJGpzY29tcC5pbml0U3ltYm9sQXN5bmNJdGVyYXRvcj1mdW5jdGlvbigpeyRqc2NvbXAuaW5pdFN5bWJvbCgpO3ZhciBtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yO218fChtPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbC5hc3luY0l0ZXJhdG9yPSRqc2NvbXAuZ2xvYmFsLlN5bWJvbChcIlN5bWJvbC5hc3luY0l0ZXJhdG9yXCIpKTskanNjb21wLmluaXRTeW1ib2xBc3luY0l0ZXJhdG9yPWZ1bmN0aW9uKCl7fX07JGpzY29tcC5pdGVyYXRvclByb3RvdHlwZT1mdW5jdGlvbihtKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO209e25leHQ6bX07bVskanNjb21wLmdsb2JhbC5TeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBtfTtcbiRqc2NvbXAuaXRlcmF0b3JGcm9tQXJyYXk9ZnVuY3Rpb24obSxxKXskanNjb21wLmluaXRTeW1ib2xJdGVyYXRvcigpO20gaW5zdGFuY2VvZiBTdHJpbmcmJihtKz1cIlwiKTt2YXIgYT0wLGM9e25leHQ6ZnVuY3Rpb24oKXtpZihhPG0ubGVuZ3RoKXt2YXIgYj1hKys7cmV0dXJue3ZhbHVlOnEoYixtW2JdKSxkb25lOiExfX1jLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTtyZXR1cm4gYy5uZXh0KCl9fTtjW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gY307cmV0dXJuIGN9OyRqc2NvbXAucG9seWZpbGwoXCJBcnJheS5wcm90b3R5cGUudmFsdWVzXCIsZnVuY3Rpb24obSl7cmV0dXJuIG0/bTpmdW5jdGlvbigpe3JldHVybiAkanNjb21wLml0ZXJhdG9yRnJvbUFycmF5KHRoaXMsZnVuY3Rpb24obSxhKXtyZXR1cm4gYX0pfX0sXCJlczhcIixcImVzM1wiKTtcbihmdW5jdGlvbihtKXtmdW5jdGlvbiBxKGMpe2lmKGFbY10pcmV0dXJuIGFbY10uZXhwb3J0czt2YXIgYj1hW2NdPXtpOmMsbDohMSxleHBvcnRzOnt9fTttW2NdLmNhbGwoYi5leHBvcnRzLGIsYi5leHBvcnRzLHEpO2IubD0hMDtyZXR1cm4gYi5leHBvcnRzfXZhciBhPXt9O3EubT1tO3EuYz1hO3EuZD1mdW5jdGlvbihhLGIsZSl7cS5vKGEsYil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6ITAsZ2V0OmV9KX07cS5yPWZ1bmN0aW9uKGEpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfTtxLnQ9ZnVuY3Rpb24oYSxiKXtiJjEmJihhPXEoYSkpO2lmKGImOHx8YiY0JiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTtcbnZhciBjPU9iamVjdC5jcmVhdGUobnVsbCk7cS5yKGMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiZGVmYXVsdFwiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmF9KTtpZihiJjImJlwic3RyaW5nXCIhPXR5cGVvZiBhKWZvcih2YXIgZiBpbiBhKXEuZChjLGYsZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19LmJpbmQobnVsbCxmKSk7cmV0dXJuIGN9O3Eubj1mdW5jdGlvbihhKXt2YXIgYj1hJiZhLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gYVtcImRlZmF1bHRcIl19OmZ1bmN0aW9uKCl7cmV0dXJuIGF9O3EuZChiLFwiYVwiLGIpO3JldHVybiBifTtxLm89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9O3EucD1cIlwiO3JldHVybiBxKHEucz0xKX0pKFtmdW5jdGlvbihtLHEpe3E9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7cT1xfHwobmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikpKCl9Y2F0Y2goYSl7XCJvYmplY3RcIj09PVxudHlwZW9mIHdpbmRvdyYmKHE9d2luZG93KX1tLmV4cG9ydHM9cX0sZnVuY3Rpb24obSxxLGEpe2EoMik7U2suZ2xvYmFsLnN0cmZ0aW1lPWEoMyk7U2suZ2xvYmFsLnN0cnB0aW1lPWEoNCk7YSg1KTthKDcpO2EoOSk7YSgxMCk7YSgxMSk7YSgxMik7YSgxMyk7YSgxNCk7YSgxNSk7YSgxNik7YSgxNyk7YSgxOCk7W1NrLmJ1aWx0aW4ub2JqZWN0LFNrLmJ1aWx0aW4udHlwZV0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSk7YSgxOSk7YSgyMCk7YSgyMSk7W1NrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW4ubm9uZSxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLFNrLmJ1aWx0aW4ub2JqZWN0XS5mb3JFYWNoKGE9PnthPWEucHJvdG90eXBlO2EuX19kb2NfXz1hLmhhc093blByb3BlcnR5KFwidHAkZG9jXCIpP25ldyBTay5idWlsdGluLnN0cihhLnRwJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfSk7XG5hKDIyKTthKDIzKTthKDI0KTthKDI1KTthKDI2KTthKDI3KTthKDI4KTthKDI5KTthKDMxKTthKDMyKTthKDMzKTthKDM0KTthKDM1KTthKDM2KTthKDM3KTthKDM4KTthKDM5KTthKDQwKTthKDQxKTthKDQyKTthKDQzKTthKDQ0KTthKDQ1KTthKDQ2KTthKDQ3KTthKDQ4KTthKDQ5KTthKDUwKTthKDUxKTthKDUyKTthKDUzKTthKDU0KTthKDU1KTthKDU2KTthKDU3KTthKDU4KTthKDU5KTthKDYwKTthKDYxKTthKDYyKTthKDYzKTthKDY0KTthKDY1KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhKXt2YXIgYj17YnVpbGQ6e2dpdGhhc2g6XCIzNDg0N2VjNzVjZTIxMjc0MTM5MzgyNzI1ODA2NTAxMDA0NjMyODE5XCIsZGF0ZTpcIjIwMjEtMDYtMDdUMTU6NDY6MDAuODA0WlwifX07Yi5nbG9iYWw9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhP2E6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBzZWxmP3NlbGY6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2IuZXhwb3J0U3ltYm9sPVxuZnVuY3Rpb24oYSxjKXthPWEuc3BsaXQoXCIuXCIpO3ZhciBlPWIuZ2xvYmFsLGY7Zm9yKGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZD1hW2ZdO2U9ZS5oYXNPd25Qcm9wZXJ0eShkKT9lW2RdOmVbZF09e319XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiYoZD1hW2ZdLGVbZF09Yyl9O2IuaXNBcnJheUxpa2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheXx8YSYmYS5sZW5ndGgmJlwibnVtYmVyXCI9PXR5cGVvZiBhLmxlbmd0aD8hMDohMX07Yi5qc19iZWF1dGlmeT1mdW5jdGlvbihhKXtyZXR1cm4gYX07Yi5leHBvcnRTeW1ib2woXCJTa1wiLGIpO2IuZXhwb3J0U3ltYm9sKFwiU2suZ2xvYmFsXCIsYi5nbG9iYWwpO2IuZXhwb3J0U3ltYm9sKFwiU2suYnVpbGRcIixiLmJ1aWxkKTtiLmV4cG9ydFN5bWJvbChcIlNrLmV4cG9ydFN5bWJvbFwiLGIuZXhwb3J0U3ltYm9sKTtiLmV4cG9ydFN5bWJvbChcIlNrLmlzQXJyYXlMaWtlXCIsYi5pc0FycmF5TGlrZSk7Yi5leHBvcnRTeW1ib2woXCJTay5qc19iZWF1dGlmeVwiLFxuYi5qc19iZWF1dGlmeSl9KS5jYWxsKHRoaXMsYSgwKSl9LGZ1bmN0aW9uKG0scSl7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShrLG4sQSl7ZnVuY3Rpb24gcChhLGQsayxnKXtmb3IodmFyIHk9XCJcIixuPW51bGwsdj0hMSxMPWEubGVuZ3RoLEc9ITEsRT0wO0U8TDtFKyspe3ZhciBBPWEuY2hhckNvZGVBdChFKTtpZighMD09PXYpaWYoNDU9PT1BKW49XCJcIjtlbHNlIGlmKDk1PT09QSluPVwiIFwiO2Vsc2UgaWYoNDg9PT1BKW49XCIwXCI7ZWxzZSBpZig1OD09PUEpRyYmaChcIltXQVJOSU5HXSBkZXRlY3RlZCB1c2Ugb2YgdW5zdXBwb3J0ZWQgJTo6IG9yICU6OjogbW9kaWZpZXJzIHRvIHN0cmZ0aW1lXCIpLEc9ITA7ZWxzZXtzd2l0Y2goQSl7Y2FzZSAzNzp5Kz1cIiVcIjticmVhaztjYXNlIDY1OnkrPWsuZGF5c1tkLmdldERheSgpXTticmVhaztjYXNlIDY2OnkrPWsubW9udGhzW2QuZ2V0TW9udGgoKV07YnJlYWs7Y2FzZSA2Nzp5Kz1jKE1hdGguZmxvb3IoZC5nZXRGdWxsWWVhcigpLzEwMCksbik7XG5icmVhaztjYXNlIDY4OnkrPXAoay5mb3JtYXRzLkQsZCxrLGcpO2JyZWFrO2Nhc2UgNzA6eSs9cChrLmZvcm1hdHMuRixkLGssZyk7YnJlYWs7Y2FzZSA3Mjp5Kz1jKGQuZ2V0SG91cnMoKSxuKTticmVhaztjYXNlIDczOnkrPWMoZShkLmdldEhvdXJzKCkpLG4pO2JyZWFrO2Nhc2UgNzY6eSs9YihNYXRoLmZsb29yKGclMUUzKSk7YnJlYWs7Y2FzZSA3Nzp5Kz1jKGQuZ2V0TWludXRlcygpLG4pO2JyZWFrO2Nhc2UgODA6eSs9MTI+ZC5nZXRIb3VycygpP2suYW06ay5wbTticmVhaztjYXNlIDgyOnkrPXAoay5mb3JtYXRzLlIsZCxrLGcpO2JyZWFrO2Nhc2UgODM6eSs9YyhkLmdldFNlY29uZHMoKSxuKTticmVhaztjYXNlIDg0OnkrPXAoay5mb3JtYXRzLlQsZCxrLGcpO2JyZWFrO2Nhc2UgODU6eSs9YyhmKGQsXCJzdW5kYXlcIiksbik7YnJlYWs7Y2FzZSA4Nzp5Kz1jKGYoZCxcIm1vbmRheVwiKSxuKTticmVhaztjYXNlIDg4OnkrPXAoay5mb3JtYXRzLlgsZCxrLGcpO2JyZWFrO2Nhc2UgODk6eSs9XG5kLmdldEZ1bGxZZWFyKCk7YnJlYWs7Y2FzZSA5MDpEJiYwPT09Qj95Kz1cIkdNVFwiOihuPWQudG9TdHJpbmcoKS5tYXRjaCgvXFwoKFtcXHdcXHNdKylcXCkvKSx5Kz1uJiZuWzFdfHxcIlwiKTticmVhaztjYXNlIDk3OnkrPWsuc2hvcnREYXlzW2QuZ2V0RGF5KCldO2JyZWFrO2Nhc2UgOTg6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgOTk6eSs9cChrLmZvcm1hdHMuYyxkLGssZyk7YnJlYWs7Y2FzZSAxMDA6eSs9YyhkLmdldERhdGUoKSxuKTticmVhaztjYXNlIDEwMTp5Kz1jKGQuZ2V0RGF0ZSgpLG51bGw9PW4/XCIgXCI6bik7YnJlYWs7Y2FzZSAxMDQ6eSs9ay5zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldO2JyZWFrO2Nhc2UgMTA2Om49bmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLDAsMSk7bj1NYXRoLmNlaWwoKGQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpKS84NjRFNSk7eSs9YihuKTticmVhaztjYXNlIDEwNzp5Kz1jKGQuZ2V0SG91cnMoKSxudWxsPT1uP1wiIFwiOm4pO1xuYnJlYWs7Y2FzZSAxMDg6eSs9YyhlKGQuZ2V0SG91cnMoKSksbnVsbD09bj9cIiBcIjpuKTticmVhaztjYXNlIDEwOTp5Kz1jKGQuZ2V0TW9udGgoKSsxLG4pO2JyZWFrO2Nhc2UgMTEwOnkrPVwiXFxuXCI7YnJlYWs7Y2FzZSAxMTE6bj1kLmdldERhdGUoKTt5PWsub3JkaW5hbFN1ZmZpeGVzP3krKFN0cmluZyhuKSsoay5vcmRpbmFsU3VmZml4ZXNbbi0xXXx8bChuKSkpOnkrKFN0cmluZyhuKStsKG4pKTticmVhaztjYXNlIDExMjp5Kz0xMj5kLmdldEhvdXJzKCk/ay5BTTprLlBNO2JyZWFrO2Nhc2UgMTE0OnkrPXAoay5mb3JtYXRzLnIsZCxrLGcpO2JyZWFrO2Nhc2UgMTE1OnkrPU1hdGguZmxvb3IoZy8xRTMpO2JyZWFrO2Nhc2UgMTE2OnkrPVwiXFx0XCI7YnJlYWs7Y2FzZSAxMTc6bj1kLmdldERheSgpO3krPTA9PT1uPzc6bjticmVhaztjYXNlIDExODp5Kz1wKGsuZm9ybWF0cy52LGQsayxnKTticmVhaztjYXNlIDExOTp5Kz1kLmdldERheSgpO2JyZWFrO2Nhc2UgMTIwOnkrPXAoay5mb3JtYXRzLngsXG5kLGssZyk7YnJlYWs7Y2FzZSAxMjE6eSs9KFwiXCIrZC5nZXRGdWxsWWVhcigpKS5zbGljZSgyKTticmVhaztjYXNlIDEyMjpEJiYwPT09Qj95Kz1HP1wiKzAwOjAwXCI6XCIrMDAwMFwiOihuPTAhPT1CP0IvNkU0Oi1kLmdldFRpbWV6b25lT2Zmc2V0KCksdj1HP1wiOlwiOlwiXCIsQT1NYXRoLmFicyhuJTYwKSx5Kz0oMD5uP1wiLVwiOlwiK1wiKStjKE1hdGguZmxvb3IoTWF0aC5hYnMobi82MCkpKSt2K2MoQSkpO2JyZWFrO2RlZmF1bHQ6diYmKHkrPVwiJVwiKSx5Kz1hW0VdfW49bnVsbDt2PSExfWVsc2UgMzc9PT1BP3Y9ITA6eSs9YVtFXX1yZXR1cm4geX12YXIgdj1rfHxnLEI9bnx8MCxEPUF8fCExLEU9MCx1LG09ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgZD1iLmdldFRpbWUoKTtpZihEKXt2YXIgYz02RTQqKGIuZ2V0VGltZXpvbmVPZmZzZXQoKXx8MCk7Yj1uZXcgRGF0ZShkK2MrQik7NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fDApIT09YyYmKGI9NkU0KihiLmdldFRpbWV6b25lT2Zmc2V0KCl8fFxuMCksYj1uZXcgRGF0ZShkK2IrQikpfX1lbHNlIGQ9RGF0ZS5ub3coKSxkPkU/KEU9ZCx1PW5ldyBEYXRlKEUpLGQ9RSxEJiYodT1uZXcgRGF0ZShFKzZFNCoodS5nZXRUaW1lem9uZU9mZnNldCgpfHwwKStCKSkpOmQ9RSxiPXU7cmV0dXJuIHAoYSxiLHYsZCl9O20ubG9jYWxpemU9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBhKGJ8fHYsQixEKX07bS5sb2NhbGl6ZUJ5SWRlbnRpZmllcj1mdW5jdGlvbihhKXt2YXIgYj1kW2FdO3JldHVybiBiP20ubG9jYWxpemUoYik6KGgoJ1tXQVJOSU5HXSBObyBsb2NhbGUgZm91bmQgd2l0aCBpZGVudGlmaWVyIFwiJythKydcIi4nKSxtKX07bS50aW1lem9uZT1mdW5jdGlvbihiKXt2YXIgZD1CLGM9RCxlPXR5cGVvZiBiO2lmKFwibnVtYmVyXCI9PT1lfHxcInN0cmluZ1wiPT09ZSljPSEwLFwic3RyaW5nXCI9PT1lPyhkPVwiLVwiPT09YlswXT8tMToxLGU9cGFyc2VJbnQoYi5zbGljZSgxLDMpLDEwKSxiPXBhcnNlSW50KGIuc2xpY2UoMyw1KSwxMCksZD1kKig2MCpcbmUrYikqNkU0KTpcIm51bWJlclwiPT09ZSYmKGQ9NkU0KmIpO3JldHVybiBuZXcgYSh2LGQsYyl9O20udXRjPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBhKHYsQiwhMCl9O3JldHVybiBtfWZ1bmN0aW9uIGMoYSxiKXtpZihcIlwiPT09Ynx8OTxhKXJldHVybiBhO251bGw9PWImJihiPVwiMFwiKTtyZXR1cm4gYithfWZ1bmN0aW9uIGIoYSl7cmV0dXJuIDk5PGE/YTo5PGE/XCIwXCIrYTpcIjAwXCIrYX1mdW5jdGlvbiBlKGEpe3JldHVybiAwPT09YT8xMjoxMjxhP2EtMTI6YX1mdW5jdGlvbiBmKGEsYil7Yj1ifHxcInN1bmRheVwiO3ZhciBkPWEuZ2V0RGF5KCk7XCJtb25kYXlcIj09PWImJigwPT09ZD9kPTY6ZC0tKTtiPURhdGUuVVRDKGEuZ2V0RnVsbFllYXIoKSwwLDEpO2E9RGF0ZS5VVEMoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSxhLmdldERhdGUoKSk7cmV0dXJuIE1hdGguZmxvb3IoKE1hdGguZmxvb3IoKGEtYikvODY0RTUpKzctZCkvNyl9ZnVuY3Rpb24gbChhKXt2YXIgYj1hJTEwO2ElPTEwMDtcbmlmKDExPD1hJiYxMz49YXx8MD09PWJ8fDQ8PWIpcmV0dXJuXCJ0aFwiO3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuXCJzdFwiO2Nhc2UgMjpyZXR1cm5cIm5kXCI7Y2FzZSAzOnJldHVyblwicmRcIn19ZnVuY3Rpb24gaChhKXtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGNvbnNvbGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGEpfXZhciBkPXtkZV9ERTp7ZGF5czpcIlNvbm50YWcgTW9udGFnIERpZW5zdGFnIE1pdHR3b2NoIERvbm5lcnN0YWcgRnJlaXRhZyBTYW1zdGFnXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlNvIE1vIERpIE1pIERvIEZyIFNhXCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhciBGZWJydWFyIE1cXHUwMGU0cnogQXByaWwgTWFpIEp1bmkgSnVsaSBBdWd1c3QgU2VwdGVtYmVyIE9rdG9iZXIgTm92ZW1iZXIgRGV6ZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1cXHUwMGU0ciBBcHIgTWFpIEp1biBKdWwgQXVnIFNlcCBPa3QgTm92IERlelwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQuJW0uJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGVuX0NBOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVuX1VTOntkYXlzOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0XCIuc3BsaXQoXCIgXCIpLG1vbnRoczpcIkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlY1wiLnNwbGl0KFwiIFwiKSxvcmRpbmFsU3VmZml4ZXM6XCJzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdCBuZCByZCB0aCB0aCB0aCB0aCB0aCB0aCB0aCBzdFwiLnNwbGl0KFwiIFwiKSxcbkFNOlwiQU1cIixQTTpcIlBNXCIsYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJW0vJWQvJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJXJcIix4OlwiJURcIn19LGVzX01YOntkYXlzOlwiZG9taW5nbyBsdW5lcyBtYXJ0ZXMgbWlcXHUwMGU5cmNvbGVzIGp1ZXZlcyB2aWVybmVzIHNcXHUwMGUxYmFkb1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtaVxcdTAwZTkganVlIHZpZSBzXFx1MDBlMWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZW5lcm87ZmVicmVybzttYXJ6bzthYnJpbDttYXlvO2p1bmlvO2p1bGlvO2Fnb3N0bztzZXB0aWVtYnJlO29jdHVicmU7bm92aWVtYnJlOyBkaWNpZW1icmVcIi5zcGxpdChcIjtcIiksc2hvcnRNb250aHM6XCJlbmUgZmViIG1hciBhYnIgbWF5IGp1biBqdWwgYWdvIHNlcCBvY3Qgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLFxuYW06XCJhbVwiLHBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LGZyX0ZSOntkYXlzOlwiZGltYW5jaGUgbHVuZGkgbWFyZGkgbWVyY3JlZGkgamV1ZGkgdmVuZHJlZGkgc2FtZWRpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcImRpbS4gbHVuLiBtYXIuIG1lci4gamV1LiB2ZW4uIHNhbS5cIi5zcGxpdChcIiBcIiksbW9udGhzOlwiamFudmllciBmXFx1MDBlOXZyaWVyIG1hcnMgYXZyaWwgbWFpIGp1aW4ganVpbGxldCBhb1xcdTAwZmJ0IHNlcHRlbWJyZSBvY3RvYnJlIG5vdmVtYnJlIGRcXHUwMGU5Y2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiamFudi4gZlxcdTAwZTl2ci4gbWFycyBhdnJpbCBtYWkganVpbiBqdWlsLiBhb1xcdTAwZmJ0IHNlcHQuIG9jdC4gbm92LiBkXFx1MDBlOWMuXCIuc3BsaXQoXCIgXCIpLEFNOlwiQU1cIixcblBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0saXRfSVQ6e2RheXM6XCJkb21lbmljYSBsdW5lZFxcdTAwZWMgbWFydGVkXFx1MDBlYyBtZXJjb2xlZFxcdTAwZWMgZ2lvdmVkXFx1MDBlYyB2ZW5lcmRcXHUwMGVjIHNhYmF0b1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJkb20gbHVuIG1hciBtZXIgZ2lvIHZlbiBzYWJcIi5zcGxpdChcIiBcIiksbW9udGhzOlwiZ2VubmFpbyBmZWJicmFpbyBtYXJ6byBhcHJpbGUgbWFnZ2lvIGdpdWdubyBsdWdsaW8gYWdvc3RvIHNldHRlbWJyZSBvdHRvYnJlIG5vdmVtYnJlIGRpY2VtYnJlXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwicHIgbWFnIGdpdSBsdWcgYWdvIHNldCBvdHQgbm92IGRpY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixcbnBtOlwicG1cIixmb3JtYXRzOntjOlwiJWEgJWQgJWIgJVkgJVggJVpcIixEOlwiJWQvJW0vJVlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LG5sX05MOntkYXlzOlwiem9uZGFnIG1hYW5kYWcgZGluc2RhZyB3b2Vuc2RhZyBkb25kZXJkYWcgdnJpamRhZyB6YXRlcmRhZ1wiLnNwbGl0KFwiIFwiKSxzaG9ydERheXM6XCJ6byBtYSBkaSB3byBkbyB2ciB6YVwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW51YXJpIGZlYnJ1YXJpIG1hYXJ0IGFwcmlsIG1laSBqdW5pIGp1bGkgYXVndXN0dXMgc2VwdGVtYmVyIG9rdG9iZXIgbm92ZW1iZXIgZGVjZW1iZXJcIi5zcGxpdChcIiBcIiksc2hvcnRNb250aHM6XCJqYW4gZmViIG1ydCBhcHIgbWVpIGp1biBqdWwgYXVnIHNlcCBva3Qgbm92IGRlY1wiLnNwbGl0KFwiIFwiKSxBTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYICVaXCIsXG5EOlwiJWQtJW0tJXlcIixGOlwiJVktJW0tJWRcIixSOlwiJUg6JU1cIixyOlwiJUk6JU06JVMgJXBcIixUOlwiJUg6JU06JVNcIix2OlwiJWUtJWItJVlcIixYOlwiJVRcIix4OlwiJURcIn19LHB0X0JSOntkYXlzOlwiZG9taW5nbyBzZWd1bmRhIHRlclxcdTAwZTdhIHF1YXJ0YSBxdWludGEgc2V4dGEgc1xcdTAwZTFiYWRvXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIkRvbSBTZWcgVGVyIFF1YSBRdWkgU2V4IFNcXHUwMGUxYlwiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJqYW5laXJvIGZldmVyZWlybyBtYXJcXHUwMGU3byBhYnJpbCBtYWlvIGp1bmhvIGp1bGhvIGFnb3N0byBzZXRlbWJybyBvdXR1YnJvIG5vdmVtYnJvIGRlemVtYnJvXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiSmFuIEZldiBNYXIgQWJyIE1haSBKdW4gSnVsIEFnbyBTZXQgT3V0IE5vdiBEZXpcIi5zcGxpdChcIiBcIiksQU06XCJBTVwiLFBNOlwiUE1cIixhbTpcImFtXCIscG06XCJwbVwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFxuUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSxydV9SVTp7ZGF5czpcIlxcdTA0MTJcXHUwNDNlXFx1MDQ0MVxcdTA0M2FcXHUwNDQwXFx1MDQzNVxcdTA0NDFcXHUwNDM1XFx1MDQzZFxcdTA0NGNcXHUwNDM1IFxcdTA0MWZcXHUwNDNlXFx1MDQzZFxcdTA0MzVcXHUwNDM0XFx1MDQzNVxcdTA0M2JcXHUwNDRjXFx1MDQzZFxcdTA0MzhcXHUwNDNhIFxcdTA0MTJcXHUwNDQyXFx1MDQzZVxcdTA0NDBcXHUwNDNkXFx1MDQzOFxcdTA0M2EgXFx1MDQyMVxcdTA0NDBcXHUwNDM1XFx1MDQzNFxcdTA0MzAgXFx1MDQyN1xcdTA0MzVcXHUwNDQyXFx1MDQzMlxcdTA0MzVcXHUwNDQwXFx1MDQzMyBcXHUwNDFmXFx1MDQ0ZlxcdTA0NDJcXHUwNDNkXFx1MDQzOFxcdTA0NDZcXHUwNDMwIFxcdTA0MjFcXHUwNDQzXFx1MDQzMVxcdTA0MzFcXHUwNDNlXFx1MDQ0MlxcdTA0MzBcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1MDQxMlxcdTA0NDEgXFx1MDQxZlxcdTA0M2QgXFx1MDQxMlxcdTA0NDIgXFx1MDQyMVxcdTA0NDAgXFx1MDQyN1xcdTA0NDIgXFx1MDQxZlxcdTA0NDIgXFx1MDQyMVxcdTA0MzFcIi5zcGxpdChcIiBcIiksXG5tb250aHM6XCJcXHUwNDJmXFx1MDQzZFxcdTA0MzJcXHUwNDMwXFx1MDQ0MFxcdTA0NGMgXFx1MDQyNFxcdTA0MzVcXHUwNDMyXFx1MDQ0MFxcdTA0MzBcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0NDBcXHUwNDQyIFxcdTA0MTBcXHUwNDNmXFx1MDQ0MFxcdTA0MzVcXHUwNDNiXFx1MDQ0YyBcXHUwNDFjXFx1MDQzMFxcdTA0MzkgXFx1MDQxOFxcdTA0NGVcXHUwNDNkXFx1MDQ0YyBcXHUwNDE4XFx1MDQ0ZVxcdTA0M2JcXHUwNDRjIFxcdTA0MTBcXHUwNDMyXFx1MDQzM1xcdTA0NDNcXHUwNDQxXFx1MDQ0MiBcXHUwNDIxXFx1MDQzNVxcdTA0M2RcXHUwNDQyXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDFlXFx1MDQzYVxcdTA0NDJcXHUwNDRmXFx1MDQzMVxcdTA0NDBcXHUwNDRjIFxcdTA0MWRcXHUwNDNlXFx1MDQ0ZlxcdTA0MzFcXHUwNDQwXFx1MDQ0YyBcXHUwNDE0XFx1MDQzNVxcdTA0M2FcXHUwNDMwXFx1MDQzMVxcdTA0NDBcXHUwNDRjXCIuc3BsaXQoXCIgXCIpLHNob3J0TW9udGhzOlwiXFx1MDQ0ZlxcdTA0M2RcXHUwNDMyIFxcdTA0NDRcXHUwNDM1XFx1MDQzMiBcXHUwNDNjXFx1MDQzMFxcdTA0NDAgXFx1MDQzMFxcdTA0M2ZcXHUwNDQwIFxcdTA0M2NcXHUwNDMwXFx1MDQzOSBcXHUwNDM4XFx1MDQ0ZVxcdTA0M2QgXFx1MDQzOFxcdTA0NGVcXHUwNDNiIFxcdTA0MzBcXHUwNDMyXFx1MDQzMyBcXHUwNDQxXFx1MDQzNVxcdTA0M2QgXFx1MDQzZVxcdTA0M2FcXHUwNDQyIFxcdTA0M2RcXHUwNDNlXFx1MDQ0ZiBcXHUwNDM0XFx1MDQzNVxcdTA0M2FcIi5zcGxpdChcIiBcIiksXG5BTTpcIkFNXCIsUE06XCJQTVwiLGFtOlwiYW1cIixwbTpcInBtXCIsZm9ybWF0czp7YzpcIiVhICVkICViICVZICVYXCIsRDpcIiVkLiVtLiV5XCIsRjpcIiVZLSVtLSVkXCIsUjpcIiVIOiVNXCIscjpcIiVJOiVNOiVTICVwXCIsVDpcIiVIOiVNOiVTXCIsdjpcIiVlLSViLSVZXCIsWDpcIiVUXCIseDpcIiVEXCJ9fSx0cl9UUjp7ZGF5czpcIlBhemFyIFBhemFydGVzaSBTYWxcXHUwMTMxIFxcdTAwYzdhclxcdTAxNWZhbWJhIFBlclxcdTAxNWZlbWJlIEN1bWEgQ3VtYXJ0ZXNpXCIuc3BsaXQoXCIgXCIpLHNob3J0RGF5czpcIlBheiBQenQgU2FsIFxcdTAwYzdyXFx1MDE1ZiBQclxcdTAxNWYgQ3VtIEN0c1wiLnNwbGl0KFwiIFwiKSxtb250aHM6XCJPY2FrIFxcdTAxNWV1YmF0IE1hcnQgTmlzYW4gTWF5XFx1MDEzMXMgSGF6aXJhbiBUZW1tdXogQVxcdTAxMWZ1c3RvcyBFeWxcXHUwMGZjbCBFa2ltIEthc1xcdTAxMzFtIEFyYWxcXHUwMTMxa1wiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIk9jYSBcXHUwMTVldWIgTWFyIE5pcyBNYXkgSGF6IFRlbSBBXFx1MDExZnUgRXlsIEVraSBLYXMgQXJhXCIuc3BsaXQoXCIgXCIpLFxuQU06XCJcXHUwMGQ2XFx1MDBkNlwiLFBNOlwiXFx1MDBkNlNcIixhbTpcIlxcdTAwZDZcXHUwMGQ2XCIscG06XCJcXHUwMGQ2U1wiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC0lbS0lWVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlVFwiLHg6XCIlRFwifX0semhfQ046e2RheXM6XCJcXHU2NjFmXFx1NjcxZlxcdTY1ZTUgXFx1NjYxZlxcdTY3MWZcXHU0ZTAwIFxcdTY2MWZcXHU2NzFmXFx1NGU4YyBcXHU2NjFmXFx1NjcxZlxcdTRlMDkgXFx1NjYxZlxcdTY3MWZcXHU1NmRiIFxcdTY2MWZcXHU2NzFmXFx1NGU5NCBcXHU2NjFmXFx1NjcxZlxcdTUxNmRcIi5zcGxpdChcIiBcIiksc2hvcnREYXlzOlwiXFx1NjVlNVxcdTRlMDBcXHU0ZThjXFx1NGUwOVxcdTU2ZGJcXHU0ZTk0XFx1NTE2ZFwiLnNwbGl0KFwiXCIpLG1vbnRoczpcIlxcdTRlMDBcXHU2NzA4XFx1NGVmZCBcXHU0ZThjXFx1NjcwOFxcdTRlZmQgXFx1NGUwOVxcdTY3MDhcXHU0ZWZkIFxcdTU2ZGJcXHU2NzA4XFx1NGVmZCBcXHU0ZTk0XFx1NjcwOFxcdTRlZmQgXFx1NTE2ZFxcdTY3MDhcXHU0ZWZkIFxcdTRlMDNcXHU2NzA4XFx1NGVmZCBcXHU1MTZiXFx1NjcwOFxcdTRlZmQgXFx1NGU1ZFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU2NzA4XFx1NGVmZCBcXHU1MzQxXFx1NGUwMFxcdTY3MDhcXHU0ZWZkIFxcdTUzNDFcXHU0ZThjXFx1NjcwOFxcdTRlZmRcIi5zcGxpdChcIiBcIiksXG5zaG9ydE1vbnRoczpcIlxcdTRlMDBcXHU2NzA4IFxcdTRlOGNcXHU2NzA4IFxcdTRlMDlcXHU2NzA4IFxcdTU2ZGJcXHU2NzA4IFxcdTRlOTRcXHU2NzA4IFxcdTUxNmRcXHU2NzA4IFxcdTRlMDNcXHU2NzA4IFxcdTUxNmJcXHU2NzA4IFxcdTRlNWRcXHU2NzA4IFxcdTUzNDFcXHU2NzA4IFxcdTUzNDFcXHU0ZTAwXFx1NjcwOCBcXHU1MzQxXFx1NGU4Y1xcdTY3MDhcIi5zcGxpdChcIiBcIiksQU06XCJcXHU0ZTBhXFx1NTM0OFwiLFBNOlwiXFx1NGUwYlxcdTUzNDhcIixhbTpcIlxcdTRlMGFcXHU1MzQ4XCIscG06XCJcXHU0ZTBiXFx1NTM0OFwiLGZvcm1hdHM6e2M6XCIlYSAlZCAlYiAlWSAlWCAlWlwiLEQ6XCIlZC8lbS8leVwiLEY6XCIlWS0lbS0lZFwiLFI6XCIlSDolTVwiLHI6XCIlSTolTTolUyAlcFwiLFQ6XCIlSDolTTolU1wiLHY6XCIlZS0lYi0lWVwiLFg6XCIlclwiLHg6XCIlRFwifX19LGc9ZC5lbl9VUyxuPW5ldyBhKGcsMCwhMSk7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtKXZhciBrPW0uZXhwb3J0cz1uO2Vsc2Ugaz1mdW5jdGlvbigpe3JldHVybiB0aGlzfHwoMCxldmFsKShcInRoaXNcIil9KCksXG5rLnN0cmZ0aW1lPW47XCJmdW5jdGlvblwiIT09dHlwZW9mIERhdGUubm93JiYoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KX0pKCl9LGZ1bmN0aW9uKG0scSxhKXsoZnVuY3Rpb24oKXt2YXIgYT1mdW5jdGlvbihiLGMsZil7cmV0dXJuIGEucGFyc2UoYixjLGYpfTthLnZlcnNpb249XCIwLjAuMVwiOyhtLmV4cG9ydHM9YSkuc3RycHRpbWU9YTthLmxvY2FsZT17YTpcIlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdFwiLnNwbGl0KFwiIFwiKSxBOlwiU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXlcIi5zcGxpdChcIiBcIiksYjpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLEI6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGY6XCJKYW4uIEZlYi4gTWFyLiBBcHIuIE1heSBKdW4uIEp1bC4gQXVnLiBTZXAuIE9jdC4gTm92LiBEZWMuXCIuc3BsaXQoXCIgXCIpLFxuYzpcIiVZLSVtLSVkICVIOiVNOiVTXCIsUDpbXCJhbVwiLFwicG1cIl0scjpcIiVJOiVNOiVTICVwXCIseDpcIiVtLyVkLyV5XCIsWDpcIiVIOiVNOiVTXCIsZGF5OltcIlllc3RlcmRheVwiLFwiVG9kYXlcIixcIlRvbW9ycm93XCJdLGJnOlwiSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWNcIi5zcGxpdChcIiBcIiksQmc6XCJKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkgQXVndXN0IFNlcHRlbWJlciBPY3RvYmVyIE5vdmVtYmVyIERlY2VtYmVyXCIuc3BsaXQoXCIgXCIpLGZnOlwiSmFuLiBGZWIuIE1hci4gQXByLiBNYXkgSnVuLiBKdWwuIEF1Zy4gU2VwLiBPY3QuIE5vdi4gRGVjLlwiLnNwbGl0KFwiIFwiKSxEYXRlX2RCWV95ZWFyX2luX0hNOlwiJSNCICUtZCwgJVkgYXQgJS1IOiVNXCIsRGF0ZV9kQllfeWVhcjpcIiUjQiAlLWQsICVZXCIsRGF0ZV9kQlk6XCIlI0IgJS1kLCAlWVwiLERhdGVfQWRCWTpcIiVBLCAlI0IgJS1kLCAlWVwiLERhdGVfZEJBOlwiJSNCICUtZCwgJUFcIixcbkRhdGVfZGZfaW5fSE06XCIlI2YsICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmWTpcIiUtZCAlI2YgJVlcIixEYXRlX2RCX2luX0hNOlwiJSNCICUtZCBhdCAlLUg6JU1cIixEYXRlX2RmOlwiJS1kICUjZlwifTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGMsZSxmLGgsbCl7Yz1TdHJpbmcoYyk7ZT1TdHJpbmcoZSk7Yz1jLnJlcGxhY2UoL15bI18wXFxeXFwtIX5dKy8sXCJcIik7Zj1kW2NdO2lmKCFmKXJldHVybiBhO3ZhciBrPSExOy0xPT09ZS5pbmRleE9mKFwiIVwiKSYmMT09PWMubGVuZ3RoJiYoLTE8ZS5pbmRleE9mKFwiflwiKXx8LTE8XCJiQmZcIi5pbmRleE9mKGMpJiYvJVswXFwtX10/ZFtcXHNdKyQvLnRlc3QobC5zdWJzdHIoMCxoKSkpJiYoaz0hMCk7aWYoKFwiSVwiPT09Y3x8XCJsXCI9PT1jKSYmIS8lW3BQXS8udGVzdChsKSl0aHJvdyBFcnJvcihcIlVuZGVmaW5lZCBBTS9QTVwiKTtzd2l0Y2godHlwZW9mIGYpe2Nhc2UgXCJmdW5jdGlvblwiOnJldHVybiBmKCk7Y2FzZSBcInN0cmluZ1wiOnJldHVybiBmO2Nhc2UgXCJvYmplY3RcIjpyZXR1cm4gYi5tYWtlLnB1c2goW2YubWFrZSxcbmUsa10pLFwiKFwiK2YucmVnK1wiKVwiO2RlZmF1bHQ6cmV0dXJuIGF9fWZ1bmN0aW9uIGMoYSxiKXthPVN0cmluZyhhKTtiPVN0cmluZyhiKTtyZXR1cm4tMSE9PWIuaW5kZXhPZihcIiNcIik/YS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpOi0xIT09Yi5pbmRleE9mKFwiXlwiKT9hLnN1YnN0cigwLDEpK2Euc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk6YX12YXIgbD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMubGVuZ3RoLGQ9MDtkPGI7KXtpZihhPT10aGlzW2RdKXJldHVybiBkO2QrK31yZXR1cm4tMX0saD1hLmxvY2FsZSxkPXtcIiVcIjpcIlxcXFwlXCIsYTpcIlxcXFxTK1wiLEE6XCJcXFxcUytcIixiOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5iZzpoLmIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGg6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxcbmIsZCxlKXtiPWwuY2FsbChlP2guYmc6aC5iLGMoYixkKSk7aWYoLTE9PT1iKXJldHVybiExO2Euc2V0VVRDTW9udGgoYik7cmV0dXJuITB9fSxCOntyZWc6XCJcXFxcUytcIixtYWtlOmZ1bmN0aW9uKGEsYixkLGUpe2I9bC5jYWxsKGU/aC5CZzpoLkIsYyhiLGQpKTtpZigtMT09PWIpcmV0dXJuITE7YS5zZXRVVENNb250aChiKTtyZXR1cm4hMH19LGY6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiLGQsZSl7Yj1sLmNhbGwoZT9oLmZnOmguZixjKGIsZCkpO2lmKC0xPT09YilyZXR1cm4hMTthLnNldFVUQ01vbnRoKGIpO3JldHVybiEwfX0sZzp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sRzp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsXG5iKXtiPXBhcnNlSW50KGIsMTApO2Euc2V0VVRDRnVsbFllYXIoYik7cmV0dXJuITB9fSxkOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDMxPGIpcmV0dXJuITE7YS5zZXRVVENEYXRlKGIpO3JldHVybiEwfX0sZTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwzMTxiKXJldHVybiExO2Euc2V0VVRDRGF0ZShiKTtyZXR1cm4hMH19LEg6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPXBhcnNlSW50KGIsMTApO2lmKDA+Ynx8MjM8YilyZXR1cm4hMTthLnNldFVUQ0hvdXJzKGIpO3JldHVybiEwfX0sSTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMT5ifHwxMjxiKXJldHVybiExO2Euc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpK2IpO3JldHVybiEwfX0sbTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsXG5tYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENNb250aChiLTEpO3JldHVybiEwfX0sTTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw1OTxiKXJldHVybiExO2Euc2V0VVRDTWludXRlcyhiKTtyZXR1cm4hMH19LG46XCJcXFxcblwiLHA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFA6e3JlZzpcIlxcXFxTK1wiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWwuY2FsbChoLlAsYi50b0xvd2VyQ2FzZSgpKTtpZigtMT09PWIpcmV0dXJuITE7MT09PWImJmEuc2V0VVRDSG91cnMoYS5nZXRVVENIb3VycygpKzEyKTtyZXR1cm4hMH19LFM6e3JlZzpcIltcXFxcZFxcXFxzXT9cXFxcZFwiLG1ha2U6ZnVuY3Rpb24oYSxcbmIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw2MDxiKXJldHVybiExO2Euc2V0VVRDU2Vjb25kcyhiKTtyZXR1cm4hMH19LHQ6XCJcXFxcdFwiLHU6XCJcXFxcZFwiLFU6XCJbXFxcXGRcXFxcc10/XFxcXGRcIix3OlwiXFxcXGRcIixXOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIseTp7cmVnOlwiW1xcXFxkXFxcXHNdP1xcXFxkXCIsbWFrZTpmdW5jdGlvbihhLGIpe2I9cGFyc2VJbnQoYiwxMCk7aWYoMD5ifHw5OTxiKXJldHVybiExO2IrPTEwMCpwYXJzZUludCgobmV3IERhdGUpLmdldFVUQ0Z1bGxZZWFyKCkvMTAwLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sWTp7cmVnOlwiXFxcXGR7NH1cIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFVUQ0Z1bGxZZWFyKGIpO3JldHVybiEwfX0sejp7cmVnOlwiWytcXFxcLV1cXFxcZHs0fVwiLG1ha2U6ZnVuY3Rpb24oYSxiKXtiPWIubWF0Y2goL14oWytcXC1dKShcXGR7Mn0pKFxcZHsyfSkkLyk7aWYoIWIpcmV0dXJuITE7dmFyIGQ9NkU0Kig2MCpwYXJzZUludChiWzJdLDEwKStcbnBhcnNlSW50KGJbM10sMTApKTtcIitcIj09PWJbMV0mJihkPS1kKTthLnNldFRpbWUoYS5nZXRUaW1lKCkrZCk7cmV0dXJuITB9fSxsOntyZWc6XCJbXFxcXGRcXFxcc10/XFxcXGRcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTtpZigxPmJ8fDEyPGIpcmV0dXJuITE7YS5zZXRVVENIb3VycyhhLmdldFVUQ0hvdXJzKCkrYik7cmV0dXJuITB9fSxzOntyZWc6XCJcXFxcZCtcIixtYWtlOmZ1bmN0aW9uKGEsYil7Yj1wYXJzZUludChiLDEwKTthLnNldFRpbWUoMUUzKmIpO3JldHVybiEwfX0sYzpoLmMscjpoLnIsUjpcIiVIOiVNXCIsVDpcIiVIOiVNOiVTXCIseDpoLngsWDpoLlgsRDpcIiVtLyVkLyV5XCIsRjpcIiVZLSVtLSVkXCIsRGF0ZV9pc286XCIlWS0lbS0lZFQlSDolTTolU1wiLERhdGVfZEJZX3llYXJfaW5fSE06aC5EYXRlX2RCWV95ZWFyX2luX0hNLERhdGVfZEJZX3llYXI6aC5EYXRlX2RCWV95ZWFyLERhdGVfZEJZOmguRGF0ZV9kQlksRGF0ZV9kQkE6aC5EYXRlX2RCQSxEYXRlX0FkQlk6aC5EYXRlX0FkQlksXG5EYXRlX2RmX2luX0hNOmguRGF0ZV9kZl9pbl9ITSxEYXRlX2RmWTpoLkRhdGVfZGZZLERhdGVfZEJfaW5fSE06aC5EYXRlX2RCX2luX0hNLERhdGVfZG1ZX19kb3Q6XCIlZC4lbS4lWVwiLERhdGVfZGY6aC5EYXRlX2RmLERhdGVfRlQ6XCIlRiAlVFwiLERhdGVfZG1ZX19taW51czpcIiVkLSVtLSVZXCJ9O2EucGFyc2U9ZnVuY3Rpb24oYSxkLGMpe2E9U3RyaW5nKGEpO2Q9U3RyaW5nKGQpO2Zvcih2YXIgZT01Oy8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS9nLnRlc3QoZCkmJmU7KWQ9ZC5yZXBsYWNlKC8lKERhdGVfW2EtekEtWjAtOV9dK3xbY0RGclJUeFhdKS8sYiksZS0tO2IubWFrZT1bXTtkPWQucmVwbGFjZSgvJSgoWyNcXF4hfl17MCwyfSlbYUFiQmZoXXwoWzBcXC1fXT8pW2RlZ0hJbU1TVld5bF18W0ducFB0dVV3WXpacyVdKS9nLGIpO2E9YS5tYXRjaChuZXcgUmVnRXhwKGQpKTtpZighYXx8IWIubWFrZS5sZW5ndGgpcmV0dXJuIG51bGw7ZD1uZXcgRGF0ZShEYXRlLlVUQygwLFxuMCkpO2U9MDtmb3IodmFyIGs9Yi5tYWtlLmxlbmd0aDtlPGs7ZSsrKXt2YXIgZj1iLm1ha2VbZV07aWYoIWZbMF0oZCxhW2UrMV0sZlsxXSxmWzJdKSlyZXR1cm4gbnVsbH1jJiZkLnNldFRpbWUoZC5nZXRUaW1lKCkrNkU0KmQuZ2V0VGltZXpvbmVPZmZzZXQoKSk7cmV0dXJuIGR9fSkoYSl9KSgpfSxmdW5jdGlvbihtLHEsYSl7bT1hKDYpO2NvbnN0IGM9U2suZ2xvYmFsLkpTQkk9dm9pZCAwIT09U2suZ2xvYmFsLkJpZ0ludD97fTptO2lmKHZvaWQgMD09PVNrLmdsb2JhbC5CaWdJbnQpe2NvbnN0IGE9Yy5fX2lzQmlnSW50O2MuX19pc0JpZ0ludD1hP2I9Pm51bGwhPT1iJiZhKGIpOmE9PmEgaW5zdGFuY2VvZiBjO2MucG93ZXJtb2Q9KGEsYixsKT0+e2NvbnN0IGU9Yy5CaWdJbnQoMSk7bGV0IGQ9ZTtmb3IoYj1jLmdyZWF0ZXJUaGFuKGIsYy5fX1pFUk8pP2I6Yy51bmFyeU1pbnVzKGIpO2MuZ3JlYXRlclRoYW4oYixjLl9fWkVSTyk7KWMuYml0d2lzZUFuZChiLGUpJiYoZD1jLnJlbWFpbmRlcihjLm11bHRpcGx5KGQsXG5hKSxsKSksYj1jLnNpZ25lZFJpZ2h0U2hpZnQoYixlKSxhPWMucmVtYWluZGVyKGMubXVsdGlwbHkoYSxhKSxsKTtyZXR1cm4gZH19ZWxzZSBPYmplY3QuYXNzaWduKGMse0JpZ0ludDpTay5nbG9iYWwuQmlnSW50LHRvTnVtYmVyOmE9Pk51bWJlcihhKSx0b1N0cmluZzphPT5hLnRvU3RyaW5nKCksX19pc0JpZ0ludDphPT5cImJpZ2ludFwiPT09dHlwZW9mIGEsdW5hcnlNaW51czphPT4tYSxiaXR3aXNlTm90OmE9Pn5hLGJpdHdpc2VBbmQ6KGEsYyk9PmEmYyxiaXR3aXNlT3I6KGEsYyk9PmF8YyxiaXR3aXNlWG9yOihhLGMpPT5hXmMsZXhwb25lbnRpYXRlOihhLGUpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgbD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJmImJihsKj1hKSxlPj49YixhKj1hO3JldHVybiBsfSxwb3dlcm1vZDooYSxlLGYpPT57Y29uc3QgYj1jLkJpZ0ludCgxKTtsZXQgaD1iO2ZvcihlPWU+Yy5fX1pFUk8/ZTotZTtlPmMuX19aRVJPOyllJlxuYiYmKGg9aCphJWYpLGU+Pj1iLGE9YSphJWY7cmV0dXJuIGh9LG11bHRpcGx5OihhLGMpPT5hKmMsZGl2aWRlOihhLGMpPT5hL2MscmVtYWluZGVyOihhLGMpPT5hJWMsYWRkOihhLGMpPT5hK2Msc3VidHJhY3Q6KGEsYyk9PmEtYyxsZWZ0U2hpZnQ6KGEsYyk9PmE8PGMsc2lnbmVkUmlnaHRTaGlmdDooYSxjKT0+YT4+Yyx1bnNpZ25lZFJpZ2h0U2hpZnQ6KGEsYyk9PmE+Pj5jLGxlc3NUaGFuOihhLGMpPT5hPGMsbGVzc1RoYW5PckVxdWFsOihhLGMpPT5hPD1jLGdyZWF0ZXJUaGFuOihhLGMpPT5hPmMsZ3JlYXRlclRoYW5PckVxdWFsOihhLGMpPT5hPj1jLGVxdWFsOihhLGMpPT5hPT09Yyxub3RFcXVhbDooYSxjKT0+YSE9PWN9KTtjLl9fWkVSTz1jLkJpZ0ludCgwKTtjLl9fTUFYX1NBRkU9Yy5CaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MuX19NSU5fU0FGRT1jLkJpZ0ludCgtTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO2MubnVtYmVySWZTYWZlPWE9PmMubGVzc1RoYW4oYSxcbmMuX19NQVhfU0FGRSkmJmMuZ3JlYXRlclRoYW4oYSxjLl9fTUlOX1NBRkUpP2MudG9OdW1iZXIoYSk6YX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpe20uZXhwb3J0cz1iKCl9KSh0aGlzLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7cmV0dXJuIGE9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYX06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgYX0sYShiKX1mdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBkLGM9MDtjPGIubGVuZ3RoO2MrKylkPWJbY10sZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gZCYmKGQud3JpdGFibGU9XG4hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9ZnVuY3Rpb24gZShhLGQsYyl7cmV0dXJuIGQmJmIoYS5wcm90b3R5cGUsZCksYyYmYihhLGMpLGF9ZnVuY3Rpb24gZihhLGIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGImJm51bGwhPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGImJmIucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6YSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSk7YiYmaChhLGIpfWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGw9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihhKX0sbChhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihhLFxuYil7cmV0dXJuIGEuX19wcm90b19fPWIsYX0saChhLGIpfWZ1bmN0aW9uIGQoKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoKEQpe3JldHVybiExfX1mdW5jdGlvbiBnKCl7cmV0dXJuIGc9ZCgpP1JlZmxlY3QuY29uc3RydWN0OmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1bbnVsbF07Yy5wdXNoLmFwcGx5KGMsYik7YT1uZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoYSxjKSk7cmV0dXJuIGQmJmgoYSxkLnByb3RvdHlwZSksYX0sZy5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihhKXt2YXIgYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBNYXA/bmV3IE1hcDp2b2lkIDA7XG5yZXR1cm4gbj1mdW5jdGlvbihhKXtmdW5jdGlvbiBkKCl7cmV0dXJuIGcoYSxhcmd1bWVudHMsbCh0aGlzKS5jb25zdHJ1Y3Rvcil9aWYobnVsbD09PWF8fC0xPT09RnVuY3Rpb24udG9TdHJpbmcuY2FsbChhKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSlyZXR1cm4gYTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgYil7aWYoYi5oYXMoYSkpcmV0dXJuIGIuZ2V0KGEpO2Iuc2V0KGEsZCl9cmV0dXJuIGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpkLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGgoZCxhKX0sbihhKX1mdW5jdGlvbiBrKGEpe3ZhciBiPWQoKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD1sKGEpO2lmKGIpe3ZhciBjPVxubCh0aGlzKS5jb25zdHJ1Y3RvcjtkPVJlZmxlY3QuY29uc3RydWN0KGQsYXJndW1lbnRzLGMpfWVsc2UgZD1kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighZHx8XCJvYmplY3RcIiE9dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQpe2lmKHZvaWQgMD09PXRoaXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO2Q9dGhpc31yZXR1cm4gZH19ZnVuY3Rpb24gcChhLGIpe2lmKGEpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhKXJldHVybiB1KGEsYik7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpLnNsaWNlKDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1kJiZhLmNvbnN0cnVjdG9yJiYoZD1hLmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1kfHxcIlNldFwiPT09ZD9BcnJheS5mcm9tKGEpOlwiQXJndW1lbnRzXCI9PT1kfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChkKT9cbnUoYSxiKTp2b2lkIDB9fWZ1bmN0aW9uIHUoYSxiKXsobnVsbD09Ynx8Yj5hLmxlbmd0aCkmJihiPWEubGVuZ3RoKTtmb3IodmFyIGQ9MCxjPUFycmF5KGIpO2Q8YjtkKyspY1tkXT1hW2RdO3JldHVybiBjfWZ1bmN0aW9uIEEoYSxiKXt2YXIgZDtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHxudWxsPT1hW1N5bWJvbC5pdGVyYXRvcl0pe2lmKEFycmF5LmlzQXJyYXkoYSl8fChkPXAoYSkpfHxiJiZhJiZcIm51bWJlclwiPT10eXBlb2YgYS5sZW5ndGgpe2QmJihhPWQpO3ZhciBjPTA7Yj1mdW5jdGlvbigpe307cmV0dXJue3M6YixuOmZ1bmN0aW9uKCl7cmV0dXJuIGM+PWEubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTphW2MrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGE7fSxmOmJ9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn12YXIgZSxrPSEwLGY9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtkPWFbU3ltYm9sLml0ZXJhdG9yXSgpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9ZC5uZXh0KCk7cmV0dXJuIGs9YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7Zj0hMDtlPWF9LGY6ZnVuY3Rpb24oKXt0cnl7a3x8bnVsbD09ZC5yZXR1cm58fGQucmV0dXJuKCl9ZmluYWxseXtpZihmKXRocm93IGU7fX19fXZhciB0PU1hdGguaW11bCx2PU1hdGguY2x6MzIsQj1mdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEsYil7dmFyIGM7aWYoISh0aGlzIGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtpZihhPmQuX19rTWF4TGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZFwiKTtyZXR1cm4gYz1oLmNhbGwodGhpcyxhKSxjLnNpZ249YixjfXZhciBjPU1hdGguYWJzLGc9TWF0aC5tYXg7ZihkLGIpO3ZhciBoPWsoZCk7XG5yZXR1cm4gZShkLFt7a2V5OlwidG9EZWJ1Z1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGEsYj1bXCJCaWdJbnRbXCJdLGQ9QSh0aGlzKTt0cnl7Zm9yKGQucygpOyEoYT1kLm4oKSkuZG9uZTspe3ZhciBjPWEudmFsdWU7Yi5wdXNoKChjPyhjPj4+MCkudG9TdHJpbmcoMTYpOmMpK1wiLCBcIil9fWNhdGNoKFApe2QuZShQKX1maW5hbGx5e2QuZigpfXJldHVybiBiLnB1c2goXCJdXCIpLGIuam9pbihcIlwiKX19LHtrZXk6XCJ0b1N0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjEwO2lmKDI+YXx8MzY8YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRvU3RyaW5nKCkgcmFkaXggYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDM2XCIpO3JldHVybiAwPT09dGhpcy5sZW5ndGg/XCIwXCI6MD09KGEmYS0xKT9kLl9fdG9TdHJpbmdCYXNlUG93ZXJPZlR3byh0aGlzLGEpOmQuX190b1N0cmluZ0dlbmVyaWModGhpcyxcbmEsITEpfX0se2tleTpcIl9fY29weVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBkKHRoaXMubGVuZ3RoLHRoaXMuc2lnbiksYj0wO2I8dGhpcy5sZW5ndGg7YisrKWFbYl09dGhpc1tiXTtyZXR1cm4gYX19LHtrZXk6XCJfX3RyaW1cIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmxlbmd0aCxiPXRoaXNbYS0xXTswPT09YjspYS0tLGI9dGhpc1thLTFdLHRoaXMucG9wKCk7cmV0dXJuIDA9PT1hJiYodGhpcy5zaWduPSExKSx0aGlzfX0se2tleTpcIl9faW5pdGlhbGl6ZURpZ2l0c1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLmxlbmd0aDthKyspdGhpc1thXT0wfX0se2tleTpcIl9fY2x6bXNkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZC5fX2NsejMyKHRoaXNbdGhpcy5sZW5ndGgtMV0pfX0se2tleTpcIl9faW5wbGFjZU11bHRpcGx5QWRkXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2M+dGhpcy5sZW5ndGgmJihjPXRoaXMubGVuZ3RoKTt2YXIgZT1cbjY1NTM1JmE7YT4+Pj0xNjt2YXIgaz0wLGY9NjU1MzUmYjtiPj4+PTE2O2Zvcih2YXIgZz0wO2c8YztnKyspe3ZhciBoPXRoaXMuX19kaWdpdChnKSxwPTY1NTM1JmgsbD1oPj4+MTY7aD1kLl9faW11bChwLGUpO3A9ZC5fX2ltdWwocCxhKTt2YXIgdj1kLl9faW11bChsLGUpO2w9ZC5fX2ltdWwobCxhKTt2YXIgeT1mKyg2NTUzNSZoKTtoPWIraysoeT4+PjE2KSsoaD4+PjE2KSsoNjU1MzUmcCkrKDY1NTM1JnYpO2Y9KHA+Pj4xNikrKHY+Pj4xNikrKDY1NTM1JmwpKyhoPj4+MTYpO2s9Zj4+PjE2O2YmPTY1NTM1O2I9bD4+PjE2O3RoaXMuX19zZXREaWdpdChnLDY1NTM1Jnl8aDw8MTYpfWlmKDAhPT1rfHwwIT09Znx8MCE9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9faW5wbGFjZUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXtmb3IodmFyIGMsZT0wLGs9MDtrPGQ7aysrKWM9dGhpcy5fX2hhbGZEaWdpdChiK2spK2EuX19oYWxmRGlnaXQoaykrXG5lLGU9Yz4+PjE2LHRoaXMuX19zZXRIYWxmRGlnaXQoYitrLGMpO3JldHVybiBlfX0se2tleTpcIl9faW5wbGFjZVN1YlwiLHZhbHVlOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz0wO2lmKDEmYil7Yj4+PTE7Zm9yKHZhciBlPXRoaXMuX19kaWdpdChiKSxrPTY1NTM1JmUsZj0wO2Y8ZC0xPj4+MTtmKyspe3ZhciBnPWEuX19kaWdpdChmKTtlPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZlPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixlPDwxNnw2NTUzNSZrKTtlPXRoaXMuX19kaWdpdChiK2YrMSk7az0oNjU1MzUmZSktKGc+Pj4xNiktYztjPTEmaz4+PjE2fWc9YS5fX2RpZ2l0KGYpO3ZhciBoPShlPj4+MTYpLSg2NTUzNSZnKS1jO2M9MSZoPj4+MTY7dGhpcy5fX3NldERpZ2l0KGIrZixoPDwxNnw2NTUzNSZrKTtpZihiK2YrMT49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgYm91bmRzXCIpOzA9PSgxJmQpJiYoZT10aGlzLl9fZGlnaXQoYitmKzEpLGs9KDY1NTM1JlxuZSktKGc+Pj4xNiktYyxjPTEmaz4+PjE2LHRoaXMuX19zZXREaWdpdChiK2EubGVuZ3RoLDQyOTQ5MDE3NjAmZXw2NTUzNSZrKSl9ZWxzZXtiPj49MTtmb3Ioaz0wO2s8YS5sZW5ndGgtMTtrKyspZT10aGlzLl9fZGlnaXQoYitrKSxnPWEuX19kaWdpdChrKSxmPSg2NTUzNSZlKS0oNjU1MzUmZyktYyxjPTEmZj4+PjE2LGU9KGU+Pj4xNiktKGc+Pj4xNiktYyxjPTEmZT4+PjE2LHRoaXMuX19zZXREaWdpdChiK2ssZTw8MTZ8NjU1MzUmZik7Zj10aGlzLl9fZGlnaXQoYitrKTthPWEuX19kaWdpdChrKTtlPSg2NTUzNSZmKS0oNjU1MzUmYSktYztjPTEmZT4+PjE2O2c9MDswPT0oMSZkKSYmKGc9KGY+Pj4xNiktKGE+Pj4xNiktYyxjPTEmZz4+PjE2KTt0aGlzLl9fc2V0RGlnaXQoYitrLGc8PDE2fDY1NTM1JmUpfXJldHVybiBjfX0se2tleTpcIl9faW5wbGFjZVJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwIT09YSl7Zm9yKHZhciBiLGQ9dGhpcy5fX2RpZ2l0KDApPj4+YSxcbmM9dGhpcy5sZW5ndGgtMSxlPTA7ZTxjO2UrKyliPXRoaXMuX19kaWdpdChlKzEpLHRoaXMuX19zZXREaWdpdChlLGI8PDMyLWF8ZCksZD1iPj4+YTt0aGlzLl9fc2V0RGlnaXQoYyxkKX19fSx7a2V5OlwiX19kaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdfX0se2tleTpcIl9fdW5zaWduZWREaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzW2FdPj4+MH19LHtrZXk6XCJfX3NldERpZ2l0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzW2FdPTB8Yn19LHtrZXk6XCJfX3NldERpZ2l0R3Jvd1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpc1thXT0wfGJ9fSx7a2V5OlwiX19oYWxmRGlnaXRMZW5ndGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGVuZ3RoO3JldHVybiA2NTUzNT49dGhpcy5fX3Vuc2lnbmVkRGlnaXQoYS0xKT8yKmEtMToyKmF9fSx7a2V5OlwiX19oYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gNjU1MzUmdGhpc1thPj4+MV0+Pj5cbigoMSZhKTw8NCl9fSx7a2V5OlwiX19zZXRIYWxmRGlnaXRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPWE+Pj4xLGM9dGhpcy5fX2RpZ2l0KGQpO3RoaXMuX19zZXREaWdpdChkLDEmYT82NTUzNSZjfGI8PDE2OjQyOTQ5MDE3NjAmY3w2NTUzNSZiKX19XSxbe2tleTpcIkJpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBjPU1hdGguZmxvb3IsZT1OdW1iZXIuaXNGaW5pdGU7aWYoXCJudW1iZXJcIj09dHlwZW9mIGIpe2lmKDA9PT1iKXJldHVybiBkLl9femVybygpO2lmKCgwfGIpPT09YilyZXR1cm4gMD5iP2QuX19vbmVEaWdpdCgtYiwhMCk6ZC5fX29uZURpZ2l0KGIsITEpO2lmKCFlKGIpfHxjKGIpIT09Yil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBudW1iZXIgXCIrYitcIiBjYW5ub3QgYmUgY29udmVydGVkIHRvIEJpZ0ludCBiZWNhdXNlIGl0IGlzIG5vdCBhbiBpbnRlZ2VyXCIpO3JldHVybiBkLl9fZnJvbURvdWJsZShiKX1pZihcInN0cmluZ1wiPT10eXBlb2YgYil7Yz1kLl9fZnJvbVN0cmluZyhiKTtcbmlmKG51bGw9PT1jKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNhbm5vdCBjb252ZXJ0IFwiK2IrXCIgdG8gYSBCaWdJbnRcIik7cmV0dXJuIGN9aWYoXCJib29sZWFuXCI9PXR5cGVvZiBiKXJldHVybiEwPT09Yj9kLl9fb25lRGlnaXQoMSwhMSk6ZC5fX3plcm8oKTtpZihcIm9iamVjdFwiPT09YShiKSl7aWYoYi5jb25zdHJ1Y3Rvcj09PWQpcmV0dXJuIGI7Yj1kLl9fdG9QcmltaXRpdmUoYik7cmV0dXJuIGQuQmlnSW50KGIpfXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBcIitiK1wiIHRvIGEgQmlnSW50XCIpO319LHtrZXk6XCJ0b051bWJlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDA9PT1iKXJldHVybiAwO2lmKDE9PT1iKXt2YXIgYz1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYS5zaWduPy1jOmN9dmFyIGU9YS5fX2RpZ2l0KGItMSksaz1kLl9fY2x6MzIoZSk7Yz0zMipiLWs7aWYoMTAyNDxjKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDstLWM7XG52YXIgZj1iLTEsZz1rKzE7az0oMzI9PT1nPzA6ZTw8Zyk+Pj4xMjt2YXIgaD1nLTEyO2I9MTI8PWc/MDplPDwyMCtnO2c9MjArZzswPGgmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxrfD1lPj4+MzItaCxiPWU8PGgsZz1oKTswPGcmJjA8ZiYmKGYtLSxlPWEuX19kaWdpdChmKSxifD1lPj4+MzItZyxnLT0zMik7ZT1kLl9fZGVjaWRlUm91bmRpbmcoYSxnLGYsZSk7aWYoKDE9PT1lfHwwPT09ZSYmMT09KDEmYikpJiYoYj1iKzE+Pj4wLDA9PT1iJiYoaysrLDAhPWs+Pj4yMCYmKGs9MCxjKyssMTAyMzxjKSkpKXJldHVybiBhLnNpZ24/LUluZmluaXR5OjEvMDthPWEuc2lnbj8tMjE0NzQ4MzY0ODowO3JldHVybiBjPWMrMTAyMzw8MjAsZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT1hfGN8ayxkLl9fa0JpdENvbnZlcnNpb25JbnRzWzBdPWIsZC5fX2tCaXRDb252ZXJzaW9uRG91YmxlWzBdfX0se2tleTpcInVuYXJ5TWludXNcIix2YWx1ZTpmdW5jdGlvbihhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGE7XG52YXIgYj1hLl9fY29weSgpO3JldHVybiBiLnNpZ249IWEuc2lnbixifX0se2tleTpcImJpdHdpc2VOb3RcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5zaWduP2QuX19hYnNvbHV0ZVN1Yk9uZShhKS5fX3RyaW0oKTpkLl9fYWJzb2x1dGVBZGRPbmUoYSwhMCl9fSx7a2V5OlwiZXhwb25lbnRpYXRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiLnNpZ24pdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJFeHBvbmVudCBtdXN0IGJlIHBvc2l0aXZlXCIpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gZC5fX29uZURpZ2l0KDEsITEpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigxPT09YS5sZW5ndGgmJjE9PT1hLl9fZGlnaXQoMCkpcmV0dXJuIGEuc2lnbiYmMD09KDEmYi5fX2RpZ2l0KDApKT9kLnVuYXJ5TWludXMoYSk6YTtpZigxPGIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQmlnSW50IHRvbyBiaWdcIik7Yj1iLl9fdW5zaWduZWREaWdpdCgwKTtpZigxPT09YilyZXR1cm4gYTtpZihiPj1cbmQuX19rTWF4TGVuZ3RoQml0cyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2lmKDE9PT1hLmxlbmd0aCYmMj09PWEuX19kaWdpdCgwKSl7dmFyIGM9MSsoYj4+PjUpO2E9bmV3IGQoYyxhLnNpZ24mJjAhPSgxJmIpKTthLl9faW5pdGlhbGl6ZURpZ2l0cygpO3JldHVybiBhLl9fc2V0RGlnaXQoYy0xLDE8PCgzMSZiKSksYX1jPW51bGw7dmFyIGU9YTswIT0oMSZiKSYmKGM9YSk7Zm9yKGI+Pj0xOzAhPT1iO2I+Pj0xKWU9ZC5tdWx0aXBseShlLGUpLDAhPSgxJmIpJiYobnVsbD09PWM/Yz1lOmM9ZC5tdWx0aXBseShjLGUpKTtyZXR1cm4gY319LHtrZXk6XCJtdWx0aXBseVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYjt2YXIgYz1hLmxlbmd0aCtiLmxlbmd0aDszMjw9YS5fX2Nsem1zZCgpK2IuX19jbHptc2QoKSYmYy0tO2M9bmV3IGQoYyxhLnNpZ24hPT1iLnNpZ24pO2MuX19pbml0aWFsaXplRGlnaXRzKCk7XG5mb3IodmFyIGU9MDtlPGEubGVuZ3RoO2UrKylkLl9fbXVsdGlwbHlBY2N1bXVsYXRlKGIsYS5fX2RpZ2l0KGUpLGMsZSk7cmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiZGl2aWRlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEaXZpc2lvbiBieSB6ZXJvXCIpO2lmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBkLl9femVybygpO3ZhciBjPWEuc2lnbiE9PWIuc2lnbixlPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWUpe2lmKDE9PT1lKXJldHVybiBjPT09YS5zaWduP2E6ZC51bmFyeU1pbnVzKGEpO2E9ZC5fX2Fic29sdXRlRGl2U21hbGwoYSxlLG51bGwpfWVsc2UgYT1kLl9fYWJzb2x1dGVEaXZMYXJnZShhLGIsITAsITEpO3JldHVybiBhLnNpZ249YyxhLl9fdHJpbSgpfX0se2tleTpcInJlbWFpbmRlclwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiRGl2aXNpb24gYnkgemVyb1wiKTtcbmlmKDA+ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpKXJldHVybiBhO3ZhciBjPWIuX191bnNpZ25lZERpZ2l0KDApO2lmKDE9PT1iLmxlbmd0aCYmNjU1MzU+PWMpe2lmKDE9PT1jKXJldHVybiBkLl9femVybygpO2I9ZC5fX2Fic29sdXRlTW9kU21hbGwoYSxjKTtyZXR1cm4gMD09PWI/ZC5fX3plcm8oKTpkLl9fb25lRGlnaXQoYixhLnNpZ24pfWI9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxiLCExLCEwKTtyZXR1cm4gYi5zaWduPWEuc2lnbixiLl9fdHJpbSgpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaWduO3JldHVybiBjPT09Yi5zaWduP2QuX19hYnNvbHV0ZUFkZChhLGIsYyk6MDw9ZC5fX2Fic29sdXRlQ29tcGFyZShhLGIpP2QuX19hYnNvbHV0ZVN1YihhLGIsYyk6ZC5fX2Fic29sdXRlU3ViKGIsYSwhYyl9fSx7a2V5Olwic3VidHJhY3RcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtyZXR1cm4gYz09PWIuc2lnbj8wPD1kLl9fYWJzb2x1dGVDb21wYXJlKGEsXG5iKT9kLl9fYWJzb2x1dGVTdWIoYSxiLGMpOmQuX19hYnNvbHV0ZVN1YihiLGEsIWMpOmQuX19hYnNvbHV0ZUFkZChhLGIsYyl9fSx7a2V5OlwibGVmdFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX3JpZ2h0U2hpZnRCeUFic29sdXRlKGEsYik6ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJzaWduZWRSaWdodFNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD09PWIubGVuZ3RofHwwPT09YS5sZW5ndGg/YTpiLnNpZ24/ZC5fX2xlZnRTaGlmdEJ5QWJzb2x1dGUoYSxiKTpkLl9fcmlnaHRTaGlmdEJ5QWJzb2x1dGUoYSxiKX19LHtrZXk6XCJ1bnNpZ25lZFJpZ2h0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJCaWdJbnRzIGhhdmUgbm8gdW5zaWduZWQgcmlnaHQgc2hpZnQ7IHVzZSA+PiBpbnN0ZWFkXCIpO319LHtrZXk6XCJsZXNzVGhhblwiLFxudmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD5kLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwibGVzc1RoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMD49ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImdyZWF0ZXJUaGFuXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDxkLl9fY29tcGFyZVRvQmlnSW50KGEsYil9fSx7a2V5OlwiZ3JlYXRlclRoYW5PckVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMDw9ZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpfX0se2tleTpcImVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihhLnNpZ24hPT1iLnNpZ258fGEubGVuZ3RoIT09Yi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYS5fX2RpZ2l0KGQpIT09Yi5fX2RpZ2l0KGQpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm5vdEVxdWFsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5lcXVhbChhLFxuYil9fSx7a2V5OlwiYml0d2lzZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoIWEuc2lnbiYmIWIuc2lnbilyZXR1cm4gZC5fX2Fic29sdXRlQW5kKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpKzE7YT1kLl9fYWJzb2x1dGVTdWJPbmUoYSxjKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiKTtyZXR1cm4gYT1kLl9fYWJzb2x1dGVPcihhLGIsYSksZC5fX2Fic29sdXRlQWRkT25lKGEsITAsYSkuX190cmltKCl9YS5zaWduJiYoYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtyZXR1cm4gZC5fX2Fic29sdXRlQW5kTm90KGEsZC5fX2Fic29sdXRlU3ViT25lKGIpKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZighYS5zaWduJiYhYi5zaWduKXJldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiKS5fX3RyaW0oKTtpZihhLnNpZ24mJmIuc2lnbil7dmFyIGM9ZyhhLmxlbmd0aCxiLmxlbmd0aCk7YT1cbmQuX19hYnNvbHV0ZVN1Yk9uZShhLGMpO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIpO3JldHVybiBkLl9fYWJzb2x1dGVYb3IoYSxiLGEpLl9fdHJpbSgpfWM9ZyhhLmxlbmd0aCxiLmxlbmd0aCkrMTthLnNpZ24mJihiPVtiLGFdLGE9YlswXSxiPWJbMV0pO2I9ZC5fX2Fic29sdXRlU3ViT25lKGIsYyk7cmV0dXJuIGI9ZC5fX2Fic29sdXRlWG9yKGIsYSxiKSxkLl9fYWJzb2x1dGVBZGRPbmUoYiwhMCxiKS5fX3RyaW0oKX19LHtrZXk6XCJiaXR3aXNlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWcoYS5sZW5ndGgsYi5sZW5ndGgpO2lmKCFhLnNpZ24mJiFiLnNpZ24pcmV0dXJuIGQuX19hYnNvbHV0ZU9yKGEsYikuX190cmltKCk7aWYoYS5zaWduJiZiLnNpZ24pcmV0dXJuIGE9ZC5fX2Fic29sdXRlU3ViT25lKGEsYyksYj1kLl9fYWJzb2x1dGVTdWJPbmUoYiksYT1kLl9fYWJzb2x1dGVBbmQoYSxiLGEpLGQuX19hYnNvbHV0ZUFkZE9uZShhLCEwLGEpLl9fdHJpbSgpO2Euc2lnbiYmXG4oYj1bYixhXSxhPWJbMF0sYj1iWzFdKTtiPWQuX19hYnNvbHV0ZVN1Yk9uZShiLGMpO3JldHVybiBiPWQuX19hYnNvbHV0ZUFuZE5vdChiLGEsYiksZC5fX2Fic29sdXRlQWRkT25lKGIsITAsYikuX190cmltKCl9fSx7a2V5OlwiYXNJbnROXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGI7aWYoMD09PWEpcmV0dXJuIGQuX196ZXJvKCk7aWYoYT49ZC5fX2tNYXhMZW5ndGhCaXRzKXJldHVybiBiO3ZhciBjPWErMzE+Pj41O2lmKGIubGVuZ3RoPGMpcmV0dXJuIGI7dmFyIGU9Yi5fX3Vuc2lnbmVkRGlnaXQoYy0xKSxrPTE8PCgzMSZhLTEpO2lmKGIubGVuZ3RoPT09YyYmZTxrKXJldHVybiBiO2lmKChlJmspIT09aylyZXR1cm4gZC5fX3RydW5jYXRlVG9OQml0cyhhLGIpO2lmKCFiLnNpZ24pcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMCk7aWYoMD09KGUmay0xKSl7Zm9yKHZhciBmPWMtMjswPD1mO2YtLSlpZigwIT09XG5iLl9fZGlnaXQoZikpcmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSk7cmV0dXJuIGIubGVuZ3RoPT09YyYmZT09PWs/YjpkLl9fdHJ1bmNhdGVUb05CaXRzKGEsYil9cmV0dXJuIGQuX190cnVuY2F0ZUFuZFN1YkZyb21Qb3dlck9mVHdvKGEsYiwhMSl9fSx7a2V5OlwiYXNVaW50TlwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoMD09PWIubGVuZ3RoKXJldHVybiBiO2lmKDA9PT1hKXJldHVybiBkLl9femVybygpO2lmKGIuc2lnbil7aWYoYT5kLl9fa01heExlbmd0aEJpdHMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCaWdJbnQgdG9vIGJpZ1wiKTtyZXR1cm4gZC5fX3RydW5jYXRlQW5kU3ViRnJvbVBvd2VyT2ZUd28oYSxiLCExKX1pZihhPj1kLl9fa01heExlbmd0aEJpdHMpcmV0dXJuIGI7dmFyIGM9YSszMT4+PjU7aWYoYi5sZW5ndGg8YylyZXR1cm4gYjt2YXIgZT0zMSZhO3JldHVybiBiLmxlbmd0aCE9Y3x8MCE9PWUmJjAhPWIuX19kaWdpdChjLTEpPj4+XG5lP2QuX190cnVuY2F0ZVRvTkJpdHMoYSxiKTpifX0se2tleTpcIkFERFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7aWYoYT1kLl9fdG9QcmltaXRpdmUoYSksYj1kLl9fdG9QcmltaXRpdmUoYiksXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGImJihiPWIudG9TdHJpbmcoKSksYStiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXJldHVybiBhLnRvU3RyaW5nKCkrYjtpZihhPWQuX190b051bWVyaWMoYSksYj1kLl9fdG9OdW1lcmljKGIpLGQuX19pc0JpZ0ludChhKSYmZC5fX2lzQmlnSW50KGIpKXJldHVybiBkLmFkZChhLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBhJiZcIm51bWJlclwiPT10eXBlb2YgYilyZXR1cm4gYStiO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgbWl4IEJpZ0ludCBhbmQgb3RoZXIgdHlwZXMsIHVzZSBleHBsaWNpdCBjb252ZXJzaW9uc1wiKTt9fSx7a2V5OlwiTFRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBkLl9fY29tcGFyZShhLGIsXG4wKX19LHtrZXk6XCJMRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwxKX19LHtrZXk6XCJHVFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwyKX19LHtrZXk6XCJHRVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGQuX19jb21wYXJlKGEsYiwzKX19LHtrZXk6XCJFUVwiLHZhbHVlOmZ1bmN0aW9uKGIsYyl7Zm9yKDs7KXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19pc0JpZ0ludChjKT9kLmVxdWFsKGIsYyk6ZC5FUShjLGIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBiKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuIGQuX19lcXVhbFRvTnVtYmVyKGMsYik7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBiPWQuX19mcm9tU3RyaW5nKGIpLG51bGwhPT1iJiZkLmVxdWFsKGIsYyk7XG5pZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYil7aWYoZC5fX2lzQmlnSW50KGMpKXJldHVybiBkLl9fZXF1YWxUb051bWJlcihjLCtiKTtpZihcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYj09YztjPWQuX190b1ByaW1pdGl2ZShjKX1lbHNlIGlmKFwic3ltYm9sXCI9PT1hKGIpKXtpZihkLl9faXNCaWdJbnQoYykpcmV0dXJuITE7aWYoXCJvYmplY3RcIiE9PWEoYykpcmV0dXJuIGI9PWM7Yz1kLl9fdG9QcmltaXRpdmUoYyl9ZWxzZSBpZihcIm9iamVjdFwiPT09YShiKSl7aWYoXCJvYmplY3RcIj09PWEoYykmJmMuY29uc3RydWN0b3IhPT1kKXJldHVybiBiPT1jO2I9ZC5fX3RvUHJpbWl0aXZlKGIpfWVsc2UgcmV0dXJuIGI9PWN9fX0se2tleTpcIk5FXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZC5FUShhLGIpfX0se2tleTpcIl9femVyb1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkKDAsITEpfX0sXG57a2V5OlwiX19vbmVEaWdpdFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7Yj1uZXcgZCgxLGIpO3JldHVybiBiLl9fc2V0RGlnaXQoMCxhKSxifX0se2tleTpcIl9fZGVjaWRlUm91bmRpbmdcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCxjKXtpZigwPGIpcmV0dXJuLTE7aWYoMD5iKWI9LWItMTtlbHNle2lmKDA9PT1kKXJldHVybi0xO2QtLTtjPWEuX19kaWdpdChkKTtiPTMxfWI9MTw8YjtpZigwPT0oYyZiKSlyZXR1cm4tMTtpZigtLWIsMCE9KGMmYikpcmV0dXJuIDE7Zm9yKDswPGQ7KWlmKGQtLSwwIT09YS5fX2RpZ2l0KGQpKXJldHVybiAxO3JldHVybiAwfX0se2tleTpcIl9fZnJvbURvdWJsZVwiLHZhbHVlOmZ1bmN0aW9uKGEpe2QuX19rQml0Q29udmVyc2lvbkRvdWJsZVswXT1hO3ZhciBiPSgyMDQ3JmQuX19rQml0Q29udmVyc2lvbkludHNbMV0+Pj4yMCktMTAyMzt2YXIgYz0oYj4+PjUpKzE7YT1uZXcgZChjLDA+YSk7dmFyIGU9MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdfDEwNDg1NzYsXG5rPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07YiY9MzE7aWYoMjA+Yil7dmFyIGY9MjAtYjt2YXIgZz1mKzMyO2I9ZT4+PmY7ZT1lPDwzMi1mfGs+Pj5mO2s8PD0zMi1mfWVsc2UgMjA9PT1iPyhnPTMyLGI9ZSxlPWspOihmPWItMjAsZz0zMi1mLGI9ZTw8ZnxrPj4+MzItZixlPWs8PGYpO2EuX19zZXREaWdpdChjLTEsYik7Zm9yKGMtPTI7MDw9YztjLS0pMDxnPyhnLT0zMixiPWUsZT1rKTpiPTAsYS5fX3NldERpZ2l0KGMsYik7cmV0dXJuIGEuX190cmltKCl9fSx7a2V5OlwiX19pc1doaXRlc3BhY2VcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hISgxMz49YSYmOTw9YSl8fCgxNTk+PWE/MzI9PWE6MTMxMDcxPj1hPzE2MD09YXx8NTc2MD09YToxOTY2MDc+PWE/KGEmPTEzMTA3MSwxMD49YXx8NDA9PWF8fDQxPT1hfHw0Nz09YXx8OTU9PWF8fDQwOTY9PWEpOjY1Mjc5PT1hKX19LHtrZXk6XCJfX2Zyb21TdHJpbmdcIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj0xPGFyZ3VtZW50cy5sZW5ndGgmJlxudm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLGM9MCxlPWEubGVuZ3RoLGs9MDtpZihrPT09ZSlyZXR1cm4gZC5fX3plcm8oKTtmb3IodmFyIGY9YS5jaGFyQ29kZUF0KGspO2QuX19pc1doaXRlc3BhY2UoZik7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfWlmKDQzPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKTtjPTF9ZWxzZSBpZig0NT09PWYpe2lmKCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayk7Yz0tMX1pZigwPT09Yil7aWYoYj0xMCw0OD09PWYpe2lmKCsraz09PWUpcmV0dXJuIGQuX196ZXJvKCk7aWYoZj1hLmNoYXJDb2RlQXQoayksODg9PT1mfHwxMjA9PT1mKXtpZihiPTE2LCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9ZWxzZSBpZig3OT09PWZ8fDExMT09PWYpe2lmKGI9OCwrK2s9PT1lKXJldHVybiBudWxsO2Y9YS5jaGFyQ29kZUF0KGspfWVsc2UgaWYoNjY9PT1cbmZ8fDk4PT09Zil7aWYoYj0yLCsraz09PWUpcmV0dXJuIG51bGw7Zj1hLmNoYXJDb2RlQXQoayl9fX1lbHNlIGlmKDE2PT09YiYmNDg9PT1mKXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2lmKGY9YS5jaGFyQ29kZUF0KGspLDg4PT09Znx8MTIwPT09Zil7aWYoKytrPT09ZSlyZXR1cm4gbnVsbDtmPWEuY2hhckNvZGVBdChrKX19Zm9yKDs0OD09PWY7KXtpZigrK2s9PT1lKXJldHVybiBkLl9femVybygpO2Y9YS5jaGFyQ29kZUF0KGspfXZhciBnPWUtayxoPWQuX19rTWF4Qml0c1BlckNoYXJbYl0scD1kLl9fa0JpdHNQZXJDaGFyVGFibGVNdWx0aXBsaWVyLTE7aWYoZz4xMDczNzQxODI0L2gpcmV0dXJuIG51bGw7Zz1uZXcgZCgoaCpnK3A+Pj5kLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCkrMzE+Pj41LCExKTt2YXIgbD0xMD5iP2I6MTAsdj0xMDxiP2ItMTA6MDtpZigwPT0oYiZiLTEpKXtoPj49ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQ7dmFyIEI9W10sbj1bXSxBPVxuITE7ZG97Zm9yKHZhciBELHU9cD0wOzspe2lmKGYtNDg+Pj4wPGwpRD1mLTQ4O2Vsc2UgaWYoKDMyfGYpLTk3Pj4+MDx2KUQ9KDMyfGYpLTg3O2Vsc2V7QT0hMDticmVha31pZih1Kz1oLHA9cDw8aHxELCsraz09PWUpe0E9ITA7YnJlYWt9aWYoZj1hLmNoYXJDb2RlQXQoayksMzI8dStoKWJyZWFrfUIucHVzaChwKTtuLnB1c2godSl9d2hpbGUoIUEpO2QuX19maWxsRnJvbVBhcnRzKGcsQixuKX1lbHNle2cuX19pbml0aWFsaXplRGlnaXRzKCk7Qj0hMTtuPTA7ZG97QT0wO2ZvcihEPTE7Oyl7aWYoZi00OD4+PjA8bClwPWYtNDg7ZWxzZSBpZigoMzJ8ZiktOTc+Pj4wPHYpcD0oMzJ8ZiktODc7ZWxzZXtCPSEwO2JyZWFrfXU9RCpiO2lmKDQyOTQ5NjcyOTU8dSlicmVhaztpZihEPXUsQT1BKmIrcCxuKyssKytrPT09ZSl7Qj0hMDticmVha31mPWEuY2hhckNvZGVBdChrKX1wPTMyKmQuX19rQml0c1BlckNoYXJUYWJsZU11bHRpcGxpZXItMTtnLl9faW5wbGFjZU11bHRpcGx5QWRkKEQsXG5BLGgqbitwPj4+ZC5fX2tCaXRzUGVyQ2hhclRhYmxlU2hpZnQrNSl9d2hpbGUoIUIpfWlmKGshPT1lKXtpZighZC5fX2lzV2hpdGVzcGFjZShmKSlyZXR1cm4gbnVsbDtmb3IoaysrO2s8ZTtrKyspaWYoZj1hLmNoYXJDb2RlQXQoayksIWQuX19pc1doaXRlc3BhY2UoZikpcmV0dXJuIG51bGx9cmV0dXJuIDAhPT1jJiYxMCE9PWI/bnVsbDooZy5zaWduPS0xPT09YyxnLl9fdHJpbSgpKX19LHtrZXk6XCJfX2ZpbGxGcm9tUGFydHNcIix2YWx1ZTpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBjPTAsZT0wLGs9MCxmPWIubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBnPWJbZl0saD1kW2ZdO2V8PWc8PGs7ays9aDszMj09PWs/KGEuX19zZXREaWdpdChjKyssZSksaz0wLGU9MCk6MzI8ayYmKGEuX19zZXREaWdpdChjKyssZSksay09MzIsZT1nPj4+aC1rKX1pZigwIT09ZSl7aWYoYz49YS5sZW5ndGgpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7YS5fX3NldERpZ2l0KGMrKyxlKX1mb3IoO2M8XG5hLmxlbmd0aDtjKyspYS5fX3NldERpZ2l0KGMsMCl9fSx7a2V5OlwiX190b1N0cmluZ0Jhc2VQb3dlck9mVHdvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxlPWItMTtlPSg4NSZlPj4+MSkrKDg1JmUpO2U9KDUxJmU+Pj4yKSsoNTEmZSk7ZT0oMTUmZT4+PjQpKygxNSZlKTstLWI7dmFyIGs9YS5fX2RpZ2l0KGMtMSksZj1kLl9fY2x6MzIoayksZz0wfCgzMipjLWYrZS0xKS9lO2lmKGEuc2lnbiYmZysrLDI2ODQzNTQ1NjxnKXRocm93IEVycm9yKFwic3RyaW5nIHRvbyBsb25nXCIpO2Y9QXJyYXkoZyk7LS1nO2Zvcih2YXIgaD0wLHA9MCxsPTA7bDxjLTE7bCsrKXt2YXIgdj1hLl9fZGlnaXQobCk7aD0oaHx2PDxwKSZiO2ZbZy0tXT1kLl9fa0NvbnZlcnNpb25DaGFyc1toXTtwPWUtcDtoPXY+Pj5wO2ZvcihwPTMyLXA7cD49ZTspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lLHAtPWV9ZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzWyhofGs8PFxucCkmYl07Zm9yKGg9az4+PmUtcDswIT09aDspZltnLS1dPWQuX19rQ29udmVyc2lvbkNoYXJzW2gmYl0saD4+Pj1lO2lmKGEuc2lnbiYmKGZbZy0tXT1cIi1cIiksLTEhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiBmLmpvaW4oXCJcIil9fSx7a2V5OlwiX190b1N0cmluZ0dlbmVyaWNcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGg7aWYoMD09PWUpcmV0dXJuXCJcIjtpZigxPT09ZSlyZXR1cm4gYj1hLl9fdW5zaWduZWREaWdpdCgwKS50b1N0cmluZyhiKSwhMT09PWMmJmEuc2lnbiYmKGI9XCItXCIrYiksYjt2YXIgaz0zMiplLWQuX19jbHozMihhLl9fZGlnaXQoZS0xKSk7ZT1kLl9fa01heEJpdHNQZXJDaGFyW2JdLTE7ayo9ZC5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcjtlPSgwfChrKyhlLTEpKS9lKSsxPj4xO2s9ZC5leHBvbmVudGlhdGUoZC5fX29uZURpZ2l0KGIsITEpLGQuX19vbmVEaWdpdChlLCExKSk7dmFyIGY9ay5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5pZigxPT09ay5sZW5ndGgmJjY1NTM1Pj1mKXtrPW5ldyBkKGEubGVuZ3RoLCExKTtrLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBnPTA7Zm9yKHZhciBoPTIqYS5sZW5ndGgtMTswPD1oO2gtLSlnPWc8PDE2fGEuX19oYWxmRGlnaXQoaCksay5fX3NldEhhbGZEaWdpdChoLDB8Zy9mKSxnPTB8ZyVmO2Y9Zy50b1N0cmluZyhiKX1lbHNlIGY9ZC5fX2Fic29sdXRlRGl2TGFyZ2UoYSxrLCEwLCEwKSxrPWYucXVvdGllbnQsZj1mLnJlbWFpbmRlci5fX3RyaW0oKSxmPWQuX190b1N0cmluZ0dlbmVyaWMoZixiLCEwKTtrLl9fdHJpbSgpO2ZvcihiPWQuX190b1N0cmluZ0dlbmVyaWMoayxiLCEwKTtmLmxlbmd0aDxlOylmPVwiMFwiK2Y7cmV0dXJuITE9PT1jJiZhLnNpZ24mJihiPVwiLVwiK2IpLGIrZn19LHtrZXk6XCJfX3VuZXF1YWxTaWduXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/LTE6MX19LHtrZXk6XCJfX2Fic29sdXRlR3JlYXRlclwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP1xuLTE6MX19LHtrZXk6XCJfX2Fic29sdXRlTGVzc1wiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhPzE6LTF9fSx7a2V5OlwiX19jb21wYXJlVG9CaWdJbnRcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc2lnbjtpZihjIT09Yi5zaWduKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oYyk7YT1kLl9fYWJzb2x1dGVDb21wYXJlKGEsYik7cmV0dXJuIDA8YT9kLl9fYWJzb2x1dGVHcmVhdGVyKGMpOjA+YT9kLl9fYWJzb2x1dGVMZXNzKGMpOjB9fSx7a2V5OlwiX19jb21wYXJlVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2lmKDF8Yil7dmFyIGU9YS5zaWduLGs9MD5iO2lmKGUhPT1rKXJldHVybiBkLl9fdW5lcXVhbFNpZ24oZSk7aWYoMD09PWEubGVuZ3RoKXtpZihrKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO3JldHVybiAwPT09Yj8wOi0xfWlmKDE8YS5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoZSk7Yj1jKGIpO2E9YS5fX3Vuc2lnbmVkRGlnaXQoMCk7XG5yZXR1cm4gYT5iP2QuX19hYnNvbHV0ZUdyZWF0ZXIoZSk6YTxiP2QuX19hYnNvbHV0ZUxlc3MoZSk6MH1yZXR1cm4gZC5fX2NvbXBhcmVUb0RvdWJsZShhLGIpfX0se2tleTpcIl9fY29tcGFyZVRvRG91YmxlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtpZihiIT09YilyZXR1cm4gYjtpZihiPT09MS8wKXJldHVybi0xO2lmKC1JbmZpbml0eT09PWIpcmV0dXJuIDE7dmFyIGM9YS5zaWduO2lmKGMhPT0wPmIpcmV0dXJuIGQuX191bmVxdWFsU2lnbihjKTtpZigwPT09Yil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Zzogc2hvdWxkIGJlIGhhbmRsZWQgZWxzZXdoZXJlXCIpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4tMTtkLl9fa0JpdENvbnZlcnNpb25Eb3VibGVbMF09YjtiPTIwNDcmZC5fX2tCaXRDb252ZXJzaW9uSW50c1sxXT4+PjIwO2lmKDIwNDc9PWIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWc6IGhhbmRsZWQgZWxzZXdoZXJlXCIpO3ZhciBlPWItMTAyMztpZigwPmUpcmV0dXJuIGQuX19hYnNvbHV0ZUdyZWF0ZXIoYyk7XG5iPWEubGVuZ3RoO3ZhciBrPWEuX19kaWdpdChiLTEpLGY9ZC5fX2NsejMyKGspLGc9MzIqYi1mO2UrPTE7aWYoZzxlKXJldHVybiBkLl9fYWJzb2x1dGVMZXNzKGMpO2lmKGc+ZSlyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtlPTEwNDg1NzZ8MTA0ODU3NSZkLl9fa0JpdENvbnZlcnNpb25JbnRzWzFdO3ZhciBoPWQuX19rQml0Q29udmVyc2lvbkludHNbMF07Zj0zMS1mO2lmKGYhPT0oZy0xKSUzMSl0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtpZigyMD5mKXt2YXIgcD0yMC1mO2Y9cCszMjtnPWU+Pj5wO2U9ZTw8MzItcHxoPj4+cDtoPDw9MzItcH1lbHNlIDIwPT09Zj8oZj0zMixnPWUsZT1oKToocD1mLTIwLGY9MzItcCxnPWU8PHB8aD4+PjMyLXAsZT1oPDxwKTtpZihrPj4+PTAsZz4+Pj0wLGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyk7Zm9yKGItPTI7MDw9YjtiLS0pezA8Zj8oZi09XG4zMixnPWU+Pj4wLGU9aCxoPTApOmc9MDtrPWEuX191bnNpZ25lZERpZ2l0KGIpO2lmKGs+ZylyZXR1cm4gZC5fX2Fic29sdXRlR3JlYXRlcihjKTtpZihrPGcpcmV0dXJuIGQuX19hYnNvbHV0ZUxlc3MoYyl9aWYoMCE9PWV8fDAhPT1oKXtpZigwPT09Zil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2Fic29sdXRlTGVzcyhjKX1yZXR1cm4gMH19LHtrZXk6XCJfX2VxdWFsVG9OdW1iZXJcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBifDA9PT1iPzA9PT1iPzA9PT1hLmxlbmd0aDoxPT09YS5sZW5ndGgmJmEuc2lnbj09PTA+YiYmYS5fX3Vuc2lnbmVkRGlnaXQoMCk9PT1jKGIpOjA9PT1kLl9fY29tcGFyZVRvRG91YmxlKGEsYil9fSx7a2V5OlwiX19jb21wYXJpc29uUmVzdWx0VG9Cb29sXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiAwPmE7Y2FzZSAxOnJldHVybiAwPj1hO2Nhc2UgMjpyZXR1cm4gMDxhO2Nhc2UgMzpyZXR1cm4gMDw9XG5hfXRocm93IEVycm9yKFwidW5yZWFjaGFibGVcIik7fX0se2tleTpcIl9fY29tcGFyZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtpZihhPWQuX190b1ByaW1pdGl2ZShhKSxiPWQuX190b1ByaW1pdGl2ZShiKSxcInN0cmluZ1wiPT10eXBlb2YgYSYmXCJzdHJpbmdcIj09dHlwZW9mIGIpc3dpdGNoKGMpe2Nhc2UgMDpyZXR1cm4gYTxiO2Nhc2UgMTpyZXR1cm4gYTw9YjtjYXNlIDI6cmV0dXJuIGE+YjtjYXNlIDM6cmV0dXJuIGE+PWJ9aWYoZC5fX2lzQmlnSW50KGEpJiZcInN0cmluZ1wiPT10eXBlb2YgYilyZXR1cm4gYj1kLl9fZnJvbVN0cmluZyhiKSxudWxsIT09YiYmZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb0JpZ0ludChhLGIpLGMpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhJiZkLl9faXNCaWdJbnQoYikpcmV0dXJuIGE9ZC5fX2Zyb21TdHJpbmcoYSksbnVsbCE9PWEmJmQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtcbmlmKGE9ZC5fX3RvTnVtZXJpYyhhKSxiPWQuX190b051bWVyaWMoYiksZC5fX2lzQmlnSW50KGEpKXtpZihkLl9faXNCaWdJbnQoYikpcmV0dXJuIGQuX19jb21wYXJpc29uUmVzdWx0VG9Cb29sKGQuX19jb21wYXJlVG9CaWdJbnQoYSxiKSxjKTtpZihcIm51bWJlclwiIT10eXBlb2YgYil0aHJvdyBFcnJvcihcImltcGxlbWVudGF0aW9uIGJ1Z1wiKTtyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihhLGIpLGMpfWlmKFwibnVtYmVyXCIhPXR5cGVvZiBhKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO2lmKGQuX19pc0JpZ0ludChiKSlyZXR1cm4gZC5fX2NvbXBhcmlzb25SZXN1bHRUb0Jvb2woZC5fX2NvbXBhcmVUb051bWJlcihiLGEpLDJeYyk7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGIpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7cmV0dXJuIDA9PT1jP2E8YjoxPT09Yz9hPD1iOjI9PT1jP2E+YjozPT09Yz9hPj1iOlxudm9pZCAwfX0se2tleTpcIl9fYWJzb2x1dGVBZGRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7aWYoYS5sZW5ndGg8Yi5sZW5ndGgpcmV0dXJuIGQuX19hYnNvbHV0ZUFkZChiLGEsYyk7aWYoMD09PWEubGVuZ3RoKXJldHVybiBhO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gYS5zaWduPT09Yz9hOmQudW5hcnlNaW51cyhhKTt2YXIgZT1hLmxlbmd0aDsoMD09PWEuX19jbHptc2QoKXx8Yi5sZW5ndGg9PT1hLmxlbmd0aCYmMD09PWIuX19jbHptc2QoKSkmJmUrKztjPW5ldyBkKGUsYyk7Zm9yKHZhciBrPWU9MDtrPGIubGVuZ3RoO2srKyl7dmFyIGY9Yi5fX2RpZ2l0KGspLGc9YS5fX2RpZ2l0KGspLGg9KDY1NTM1JmcpKyg2NTUzNSZmKStlO2Y9KGc+Pj4xNikrKGY+Pj4xNikrKGg+Pj4xNik7ZT1mPj4+MTY7Yy5fX3NldERpZ2l0KGssNjU1MzUmaHxmPDwxNil9Zm9yKDtrPGEubGVuZ3RoO2srKyloPWEuX19kaWdpdChrKSxiPSg2NTUzNSZoKStlLGg9KGg+Pj4xNikrKGI+Pj4xNiksZT1oPj4+XG4xNixjLl9fc2V0RGlnaXQoayw2NTUzNSZifGg8PDE2KTtyZXR1cm4gazxjLmxlbmd0aCYmYy5fX3NldERpZ2l0KGssZSksYy5fX3RyaW0oKX19LHtrZXk6XCJfX2Fic29sdXRlU3ViXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYTtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGEuc2lnbj09PWM/YTpkLnVuYXJ5TWludXMoYSk7Yz1uZXcgZChhLmxlbmd0aCxjKTtmb3IodmFyIGU9MCxrPTA7azxiLmxlbmd0aDtrKyspe3ZhciBmPWEuX19kaWdpdChrKSxnPWIuX19kaWdpdChrKSxoPSg2NTUzNSZmKS0oNjU1MzUmZyktZTtlPTEmaD4+PjE2O2Y9KGY+Pj4xNiktKGc+Pj4xNiktZTtlPTEmZj4+PjE2O2MuX19zZXREaWdpdChrLDY1NTM1Jmh8Zjw8MTYpfWZvcig7azxhLmxlbmd0aDtrKyspaD1hLl9fZGlnaXQoayksYj0oNjU1MzUmaCktZSxlPTEmYj4+PjE2LGg9KGg+Pj4xNiktZSxlPTEmaD4+PjE2LGMuX19zZXREaWdpdChrLDY1NTM1JmJ8aDw8MTYpO1xucmV0dXJuIGMuX190cmltKCl9fSx7a2V5OlwiX19hYnNvbHV0ZUFkZE9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aDtudWxsPT09Yz9jPW5ldyBkKGUsYik6Yy5zaWduPWI7Zm9yKHZhciBrLGY9ITAsZz0wO2c8ZTtnKyspe2lmKGs9YS5fX2RpZ2l0KGcpLGYpZj0tMT09PWssaz0wfGsrMTtjLl9fc2V0RGlnaXQoZyxrKX1yZXR1cm4gZiYmYy5fX3NldERpZ2l0R3JvdyhlLDEpLGN9fSx7a2V5OlwiX19hYnNvbHV0ZVN1Yk9uZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGg7Yj1ifHxjO2Zvcih2YXIgZSxrPW5ldyBkKGIsITEpLGY9ITAsZz0wO2c8YztnKyspe2lmKGU9YS5fX2RpZ2l0KGcpLGYpZj0wPT09ZSxlPTB8ZS0xO2suX19zZXREaWdpdChnLGUpfWlmKGYpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7Zm9yKGE9YzthPFxuYjthKyspay5fX3NldERpZ2l0KGEsMCk7cmV0dXJuIGt9fSx7a2V5OlwiX19hYnNvbHV0ZUFuZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwsZT1hLmxlbmd0aCxrPWIubGVuZ3RoLGY9aztlPGsmJihmPWUsZT1hLGE9YixiPWUpO2U9ZjtudWxsPT09Yz9jPW5ldyBkKGUsITEpOmU9Yy5sZW5ndGg7Zm9yKGs9MDtrPGY7aysrKWMuX19zZXREaWdpdChrLGEuX19kaWdpdChrKSZiLl9fZGlnaXQoaykpO2Zvcig7azxlO2srKyljLl9fc2V0RGlnaXQoaywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlQW5kTm90XCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2U8ayYmKGY9ZSk7az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6XG5rPWMubGVuZ3RoO2Zvcih2YXIgZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpJn5iLl9fZGlnaXQoZykpO2Zvcig7ZzxlO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZykpO2Zvcig7ZzxrO2crKyljLl9fc2V0RGlnaXQoZywwKTtyZXR1cm4gY319LHtrZXk6XCJfX2Fic29sdXRlT3JcIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLGU9YS5sZW5ndGgsaz1iLmxlbmd0aCxmPWs7aWYoZTxrKXtmPWU7dmFyIGc9YTthPWI7ZT1rO2I9Z31rPWU7bnVsbD09PWM/Yz1uZXcgZChrLCExKTprPWMubGVuZ3RoO2ZvcihnPTA7ZzxmO2crKyljLl9fc2V0RGlnaXQoZyxhLl9fZGlnaXQoZyl8Yi5fX2RpZ2l0KGcpKTtmb3IoO2c8ZTtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpKTtmb3IoO2c8aztnKyspYy5fX3NldERpZ2l0KGcsMCk7cmV0dXJuIGN9fSxcbntrZXk6XCJfX2Fic29sdXRlWG9yXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxlPWEubGVuZ3RoLGs9Yi5sZW5ndGgsZj1rO2lmKGU8ayl7Zj1lO3ZhciBnPWE7YT1iO2U9aztiPWd9az1lO251bGw9PT1jP2M9bmV3IGQoaywhMSk6az1jLmxlbmd0aDtmb3IoZz0wO2c8ZjtnKyspYy5fX3NldERpZ2l0KGcsYS5fX2RpZ2l0KGcpXmIuX19kaWdpdChnKSk7Zm9yKDtnPGU7ZysrKWMuX19zZXREaWdpdChnLGEuX19kaWdpdChnKSk7Zm9yKDtnPGs7ZysrKWMuX19zZXREaWdpdChnLDApO3JldHVybiBjfX0se2tleTpcIl9fYWJzb2x1dGVDb21wYXJlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aC1iLmxlbmd0aDtpZigwIT1kKXJldHVybiBkO2ZvcihkPWEubGVuZ3RoLTE7MDw9ZCYmYS5fX2RpZ2l0KGQpPT09Yi5fX2RpZ2l0KGQpOylkLS07cmV0dXJuIDA+ZD8wOmEuX191bnNpZ25lZERpZ2l0KGQpPlxuYi5fX3Vuc2lnbmVkRGlnaXQoZCk/MTotMX19LHtrZXk6XCJfX211bHRpcGx5QWNjdW11bGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUpe2lmKDAhPT1iKXtmb3IodmFyIGs9NjU1MzUmYixmPWI+Pj4xNixnPWI9MCxoPTAscD0wO3A8YS5sZW5ndGg7cCsrLGUrKyl7dmFyIGw9Yy5fX2RpZ2l0KGUpLHY9NjU1MzUmbDtsPj4+PTE2O3ZhciBCPWEuX19kaWdpdChwKSxuPTY1NTM1JkIsQT1CPj4+MTY7Qj1kLl9faW11bChuLGspO249ZC5fX2ltdWwobixmKTt2YXIgRD1kLl9faW11bChBLGspO0E9ZC5fX2ltdWwoQSxmKTt2Kz1nKyg2NTUzNSZCKTtsKz1oK2IrKHY+Pj4xNikrKEI+Pj4xNikrKDY1NTM1Jm4pKyg2NTUzNSZEKTtiPWw+Pj4xNjtnPShuPj4+MTYpKyhEPj4+MTYpKyg2NTUzNSZBKStiO2I9Zz4+PjE2O2cmPTY1NTM1O2g9QT4+PjE2O2w9NjU1MzUmdnxsPDwxNjtjLl9fc2V0RGlnaXQoZSxsKX1mb3IoOzAhPT1ifHwwIT09Z3x8MCE9PWg7ZSsrKWs9Yy5fX2RpZ2l0KGUpLGE9XG4oNjU1MzUmaykrZyxrPShrPj4+MTYpKyhhPj4+MTYpK2grYixoPWc9MCxiPWs+Pj4xNixrPTY1NTM1JmF8azw8MTYsYy5fX3NldERpZ2l0KGUsayl9fX0se2tleTpcIl9faW50ZXJuYWxNdWx0aXBseUFkZFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjLGUsayl7Zm9yKHZhciBmPTAsZz0wO2c8ZTtnKyspe3ZhciBoPWEuX19kaWdpdChnKSxwPWQuX19pbXVsKDY1NTM1JmgsYiksbD0oNjU1MzUmcCkrZitjO2M9bD4+PjE2O2Y9ZC5fX2ltdWwoaD4+PjE2LGIpO3A9KDY1NTM1JmYpKyhwPj4+MTYpK2M7Yz1wPj4+MTY7Zj4+Pj0xNjtrLl9fc2V0RGlnaXQoZyxwPDwxNnw2NTUzNSZsKX1pZihrLmxlbmd0aD5lKWZvcihrLl9fc2V0RGlnaXQoZSsrLGMrZik7ZTxrLmxlbmd0aDspay5fX3NldERpZ2l0KGUrKywwKTtlbHNlIGlmKDAhPT1jK2YpdGhyb3cgRXJyb3IoXCJpbXBsZW1lbnRhdGlvbiBidWdcIik7fX0se2tleTpcIl9fYWJzb2x1dGVEaXZTbWFsbFwiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXtudWxsPT09XG5jJiYoYz1uZXcgZChhLmxlbmd0aCwhMSkpO2Zvcih2YXIgZT0wLGs9MiphLmxlbmd0aC0xOzA8PWs7ay09Mil7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrKSk+Pj4wO3ZhciBmPTB8ZS9iO2U9MHxlJWI7ZT0oZTw8MTZ8YS5fX2hhbGZEaWdpdChrLTEpKT4+PjA7dmFyIGc9MHxlL2I7ZT0wfGUlYjtjLl9fc2V0RGlnaXQoaz4+PjEsZjw8MTZ8Zyl9cmV0dXJuIGN9fSx7a2V5OlwiX19hYnNvbHV0ZU1vZFNtYWxsXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wO2Zvcih2YXIgYz0yKmEubGVuZ3RoLTE7MDw9YztjLS0pZD0oZDw8MTZ8YS5fX2hhbGZEaWdpdChjKSk+Pj4wLGQ9MHxkJWI7cmV0dXJuIGR9fSx7a2V5OlwiX19hYnNvbHV0ZURpdkxhcmdlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGs9Yi5fX2hhbGZEaWdpdExlbmd0aCgpLGY9Yi5sZW5ndGgsZz1hLl9faGFsZkRpZ2l0TGVuZ3RoKCktayxoPW51bGw7YyYmKGg9bmV3IGQoZysyPj4+MSwhMSksaC5fX2luaXRpYWxpemVEaWdpdHMoKSk7XG52YXIgcD1uZXcgZChrKzI+Pj4xLCExKTtwLl9faW5pdGlhbGl6ZURpZ2l0cygpO3ZhciBsPWQuX19jbHoxNihiLl9faGFsZkRpZ2l0KGstMSkpOzA8bCYmKGI9ZC5fX3NwZWNpYWxMZWZ0U2hpZnQoYixsLDApKTthPWQuX19zcGVjaWFsTGVmdFNoaWZ0KGEsbCwxKTtmb3IodmFyIHY9Yi5fX2hhbGZEaWdpdChrLTEpLEI9MDswPD1nO2ctLSl7dmFyIG49NjU1MzUsQT1hLl9faGFsZkRpZ2l0KGcrayk7aWYoQSE9PXYpe0E9KEE8PDE2fGEuX19oYWxmRGlnaXQoZytrLTEpKT4+PjA7bj0wfEEvdjtBPTB8QSV2O2Zvcih2YXIgRD1iLl9faGFsZkRpZ2l0KGstMiksdT1hLl9faGFsZkRpZ2l0KGcray0yKTtkLl9faW11bChuLEQpPj4+MD4oQTw8MTZ8dSk+Pj4wJiYobi0tLEErPXYsISg2NTUzNTxBKSk7KTt9ZC5fX2ludGVybmFsTXVsdGlwbHlBZGQoYixuLDAsZixwKTtBPWEuX19pbnBsYWNlU3ViKHAsZyxrKzEpOzAhPT1BJiYoQT1hLl9faW5wbGFjZUFkZChiLGcsayksYS5fX3NldEhhbGZEaWdpdChnK1xuayxhLl9faGFsZkRpZ2l0KGcraykrQSksbi0tKTtjJiYoMSZnP0I9bjw8MTY6aC5fX3NldERpZ2l0KGc+Pj4xLEJ8bikpfXJldHVybiBlPyhhLl9faW5wbGFjZVJpZ2h0U2hpZnQobCksYz97cXVvdGllbnQ6aCxyZW1haW5kZXI6YX06YSk6Yz9oOnZvaWQgMH19LHtrZXk6XCJfX2NsejE2XCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGQuX19jbHozMihhKS0xNn19LHtrZXk6XCJfX3NwZWNpYWxMZWZ0U2hpZnRcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGU9YS5sZW5ndGgsaz1uZXcgZChlK2MsITEpO2lmKDA9PT1iKXtmb3IoYj0wO2I8ZTtiKyspay5fX3NldERpZ2l0KGIsYS5fX2RpZ2l0KGIpKTtyZXR1cm4gMDxjJiZrLl9fc2V0RGlnaXQoZSwwKSxrfWZvcih2YXIgZixnPTAsaD0wO2g8ZTtoKyspZj1hLl9fZGlnaXQoaCksay5fX3NldERpZ2l0KGgsZjw8YnxnKSxnPWY+Pj4zMi1iO3JldHVybiAwPGMmJmsuX19zZXREaWdpdChlLGcpLGt9fSx7a2V5OlwiX19sZWZ0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWQuX190b1NoaWZ0QW1vdW50KGIpO2lmKDA+Yyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJpZ0ludCB0b28gYmlnXCIpO2I9Yz4+PjU7dmFyIGU9MzEmYyxrPWEubGVuZ3RoLGY9MCE9PWUmJjAhPWEuX19kaWdpdChrLTEpPj4+MzItZSxnPWsrYisoZj8xOjApO2M9bmV3IGQoZyxhLnNpZ24pO2lmKDA9PT1lKXtmb3IoZT0wO2U8YjtlKyspYy5fX3NldERpZ2l0KGUsMCk7Zm9yKDtlPGc7ZSsrKWMuX19zZXREaWdpdChlLGEuX19kaWdpdChlLWIpKX1lbHNle2Zvcih2YXIgaD1nPTA7aDxiO2grKyljLl9fc2V0RGlnaXQoaCwwKTtmb3IodmFyIHA9MDtwPGs7cCsrKWg9YS5fX2RpZ2l0KHApLGMuX19zZXREaWdpdChwK2IsaDw8ZXxnKSxnPWg+Pj4zMi1lO2lmKGYpYy5fX3NldERpZ2l0KGsrYixnKTtlbHNlIGlmKDAhPT1nKXRocm93IEVycm9yKFwiaW1wbGVtZW50YXRpb24gYnVnXCIpO31yZXR1cm4gYy5fX3RyaW0oKX19LHtrZXk6XCJfX3JpZ2h0U2hpZnRCeUFic29sdXRlXCIsXG52YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGU9YS5zaWduLGs9ZC5fX3RvU2hpZnRBbW91bnQoYik7aWYoMD5rKXJldHVybiBkLl9fcmlnaHRTaGlmdEJ5TWF4aW11bShlKTtiPWs+Pj41O3ZhciBmPTMxJmssZz1jLWI7aWYoMD49ZylyZXR1cm4gZC5fX3JpZ2h0U2hpZnRCeU1heGltdW0oZSk7az0hMTtpZihlKWlmKDAhPShhLl9fZGlnaXQoYikmKDE8PGYpLTEpKWs9ITA7ZWxzZSBmb3IodmFyIGg9MDtoPGI7aCsrKWlmKDAhPT1hLl9fZGlnaXQoaCkpe2s9ITA7YnJlYWt9ayYmMD09PWYmJjA9PX5hLl9fZGlnaXQoYy0xKSYmZysrO2U9bmV3IGQoZyxlKTtpZigwPT09Zilmb3IoZj1iO2Y8YztmKyspZS5fX3NldERpZ2l0KGYtYixhLl9fZGlnaXQoZikpO2Vsc2V7Zz1hLl9fZGlnaXQoYik+Pj5mO2g9Yy1iLTE7Zm9yKHZhciBwPTA7cDxoO3ArKyljPWEuX19kaWdpdChwK2IrMSksZS5fX3NldERpZ2l0KHAsYzw8MzItZnxnKSxnPWM+Pj5mO2UuX19zZXREaWdpdChoLGcpfXJldHVybiBrJiZcbihlPWQuX19hYnNvbHV0ZUFkZE9uZShlLCEwLGUpKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fcmlnaHRTaGlmdEJ5TWF4aW11bVwiLHZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBhP2QuX19vbmVEaWdpdCgxLCEwKTpkLl9femVybygpfX0se2tleTpcIl9fdG9TaGlmdEFtb3VudFwiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKDE8YS5sZW5ndGgpcmV0dXJuLTE7YT1hLl9fdW5zaWduZWREaWdpdCgwKTtyZXR1cm4gYT5kLl9fa01heExlbmd0aEJpdHM/LTE6YX19LHtrZXk6XCJfX3RvUHJpbWl0aXZlXCIsdmFsdWU6ZnVuY3Rpb24oYil7dmFyIGM9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwiZGVmYXVsdFwiO2lmKFwib2JqZWN0XCIhPT1hKGIpfHxiLmNvbnN0cnVjdG9yPT09ZClyZXR1cm4gYjt2YXIgZT1iW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYoZSl7Yz1lKGMpO2lmKFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufWlmKGM9Yi52YWx1ZU9mKWlmKGM9Yy5jYWxsKGIpLFwib2JqZWN0XCIhPT1hKGMpKXJldHVybiBjO2lmKGM9Yi50b1N0cmluZylpZihjPWMuY2FsbChiKSxcIm9iamVjdFwiIT09YShjKSlyZXR1cm4gYzt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTt9fSx7a2V5OlwiX190b051bWVyaWNcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gZC5fX2lzQmlnSW50KGEpP2E6K2F9fSx7a2V5OlwiX19pc0JpZ0ludFwiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVyblwib2JqZWN0XCI9PT1hKGIpJiZiLmNvbnN0cnVjdG9yPT09ZH19LHtrZXk6XCJfX3RydW5jYXRlVG9OQml0c1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9YSszMT4+PjUsZT1uZXcgZChjLGIuc2lnbik7LS1jO2Zvcih2YXIgaz0wO2s8YztrKyspZS5fX3NldERpZ2l0KGssYi5fX2RpZ2l0KGspKTtiPWIuX19kaWdpdChjKTswIT0oMzEmYSkmJihhPTMyLSgzMSZhKSxiPWI8PGE+Pj5cbmEpO3JldHVybiBlLl9fc2V0RGlnaXQoYyxiKSxlLl9fdHJpbSgpfX0se2tleTpcIl9fdHJ1bmNhdGVBbmRTdWJGcm9tUG93ZXJPZlR3b1wiLHZhbHVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZT1NYXRoLm1pbixrPWErMzE+Pj41O2M9bmV3IGQoayxjKTt2YXIgZj0wOy0tazt2YXIgZz0wO2ZvcihlPWUoayxiLmxlbmd0aCk7ZjxlO2YrKyl7dmFyIGg9Yi5fX2RpZ2l0KGYpLHA9LSg2NTUzNSZoKS1nO2c9MSZwPj4+MTY7aD0tKGg+Pj4xNiktZztnPTEmaD4+PjE2O2MuX19zZXREaWdpdChmLDY1NTM1JnB8aDw8MTYpfWZvcig7ZjxrO2YrKyljLl9fc2V0RGlnaXQoZiwwfC1nKTtiPWs8Yi5sZW5ndGg/Yi5fX2RpZ2l0KGspOjA7YSY9MzE7MD09PWE/KGc9LSg2NTUzNSZiKS1nLGc9NjU1MzUmZ3wtKGI+Pj4xNiktKDEmZz4+PjE2KTw8MTYpOihhPTMyLWEsYj1iPDxhPj4+YSxhPTE8PDMyLWEsZz0oNjU1MzUmYSktKDY1NTM1JmIpLWcsZz0oNjU1MzUmZ3woYT4+PjE2KS0oYj4+PjE2KS0oMSZnPj4+XG4xNik8PDE2KSZhLTEpO3JldHVybiBjLl9fc2V0RGlnaXQoayxnKSxjLl9fdHJpbSgpfX0se2tleTpcIl9fZGlnaXRQb3dcIix2YWx1ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD0xOzA8YjspMSZiJiYoZCo9YSksYj4+Pj0xLGEqPWE7cmV0dXJuIGR9fV0pLGR9KG4oQXJyYXkpKTtyZXR1cm4gQi5fX2tNYXhMZW5ndGg9MzM1NTQ0MzIsQi5fX2tNYXhMZW5ndGhCaXRzPUIuX19rTWF4TGVuZ3RoPDw1LEIuX19rTWF4Qml0c1BlckNoYXI9WzAsMCwzMiw1MSw2NCw3NSw4Myw5MCw5NiwxMDIsMTA3LDExMSwxMTUsMTE5LDEyMiwxMjYsMTI4LDEzMSwxMzQsMTM2LDEzOSwxNDEsMTQzLDE0NSwxNDcsMTQ5LDE1MSwxNTMsMTU0LDE1NiwxNTgsMTU5LDE2MCwxNjIsMTYzLDE2NSwxNjZdLEIuX19rQml0c1BlckNoYXJUYWJsZVNoaWZ0PTUsQi5fX2tCaXRzUGVyQ2hhclRhYmxlTXVsdGlwbGllcj0xPDxCLl9fa0JpdHNQZXJDaGFyVGFibGVTaGlmdCxCLl9fa0NvbnZlcnNpb25DaGFycz1cIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiLnNwbGl0KFwiXCIpLFxuQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig4KSxCLl9fa0JpdENvbnZlcnNpb25Eb3VibGU9bmV3IEZsb2F0NjRBcnJheShCLl9fa0JpdENvbnZlcnNpb25CdWZmZXIpLEIuX19rQml0Q29udmVyc2lvbkludHM9bmV3IEludDMyQXJyYXkoQi5fX2tCaXRDb252ZXJzaW9uQnVmZmVyKSxCLl9fY2x6MzI9dnx8ZnVuY3Rpb24oYSl7dmFyIGI9TWF0aC5MTjIsZD1NYXRoLmxvZztyZXR1cm4gMD09PWE/MzI6MHwzMS0oMHxkKGE+Pj4wKS9iKX0sQi5fX2ltdWw9dHx8ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMHxhKmJ9LEJ9KX0sZnVuY3Rpb24obSxxLGEpeyhmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoYSl7ZGVsZXRlIHRbYV19ZnVuY3Rpb24gZihhKXtpZih2KXNldFRpbWVvdXQoZiwwLGEpO2Vsc2V7dmFyIGI9dFthXTtpZihiKXt2PSEwO3RyeXt2YXIgZD1iLmNhbGxiYWNrLGs9Yi5hcmdzO3N3aXRjaChrLmxlbmd0aCl7Y2FzZSAwOmQoKTtcbmJyZWFrO2Nhc2UgMTpkKGtbMF0pO2JyZWFrO2Nhc2UgMjpkKGtbMF0sa1sxXSk7YnJlYWs7Y2FzZSAzOmQoa1swXSxrWzFdLGtbMl0pO2JyZWFrO2RlZmF1bHQ6ZC5hcHBseShjLGspfX1maW5hbGx5e2UoYSksdj0hMX19fX1mdW5jdGlvbiBkKCl7RD1mdW5jdGlvbihhKXtiLm5leHRUaWNrKGZ1bmN0aW9uKCl7ZihhKX0pfX1mdW5jdGlvbiBnKCl7aWYoYS5wb3N0TWVzc2FnZSYmIWEuaW1wb3J0U2NyaXB0cyl7dmFyIGI9ITAsZD1hLm9ubWVzc2FnZTthLm9ubWVzc2FnZT1mdW5jdGlvbigpe2I9ITF9O2EucG9zdE1lc3NhZ2UoXCJcIixcIipcIik7YS5vbm1lc3NhZ2U9ZDtyZXR1cm4gYn19ZnVuY3Rpb24gbigpe3ZhciBiPVwic2V0SW1tZWRpYXRlJFwiK01hdGgucmFuZG9tKCkrXCIkXCIsZD1mdW5jdGlvbihkKXtkLnNvdXJjZT09PWEmJlwic3RyaW5nXCI9PT10eXBlb2YgZC5kYXRhJiYwPT09ZC5kYXRhLmluZGV4T2YoYikmJmYoK2QuZGF0YS5zbGljZShiLmxlbmd0aCkpfTthLmFkZEV2ZW50TGlzdGVuZXI/XG5hLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsZCwhMSk6YS5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLGQpO0Q9ZnVuY3Rpb24oZCl7YS5wb3N0TWVzc2FnZShiK2QsXCIqXCIpfX1mdW5jdGlvbiBrKCl7dmFyIGE9bmV3IE1lc3NhZ2VDaGFubmVsO2EucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKGEpe2YoYS5kYXRhKX07RD1mdW5jdGlvbihiKXthLnBvcnQyLnBvc3RNZXNzYWdlKGIpfX1mdW5jdGlvbiBwKCl7dmFyIGE9Qi5kb2N1bWVudEVsZW1lbnQ7RD1mdW5jdGlvbihiKXt2YXIgZD1CLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ZC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtmKGIpO2Qub25yZWFkeXN0YXRlY2hhbmdlPW51bGw7YS5yZW1vdmVDaGlsZChkKTtkPW51bGx9O2EuYXBwZW5kQ2hpbGQoZCl9fWZ1bmN0aW9uIHUoKXtEPWZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoZiwwLGEpfX1pZighYS5zZXRJbW1lZGlhdGUpe3ZhciBBPTEsdD17fSx2PSExLEI9YS5kb2N1bWVudCxcbkQsRT1PYmplY3QuZ2V0UHJvdG90eXBlT2YmJk9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtFPUUmJkUuc2V0VGltZW91dD9FOmE7XCJbb2JqZWN0IHByb2Nlc3NdXCI9PT17fS50b1N0cmluZy5jYWxsKGEucHJvY2Vzcyk/ZCgpOmcoKT9uKCk6YS5NZXNzYWdlQ2hhbm5lbD9rKCk6QiYmXCJvbnJlYWR5c3RhdGVjaGFuZ2VcImluIEIuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9wKCk6dSgpO0Uuc2V0SW1tZWRpYXRlPWZ1bmN0aW9uKGEpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiYoYT1uZXcgRnVuY3Rpb24oXCJcIithKSk7Zm9yKHZhciBiPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF09YXJndW1lbnRzW2QrMV07dFtBXT17Y2FsbGJhY2s6YSxhcmdzOmJ9O0QoQSk7cmV0dXJuIEErK307RS5jbGVhckltbWVkaWF0ZT1lfX0pKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygc2VsZj9cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/dGhpczphOnNlbGYpfSkuY2FsbCh0aGlzLFxuYSgwKSxhKDgpKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7dGhyb3cgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpO31mdW5jdGlvbiBjKCl7dGhyb3cgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIik7fWZ1bmN0aW9uIGIoYil7aWYoZz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoYiwwKTtpZigoZz09PWF8fCFnKSYmc2V0VGltZW91dClyZXR1cm4gZz1zZXRUaW1lb3V0LHNldFRpbWVvdXQoYiwwKTt0cnl7cmV0dXJuIGcoYiwwKX1jYXRjaCh2KXt0cnl7cmV0dXJuIGcuY2FsbChudWxsLGIsMCl9Y2F0Y2goQil7cmV0dXJuIGcuY2FsbCh0aGlzLGIsMCl9fX1mdW5jdGlvbiBlKGEpe2lmKG49PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChhKTtpZigobj09PWN8fCFuKSYmY2xlYXJUaW1lb3V0KXJldHVybiBuPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoYSk7dHJ5e3JldHVybiBuKGEpfWNhdGNoKHYpe3RyeXtyZXR1cm4gbi5jYWxsKG51bGwsXG5hKX1jYXRjaChCKXtyZXR1cm4gbi5jYWxsKHRoaXMsYSl9fX1mdW5jdGlvbiBmKCl7cCYmdSYmKHA9ITEsdS5sZW5ndGg/az11LmNvbmNhdChrKTpBPS0xLGsubGVuZ3RoJiZsKCkpfWZ1bmN0aW9uIGwoKXtpZighcCl7dmFyIGE9YihmKTtwPSEwO2Zvcih2YXIgZD1rLmxlbmd0aDtkOyl7dT1rO2ZvcihrPVtdOysrQTxkOyl1JiZ1W0FdLnJ1bigpO0E9LTE7ZD1rLmxlbmd0aH11PW51bGw7cD0hMTtlKGEpfX1mdW5jdGlvbiBoKGEsYil7dGhpcy5mdW49YTt0aGlzLmFycmF5PWJ9ZnVuY3Rpb24gZCgpe31tPW0uZXhwb3J0cz17fTt0cnl7dmFyIGc9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDphfWNhdGNoKHQpe2c9YX10cnl7dmFyIG49XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6Y31jYXRjaCh0KXtuPWN9dmFyIGs9W10scD0hMSx1LEE9LTE7bS5uZXh0VGljaz1mdW5jdGlvbihhKXt2YXIgZD1BcnJheShhcmd1bWVudHMubGVuZ3RoLVxuMSk7aWYoMTxhcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspZFtjLTFdPWFyZ3VtZW50c1tjXTtrLnB1c2gobmV3IGgoYSxkKSk7MSE9PWsubGVuZ3RofHxwfHxiKGwpfTtoLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTttLnRpdGxlPVwiYnJvd3NlclwiO20uYnJvd3Nlcj0hMDttLmVudj17fTttLmFyZ3Y9W107bS52ZXJzaW9uPVwiXCI7bS52ZXJzaW9ucz17fTttLm9uPWQ7bS5hZGRMaXN0ZW5lcj1kO20ub25jZT1kO20ub2ZmPWQ7bS5yZW1vdmVMaXN0ZW5lcj1kO20ucmVtb3ZlQWxsTGlzdGVuZXJzPWQ7bS5lbWl0PWQ7bS5wcmVwZW5kTGlzdGVuZXI9ZDttLnByZXBlbmRPbmNlTGlzdGVuZXI9ZDttLmxpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm5bXX07bS5iaW5kaW5nPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKFwicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLmN3ZD1cbmZ1bmN0aW9uKCl7cmV0dXJuXCIvXCJ9O20uY2hkaXI9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIik7fTttLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihtLHEpe1NrLmFzc2VydHM9e307U2suYXNzZXJ0cy5hc3NlcnQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5hc3NlcnRcIixTay5hc3NlcnRzLmFzc2VydCk7U2suYXNzZXJ0cy5mYWlsPWZ1bmN0aW9uKGEpe307U2suZXhwb3J0U3ltYm9sKFwiU2suYXNzZXJ0cy5mYWlsXCIsU2suYXNzZXJ0cy5mYWlsKX0sZnVuY3Rpb24obSxxKXtTay5ib29sX2NoZWNrPWZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwPT09YXx8bnVsbD09PWF8fFwiYm9vbGVhblwiIT09dHlwZW9mIGEpdGhyb3cgRXJyb3IoXCJtdXN0IHNwZWNpZnkgXCIrYytcIiBhbmQgaXQgbXVzdCBiZSBhIGJvb2xlYW5cIik7fTtTay5weXRob24yPXtwcmludF9mdW5jdGlvbjohMSxcbmRpdmlzaW9uOiExLGFic29sdXRlX2ltcG9ydDpudWxsLHVuaWNvZGVfbGl0ZXJhbHM6ITEscHl0aG9uMzohMSxjbGFzc19yZXByOiExLGluaGVyaXRfZnJvbV9vYmplY3Q6ITEsc3VwZXJfYXJnczohMSxvY3RhbF9udW1iZXJfbGl0ZXJhbDohMSxiYW5rZXJzX3JvdW5kaW5nOiExLHB5dGhvbl92ZXJzaW9uOiExLGR1bmRlcl9yb3VuZDohMSxleGNlcHRpb25zOiExLG5vX2xvbmdfdHlwZTohMSxjZWlsX2Zsb29yX2ludDohMSxzaWxlbnRfb2N0YWxfbGl0ZXJhbDohMH07U2sucHl0aG9uMz17cHJpbnRfZnVuY3Rpb246ITAsZGl2aXNpb246ITAsYWJzb2x1dGVfaW1wb3J0Om51bGwsdW5pY29kZV9saXRlcmFsczohMCxweXRob24zOiEwLGNsYXNzX3JlcHI6ITAsaW5oZXJpdF9mcm9tX29iamVjdDohMCxzdXBlcl9hcmdzOiEwLG9jdGFsX251bWJlcl9saXRlcmFsOiEwLGJhbmtlcnNfcm91bmRpbmc6ITAscHl0aG9uX3ZlcnNpb246ITAsZHVuZGVyX3JvdW5kOiEwLGV4Y2VwdGlvbnM6ITAsXG5ub19sb25nX3R5cGU6ITAsY2VpbF9mbG9vcl9pbnQ6ITAsc2lsZW50X29jdGFsX2xpdGVyYWw6ITF9O1NrLmNvbmZpZ3VyZT1mdW5jdGlvbihhKXtTay5vdXRwdXQ9YS5vdXRwdXR8fFNrLm91dHB1dDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sub3V0cHV0KTtTay5maWxld3JpdGVyPWEuZmlsZXdyaXRlcnx8U2suZmlsZXdyaXRlcjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlcik7U2suZGVidWdvdXQ9YS5kZWJ1Z291dHx8U2suZGVidWdvdXQ7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmRlYnVnb3V0KTtTay51bmNhdWdodEV4Y2VwdGlvbj1hLnVuY2F1Z2h0RXhjZXB0aW9ufHxTay51bmNhdWdodEV4Y2VwdGlvbjtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2sudW5jYXVnaHRFeGNlcHRpb24pO1NrLnJlYWQ9YS5yZWFkfHxTay5yZWFkO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIFNrLnJlYWQpO1NrLm5vbnJlYWRvcGVuPWEubm9ucmVhZG9wZW58fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLm5vbnJlYWRvcGVuKTtTay5maWxlb3Blbj1hLmZpbGVvcGVufHx2b2lkIDA7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmZpbGVvcGVufHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGVvcGVuKTtTay5maWxld3JpdGU9YS5maWxld3JpdGV8fHZvaWQgMDtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suZmlsZXdyaXRlfHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIFNrLmZpbGV3cml0ZSk7U2sudGltZW91dE1zZz1hLnRpbWVvdXRNc2d8fFNrLnRpbWVvdXRNc2c7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLnRpbWVvdXRNc2cpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRpbWVvdXRNc2dcIixTay50aW1lb3V0TXNnKTtTay5zeXNhcmd2PWEuc3lzYXJndnx8XG5Tay5zeXNhcmd2O1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKFNrLnN5c2FyZ3YpKTtTay5fX2Z1dHVyZV9fPWEuX19mdXR1cmVfX3x8U2sucHl0aG9uMztTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ucHJpbnRfZnVuY3Rpb24sXCJTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5kaXZpc2lvbixcIlNrLl9fZnV0dXJlX18uZGl2aXNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHMsXCJTay5fX2Z1dHVyZV9fLnVuaWNvZGVfbGl0ZXJhbHNcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHIsXCJTay5fX2Z1dHVyZV9fLmNsYXNzX3JlcHJcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3QsXCJTay5fX2Z1dHVyZV9fLmluaGVyaXRfZnJvbV9vYmplY3RcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnN1cGVyX2FyZ3MsXG5cIlNrLl9fZnV0dXJlX18uc3VwZXJfYXJnc1wiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18ub2N0YWxfbnVtYmVyX2xpdGVyYWwsXCJTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nLFwiU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5weXRob25fdmVyc2lvbixcIlNrLl9fZnV0dXJlX18ucHl0aG9uX3ZlcnNpb25cIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLmR1bmRlcl9yb3VuZCxcIlNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5leGNlcHRpb25zLFwiU2suX19mdXR1cmVfXy5leGNlcHRpb25zXCIpO1NrLmJvb2xfY2hlY2soU2suX19mdXR1cmVfXy5ub19sb25nX3R5cGUsXCJTay5fX2Z1dHVyZV9fLm5vX2xvbmdfdHlwZVwiKTtTay5ib29sX2NoZWNrKFNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnQsXG5cIlNrLl9fZnV0dXJlX18uY2VpbF9mbG9vcl9pbnRcIik7U2suYm9vbF9jaGVjayhTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsLFwiU2suX19mdXR1cmVfXy5zaWxlbnRfb2N0YWxfbGl0ZXJhbFwiKTtTay5pbWFnZVByb3h5PWEuaW1hZ2VQcm94eXx8XCJodHRwOi8vbG9jYWxob3N0OjgwODAvMzIweFwiO1NrLmFzc2VydHMuYXNzZXJ0KFwic3RyaW5nXCI9PT10eXBlb2YgU2suaW1hZ2VQcm94eXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIFNrLmltYWdlUHJveHkpO1NrLmlucHV0ZnVuPWEuaW5wdXRmdW58fFNrLmlucHV0ZnVuO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5pbnB1dGZ1bik7U2suaW5wdXRmdW5UYWtlc1Byb21wdD1hLmlucHV0ZnVuVGFrZXNQcm9tcHR8fCExO1NrLmFzc2VydHMuYXNzZXJ0KFwiYm9vbGVhblwiPT09dHlwZW9mIFNrLmlucHV0ZnVuVGFrZXNQcm9tcHQpO1NrLnJldGFpbkdsb2JhbHM9YS5yZXRhaW5nbG9iYWxzfHxhLnJldGFpbkdsb2JhbHN8fFxuITE7U2suYXNzZXJ0cy5hc3NlcnQoXCJib29sZWFuXCI9PT10eXBlb2YgU2sucmV0YWluR2xvYmFscyk7U2suZGVidWdnaW5nPWEuZGVidWdnaW5nfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5kZWJ1Z2dpbmcpO1NrLmtpbGxhYmxlV2hpbGU9YS5raWxsYWJsZVdoaWxlfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZVdoaWxlKTtTay5raWxsYWJsZUZvcj1hLmtpbGxhYmxlRm9yfHwhMTtTay5hc3NlcnRzLmFzc2VydChcImJvb2xlYW5cIj09PXR5cGVvZiBTay5raWxsYWJsZUZvcik7U2suc2lnbmFscz1hLnNpZ25hbHM7U2suc2lnbmFscz0hMD09PVNrLnNpZ25hbHM/e2xpc3RlbmVyczpbXSxhZGRFdmVudExpc3RlbmVyKGEpe1NrLnNpZ25hbHMubGlzdGVuZXJzLnB1c2goYSl9LHJlbW92ZUV2ZW50TGlzdGVuZXIoYSl7YT1Tay5zaWduYWxzLmxpc3RlbmVycy5pbmRleE9mKGEpOzA8PWEmJlNrLnNpZ25hbHMubGlzdGVuZXJzLnNwbGljZShhLFxuMSl9LHNpZ25hbChhLGIpe2Zvcih2YXIgYz0wO2M8U2suc2lnbmFscy5saXN0ZW5lcnMubGVuZ3RoO2MrKylTay5zaWduYWxzLmxpc3RlbmVyc1tjXS5jYWxsKG51bGwsYSxiKX19Om51bGw7U2suYXNzZXJ0cy5hc3NlcnQoXCJvYmplY3RcIj09PXR5cGVvZiBTay5zaWduYWxzKTtTay5icmVha3BvaW50cz1hLmJyZWFrcG9pbnRzfHxmdW5jdGlvbigpe3JldHVybiEwfTtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PT10eXBlb2YgU2suYnJlYWtwb2ludHMpO1NrLnNldFRpbWVvdXQ9YS5zZXRUaW1lb3V0O3ZvaWQgMD09PVNrLnNldFRpbWVvdXQmJihTay5zZXRUaW1lb3V0PVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKGEsYil7c2V0VGltZW91dChhLGIpfTpmdW5jdGlvbihhLGIpe2EoKX0pO1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5zZXRUaW1lb3V0KTtcImV4ZWNMaW1pdFwiaW4gYSYmKFNrLmV4ZWNMaW1pdD1hLmV4ZWNMaW1pdCk7XG5cInlpZWxkTGltaXRcImluIGEmJihTay55aWVsZExpbWl0PWEueWllbGRMaW1pdCk7YS5zeXNwYXRoJiYoU2suc3lzcGF0aD1hLnN5c3BhdGgsU2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoU2suc3lzcGF0aCkpLFNrLnJlYWxzeXNwYXRoPXZvaWQgMCxTay5zeXNtb2R1bGVzPW5ldyBTay5idWlsdGluLmRpY3QoW10pKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLnN3aXRjaF92ZXJzaW9uKFNrLl9fZnV0dXJlX18ucHl0aG9uMyk7U2suYnVpbHRpbi5zdHIuJG5leHQ9U2suX19mdXR1cmVfXy5weXRob24zP25ldyBTay5idWlsdGluLnN0cihcIl9fbmV4dF9fXCIpOm5ldyBTay5idWlsdGluLnN0cihcIm5leHRcIik7U2suc2V0dXBPcGVyYXRvcnMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cER1bmRlck1ldGhvZHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay5zZXR1cE9iamVjdHMoU2suX19mdXR1cmVfXy5weXRob24zKTtTay50b2tlbi5zZXR1cFRva2VucyhTay5fX2Z1dHVyZV9fLnB5dGhvbjMpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmNvbmZpZ3VyZVwiLFNrLmNvbmZpZ3VyZSk7U2sudW5jYXVnaHRFeGNlcHRpb249ZnVuY3Rpb24oYSl7dGhyb3cgYTt9O1NrLnVuY2F1Z2h0RXhjZXB0aW9uPWZ1bmN0aW9uKGEpe3Rocm93IGE7fTtTay5leHBvcnRTeW1ib2woXCJTay51bmNhdWdodEV4Y2VwdGlvblwiLFNrLnVuY2F1Z2h0RXhjZXB0aW9uKTtTay50aW1lb3V0TXNnPWZ1bmN0aW9uKCl7cmV0dXJuXCJQcm9ncmFtIGV4Y2VlZGVkIHJ1biB0aW1lIGxpbWl0LlwifTtTay5leHBvcnRTeW1ib2woXCJTay50aW1lb3V0TXNnXCIsU2sudGltZW91dE1zZyk7U2suZXhlY0xpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay55aWVsZExpbWl0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtTay5vdXRwdXQ9ZnVuY3Rpb24oYSl7fTtTay5yZWFkPWZ1bmN0aW9uKGEpe2lmKHZvaWQgMD09PVNrLmJ1aWx0aW5GaWxlcyl0aHJvd1wic2t1bHB0LXN0ZGxpYi5qcyBoYXMgbm90IGJlZW4gbG9hZGVkXCI7aWYodm9pZCAwPT09XG5Tay5idWlsdGluRmlsZXMuZmlsZXNbYV0pdGhyb3dcIkZpbGUgbm90IGZvdW5kOiAnXCIrYStcIidcIjtyZXR1cm4gU2suYnVpbHRpbkZpbGVzLmZpbGVzW2FdfTtTay5zeXNhcmd2PVtdO1NrLmdldFN5c0FyZ3Y9ZnVuY3Rpb24oKXtyZXR1cm4gU2suc3lzYXJndn07U2suZXhwb3J0U3ltYm9sKFwiU2suZ2V0U3lzQXJndlwiLFNrLmdldFN5c0FyZ3YpO1NrLnN5c3BhdGg9W107U2suaW5Ccm93c2VyPXZvaWQgMCE9PVNrLmdsb2JhbC5kb2N1bWVudDtTay5kZWJ1Z291dD1mdW5jdGlvbihhKXt9OyhmdW5jdGlvbigpe3ZvaWQgMCE9PVNrLmdsb2JhbC53cml0ZT8oU2sub3V0cHV0PVNrLmdsb2JhbC53cml0ZSxTay5maWxld3JpdGVyPVNrLmdsb2JhbC53cml0ZSk6dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz8oU2sub3V0cHV0PWZ1bmN0aW9uKGEpe1NrLmdsb2JhbC5jb25zb2xlLmxvZyhhKX0sU2suZmlsZXdyaXRlcj1Tay5vdXRwdXQpOlxudm9pZCAwIT09U2suZ2xvYmFsLnByaW50JiYoU2sub3V0cHV0PVNrLmdsb2JhbC5wcmludCxTay5maWxld3JpdGVyPVNrLm91dHB1dCk7dm9pZCAwIT09U2suZ2xvYmFsLmNvbnNvbGUmJnZvaWQgMCE9PVNrLmdsb2JhbC5jb25zb2xlLmxvZz9Tay5kZWJ1Z291dD1mdW5jdGlvbihhKXtTay5nbG9iYWwuY29uc29sZS5sb2coYSl9OnZvaWQgMCE9PVNrLmdsb2JhbC5wcmludCYmKFNrLmRlYnVnb3V0PVNrLmdsb2JhbC5wcmludCl9KSgpO1NrLmlucHV0ZnVuPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cucHJvbXB0KGEpfTtTay5zZXR1cF9tZXRob2RfbWFwcGluZ3M9ZnVuY3Rpb24oKXt9O1NrLnNldHVwRGljdEl0ZXJhdG9ycz1mdW5jdGlvbihhKXt9O1NrLnN3aXRjaF92ZXJzaW9uPWZ1bmN0aW9uKGEpe2NvbnN0IGM9e2Zsb2F0Xzp7bWV0aG9kX25hbWVzOltcIl9fcm91bmRfX1wiXSwyOlshMV0sMzpbITBdfSxpbnRfOnttZXRob2RfbmFtZXM6W1wiX19yb3VuZF9fXCJdLDI6WyExXSwzOlshMF19LFxubGlzdDp7bWV0aG9kX25hbWVzOltcImNsZWFyXCIsXCJjb3B5XCIsXCJzb3J0XCJdLDI6WyExLCExLCEwXSwzOlshMCwhMCwhMF19LGRpY3Q6e21ldGhvZF9uYW1lczpbXCJoYXNfa2V5XCIsXCJrZXlzXCIsXCJpdGVtc1wiLFwidmFsdWVzXCJdLDI6WyEwLCEwLCEwLCEwXSwzOlshMSwhMCwhMCwhMF19fTtmb3IobGV0IGwgaW4gYyl7Y29uc3QgaD1Tay5idWlsdGluW2xdLGQ9Y1tsXS5tZXRob2RfbmFtZXM7dmFyIGI9Y1tsXVszXTtpZihhJiZ2b2lkIDA9PT1oLnB5MyRtZXRob2RzKWJyZWFrO2Vsc2UgaWYodm9pZCAwPT09aC5weTMkbWV0aG9kcyl7aC5weTMkbWV0aG9kcz17fTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtiW2VdJiYoaC5weTMkbWV0aG9kc1tmXT1oLnByb3RvdHlwZVtmXS5kJGRlZil9fWE/ZT1oLnB5MyRtZXRob2RzOihiPWNbbF1bMl0sZT1oLnB5MiRtZXRob2RzKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKXtjb25zdCBhPWRbZl07ZGVsZXRlIGgucHJvdG90eXBlW2FdO1xuYltmXSYmKGgucHJvdG90eXBlW2FdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGgsZVthXSkpfX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLl9fZnV0dXJlX19cIixTay5fX2Z1dHVyZV9fKTtTay5leHBvcnRTeW1ib2woXCJTay5pbnB1dGZ1blwiLFNrLmlucHV0ZnVuKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZVthLiRtYW5nbGVkXX1mdW5jdGlvbiBjKGEpe2E9YS4kbWFuZ2xlZDtjb25zdCBiPXRoaXMucHJvdG90eXBlLnRwJG1ybztmb3IobGV0IGQ9MDtkPGIubGVuZ3RoOysrZCl7Y29uc3QgYz1iW2RdLnByb3RvdHlwZTtpZihjLmhhc093blByb3BlcnR5KGEpKXJldHVybiBjW2FdfX1mdW5jdGlvbiBiKGIsZixoLGspe2NvbnN0IGQ9ZShoKSxnPWYucHJvdG90eXBlO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoYixmLGQsayk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZyx7c2skcHJvdG90eXBpY2FsOnt2YWx1ZTohMCx3cml0YWJsZTohMH0sXG50cCRiYXNlczp7dmFsdWU6aCx3cml0YWJsZTohMH0sdHAkbXJvOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxocCR0eXBlOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KTtnLnRwJG1ybz1mLiRidWlsZE1STygpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYseyR0eXBlTG9va3VwOnt2YWx1ZTpnLnNrJHByb3RvdHlwaWNhbD9hOmMsd3JpdGFibGU6ITB9LHNrJGtsYXNzOnt2YWx1ZTohMCx3cml0YWJsZTohMH19KX1mdW5jdGlvbiBlKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIHZvaWQgMD09PWEuc2ska2xhc3M/YTpiKGEucHJvdG90eXBlLnRwJGJhc2UpfTA9PT1hLmxlbmd0aCYmYS5wdXNoKFNrLmJ1aWx0aW4ub2JqZWN0KTtsZXQgZCxjLGUsZjtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7Zj1hW2tdO2lmKCFTay5idWlsdGluLmNoZWNrQ2xhc3MoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFzZXMgbXVzdCBiZSAndHlwZScgb2JqZWN0c1wiKTtpZighMT09PVxuZi5zayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSAnXCIrZi5wcm90b3R5cGUudHAkbmFtZStcIicgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlXCIpO2U9YihmKTtpZih2b2lkIDA9PT1jKWM9ZSxkPWY7ZWxzZSBpZighYy4kaXNTdWJUeXBlKGUpKWlmKGUuJGlzU3ViVHlwZShjKSljPWUsZD1mO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibXVsdGlwbGUgYmFzZXMgaGF2ZSBpbnN0YW5jZSBsYXlvdXQgY29uZmxpY3RzXCIpO31yZXR1cm4gZH1mdW5jdGlvbiBmKGEpe2Zvcig7bnVsbCE9PWEucHJvdG90eXBlLnRwJGJhc2U7KXtpZih2b2lkIDA9PT1hLnNrJGtsYXNzJiZhLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShcIl9fZGljdF9fXCIpKXJldHVybiBhPWEucHJvdG90eXBlLl9fZGljdF9fLFNrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3IoYSk/YTp2b2lkIDA7YT1hLnByb3RvdHlwZS50cCRiYXNlfX1cbmZ1bmN0aW9uIGwoYSxiLGMpe2lmKHZvaWQgMD09PWEuc2ska2xhc3MpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3Qgc2V0IFwiK2EucHJvdG90eXBlLnRwJG5hbWUrXCIuXCIrYy4kanNzdHIoKSk7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBkZWxldGUgXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIi5cIitjLiRqc3N0cigpKTt9dm9pZCAwPT09U2suYnVpbHRpbiYmKFNrLmJ1aWx0aW49e30pO1NrLmJ1aWx0aW4udHlwZT1mdW5jdGlvbihhKXt0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50eXBlJiZTay5hc3NlcnRzLmZhaWwoXCJjYWxsaW5nIG5ldyBTay5idWlsdGluLnR5cGUgaXMgbm90IHNhZmVcIik7cmV0dXJuIGEub2IkdHlwZX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZSx7Y2FsbDp7dmFsdWU6RnVuY3Rpb24ucHJvdG90eXBlLmNhbGx9LGFwcGx5Ont2YWx1ZTpGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LFxudHAkc2xvdHM6e3ZhbHVlOnt0cCRkb2M6XCJ0eXBlKG9iamVjdF9vcl9uYW1lLCBiYXNlcywgZGljdClcXG50eXBlKG9iamVjdCkgLT4gdGhlIG9iamVjdCdzIHR5cGVcXG50eXBlKG5hbWUsIGJhc2VzLCBkaWN0KSAtPiBhIG5ldyB0eXBlXCIsdHAkY2FsbDpmdW5jdGlvbihhLGIpe2lmKHRoaXM9PT1Tay5idWlsdGluLnR5cGUpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWJ8fCFiLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTtpZigzIT09YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHNcIik7fWxldCBkPXRoaXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2lmKGQuJGlzU3VzcGVuc2lvbilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxjPT57ZD1jO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXJldHVybiBkLnRwJGluaXQoYSxiKX0sKCk9PmQpO2lmKGQub2IkdHlwZS4kaXNTdWJUeXBlKHRoaXMpKXtjb25zdCBjPVxuZC50cCRpbml0KGEsYik7cmV0dXJuIHZvaWQgMCE9PWMmJmMuJGlzU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5jaGFpbihjLCgpPT5kKTpkfXJldHVybiBkfSx0cCRuZXc6ZnVuY3Rpb24oYSxjKXtpZigzIT09YS5sZW5ndGgpe2lmKDE9PT1hLmxlbmd0aCYmKHZvaWQgMD09PWN8fCFjLmxlbmd0aCkpcmV0dXJuIGFbMF0ub2IkdHlwZTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgdGFrZXMgMSBvciAzIGFyZ3VtZW50c1wiKTt9bGV0IGQ7Yz1hWzBdO2Q9YVsxXTthPWFbMl07aWYoXCJkaWN0XCIhPT1hLnRwJG5hbWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidHlwZSgpIGFyZ3VtZW50IDMgbXVzdCBiZSBkaWN0LCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR5cGUoKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpO1xuYz1jLiRqc3N0cigpO2lmKFwidHVwbGVcIiE9PWQudHAkbmFtZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ0eXBlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHR1cGxlLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoZCkpO2Q9ZC5zayRhc2FycmF5KCk7Y29uc3QgZT1mdW5jdGlvbigpe3RoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdH07YihjLGUsZCx0aGlzLmNvbnN0cnVjdG9yKTtTay5nbG9iYWxzJiYoZS5wcm90b3R5cGUuX19tb2R1bGVfXz1Tay5nbG9iYWxzLl9fbmFtZV9fKTtlLnByb3RvdHlwZS5fX2RvY19fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDt2b2lkIDA9PT1lLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaWN0KSYmKGUucHJvdG90eXBlLl9fZGljdF9fPW5ldyBTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yKGUsaCkpO2EuJGl0ZW1zKCkuZm9yRWFjaCgoW2EsYl0pPT57ZS5wcm90b3R5cGVbYS4kbWFuZ2xlZF09Yn0pO2UucHJvdG90eXBlLmhhc093blByb3BlcnR5KFwiX19uZXdfX1wiKSYmXG4oYT1lLnByb3RvdHlwZS5fX25ld19fLGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMmJihlLnByb3RvdHlwZS5fX25ld19fPW5ldyBTay5idWlsdGluLnN0YXRpY21ldGhvZChhKSkpO2UuJGFsbG9jYXRlU2xvdHMoKTtyZXR1cm4gZX0sdHAkZ2V0YXR0cjpmdW5jdGlvbihhLGIpe3ZhciBkPXRoaXMub2IkdHlwZTtjb25zdCBjPWQuJHR5cGVMb29rdXAoYSk7bGV0IGU7aWYodm9pZCAwIT09YyYmKGU9Yy50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmdm9pZCAwIT09Yy50cCRkZXNjcl9zZXQpKXJldHVybiBiPWUuY2FsbChjLHRoaXMsZCxiKTthPXRoaXMuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09YSlyZXR1cm4gZD1hLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1kP2I9ZC5jYWxsKGEsbnVsbCx0aGlzLGIpOmE7aWYodm9pZCAwIT09ZSlyZXR1cm4gYj1lLmNhbGwoYyx0aGlzLGQsYik7aWYodm9pZCAwIT09YylyZXR1cm4gY30sdHAkc2V0YXR0cjpmdW5jdGlvbihhLGIsYyl7aWYoIXRoaXMuc2ska2xhc3Mpe2lmKHZvaWQgMCE9PVxuYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnXCIrdGhpcy5wcm90b3R5cGUudHAkbmFtZStcIidcIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZXMgb24gdHlwZSBvYmplY3QgJ1wiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInXCIpO31jb25zdCBkPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1kKXtjb25zdCBhPWQudHAkZGVzY3Jfc2V0O2lmKGEpcmV0dXJuIGEuY2FsbChkLHRoaXMsYixjKX1jPWEuJG1hbmdsZWQ7aWYodm9pZCAwPT09YilpZihiPXRoaXMucHJvdG90eXBlLGIuaGFzT3duUHJvcGVydHkoYykpZGVsZXRlIGJbY10sYT1Tay5kdW5kZXJUb1NrdWxwdFtjXSx2b2lkIDAhPT1hJiYoZGVsZXRlIHRoaXMucHJvdG90eXBlW2FdLGIuc2skcHJvdG90eXBpY2FsfHx0aGlzLiRhbGxvY2F0ZUdldHRlclNsb3QoYykpO1xuZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJyBoYXMgbm8gYXR0cmlidXRlICdcIithLiRqc3N0cigpK1wiJ1wiKTtlbHNlIHRoaXMucHJvdG90eXBlW2NdPWIsYyBpbiBTay5kdW5kZXJUb1NrdWxwdCYmdGhpcy4kYWxsb2NhdGVTbG90KGMsYil9LCRyOmZ1bmN0aW9uKCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXyxiPVwiXCIsYz1cImNsYXNzXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKT9iPWEuditcIi5cIjphPW51bGw7YXx8dGhpcy5zayRrbGFzc3x8U2suX19mdXR1cmVfXy5jbGFzc19yZXByfHwoYz1cInR5cGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIitjK1wiICdcIitiK3RoaXMucHJvdG90eXBlLnRwJG5hbWUrXCInPlwiKX19LHdyaXRhYmxlOiEwfSx0cCRtZXRob2RzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSx0cCRnZXRzZXRzOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxcbnNrJHR5cGU6e3ZhbHVlOiEwfSwkaXNTdWJUeXBlOnt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcz09PWF8fHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgYXx8IXRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmdGhpcy5wcm90b3R5cGUudHAkbXJvLmluY2x1ZGVzKGEpfX0sJGFsbG9jYXRlU2xvdDp7dmFsdWU6ZnVuY3Rpb24oYSxiKXthPVNrLnNsb3RzW2FdO2NvbnN0IGM9YS4kc2xvdF9uYW1lLGQ9dGhpcy5wcm90b3R5cGU7ZC5oYXNPd25Qcm9wZXJ0eShjKSYmZGVsZXRlIGRbY107ZFtjXT1hLiRzbG90X2Z1bmMoYil9fSwkYWxsb2NhdGVTbG90czp7dmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMucHJvdG90eXBlO3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD9PYmplY3Qua2V5cyhhKS5mb3JFYWNoKGI9PntiIGluIFNrLnNsb3RzJiZ0aGlzLiRhbGxvY2F0ZVNsb3QoYixhW2JdKX0pOk9iamVjdC5rZXlzKFNrLnNsb3RzKS5mb3JFYWNoKGI9PnthLmhhc093blByb3BlcnR5KGIpP1xudGhpcy4kYWxsb2NhdGVTbG90KGIsYVtiXSk6dGhpcy4kYWxsb2NhdGVHZXR0ZXJTbG90KGIpfSl9fSwkYWxsb2NhdGVHZXR0ZXJTbG90Ont2YWx1ZTpmdW5jdGlvbihhKXtjb25zdCBiPVNrLnNsb3RzW2FdLiRzbG90X25hbWUsYz10aGlzLnByb3RvdHlwZTtjLmhhc093blByb3BlcnR5KGIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxiLHtjb25maWd1cmFibGU6ITAsZ2V0KCl7Y29uc3QgYT1jLnRwJG1ybztmb3IobGV0IGM9MTtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFbY10ucHJvdG90eXBlLGIpO2lmKHZvaWQgMCE9PWQmJmQudmFsdWUpcmV0dXJuIGQudmFsdWV9fX0pfX0sJHR5cGVMb29rdXA6e3ZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnByb3RvdHlwZS5zayRwcm90b3R5cGljYWw/dGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF06Yy5jYWxsKHRoaXMsYSl9LHdyaXRhYmxlOiEwfSwkbXJvTWVyZ2U6e3ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbD1cbiEwO2xldCBiO2NvbnN0IGM9W107Zm9yKDs7KXtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgZD1hW2JdO2lmKDAhPT1kLmxlbmd0aClicmVha31pZihiPT09YS5sZW5ndGgpcmV0dXJuIGM7dmFyIGU9W107Zm9yKGI9MDtiPGEubGVuZ3RoOysrYilpZihkPWFbYl0sMCE9PWQubGVuZ3RoKXtjb25zdCBiPWRbMF07ZD0wO2E6Zm9yKDtkPGEubGVuZ3RoOysrZCl7Y29uc3QgYz1hW2RdO2ZvcihsZXQgYT0xO2E8Yy5sZW5ndGg7KythKWlmKGNbYV09PT1iKWJyZWFrIGF9ZD09PWEubGVuZ3RoJiZlLnB1c2goYil9aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkluY29uc2lzdGVudCBwcmVjZWRlbmNlcyBpbiB0eXBlIGhpZXJhcmNoeVwiKTtlPWVbMF07Yy5sZW5ndGgmJnRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbCYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGNbYy5sZW5ndGgtMV0ucHJvdG90eXBlKSE9PWUucHJvdG90eXBlJiYodGhpcy5wcm90b3R5cGUuc2skcHJvdG90eXBpY2FsPVxuITEpO2MucHVzaChlKTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWQ9YVtiXSwwPGQubGVuZ3RoJiZkWzBdPT09ZSYmZC5zcGxpY2UoMCwxKX19fSwkYnVpbGRNUk86e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYT1bW3RoaXNdXSxiPXRoaXMucHJvdG90eXBlLnRwJGJhc2VzO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7KytjKWEucHVzaChbLi4uYltjXS5wcm90b3R5cGUudHAkbXJvXSk7Yz1bXTtmb3IobGV0IGE9MDthPGIubGVuZ3RoOysrYSljLnB1c2goYlthXSk7YS5wdXNoKGMpO3JldHVybiB0aGlzLiRtcm9NZXJnZShhKX19LHNrJGF0dHJFcnJvcjp7dmFsdWUoKXtyZXR1cm5cInR5cGUgb2JqZWN0ICdcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiJ1wifSx3cml0YWJsZTohMH19KTtTay5idWlsdGluLnR5cGUucHJvdG90eXBlLnRwJGdldHNldHM9e19fYmFzZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMucHJvdG90eXBlLnRwJGJhc2V8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fYmFzZXNfXzp7JGdldCgpe3ZvaWQgMD09PVxudGhpcy5zayR0dXBsZV9iYXNlcyYmKHRoaXMuc2skdHVwbGVfYmFzZXM9bmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy5wcm90b3R5cGUudHAkYmFzZXMpKTtyZXR1cm4gdGhpcy5zayR0dXBsZV9iYXNlc319LF9fbXJvX186eyRnZXQoKXt2b2lkIDA9PT10aGlzLnNrJHR1cGxlX21ybyYmKHRoaXMuc2skdHVwbGVfbXJvPW5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMucHJvdG90eXBlLnRwJG1ybykpO3JldHVybiB0aGlzLnNrJHR1cGxlX21yb319LF9fZGljdF9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLm1hcHBpbmdwcm94eSh0aGlzLnByb3RvdHlwZSl9fSxfX2RvY19fOnskZ2V0KCl7Y29uc3QgYT10aGlzLiR0eXBlTG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3JldHVybiBhP3ZvaWQgMCE9PWEudHAkZGVzY3JfZ2V0P3RoaXM9PT1Tay5idWlsdGluLnR5cGU/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMucHJvdG90eXBlLnRwJGRvYyk6YS50cCRkZXNjcl9nZXQobnVsbCxcbnRoaXMpOnRoaXMucHJvdG90eXBlLl9fZG9jX186U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe2wodGhpcyxhLFNrLmJ1aWx0aW4uc3RyLiRkb2MpO3RoaXMucHJvdG90eXBlLl9fZG9jX189YX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnByb3RvdHlwZS50cCRuYW1lKX0sJHNldChhKXtsKHRoaXMsYSxTay5idWlsdGluLnN0ci4kbmFtZSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byBcIit0aGlzLnByb3RvdHlwZS50cCRuYW1lK1wiLl9fbmFtZV9fLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTt0aGlzLnByb3RvdHlwZS50cCRuYW1lPWEuJGpzc3RyKCl9fSxfX21vZHVsZV9fOnskZ2V0KCl7bGV0IGE9dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXztyZXR1cm4gYSYmYS5vYiR0eXBlIT09U2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcj9cbmE6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiYnVpbHRpbnNcIil9LCRzZXQoYSl7bCh0aGlzLGEsU2suYnVpbHRpbi5zdHIuJG1vZHVsZSk7dGhpcy5wcm90b3R5cGUuX19tb2R1bGVfXz1hfX19O1NrLmJ1aWx0aW4udHlwZS5wcm90b3R5cGUudHAkbWV0aG9kcz17bXJvOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuJGJ1aWxkTVJPKCkpfSwkZmxhZ3M6e05vQXJnczohMH19LF9fZGlyX186eyRtZXRoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXthIGluIFNrLnJlc2VydmVkV29yZHNffHwoYT1Tay51bmZpeFJlc2VydmVkKGEpLC0xIT09YS5pbmRleE9mKFwiJFwiKXx8Yi5oYXMoYSl8fChiLmFkZChhKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGEpKSkpfWNvbnN0IGI9bmV3IFNldCxjPVtdO2lmKHRoaXMucHJvdG90eXBlLnNrJHByb3RvdHlwaWNhbClmb3IodmFyIGUgaW4gdGhpcy5wcm90b3R5cGUpYShlKTtlbHNle2U9dGhpcy5wcm90b3R5cGUudHAkbXJvO2ZvcihsZXQgYj1cbjA7YjxlLmxlbmd0aDtiKyspe2NvbnN0IGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZVtiXS5wcm90b3R5cGUpO2ZvcihsZXQgYj0wO2I8Yy5sZW5ndGg7YisrKWEoY1tiXSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlNwZWNpYWxpemVkIF9fZGlyX18gaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzLlwifX07Y29uc3QgaD17JGdldCgpe2NvbnN0IGE9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1hP2EudHAkZGVzY3JfZ2V0KHRoaXMsdGhpcy5vYiR0eXBlKTpTay5nZW5lcmljLmdldFNldERpY3QuJGdldC5jYWxsKHRoaXMpfSwkc2V0KGEpe2NvbnN0IGI9Zih0aGlzLm9iJHR5cGUpO3JldHVybiB2b2lkIDAhPT1iP2IudHAkZGVzY3Jfc2V0KHRoaXMsYSk6U2suZ2VuZXJpYy5nZXRTZXREaWN0LiRzZXQuY2FsbCh0aGlzLGEpfSwkZG9jOlwiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKVwiLFxuJG5hbWU6XCJfX2RpY3RfX1wifX0sZnVuY3Rpb24obSxxKXtTay5nZW5lcmljPXt9O1NrLmdlbmVyaWMuZ2V0QXR0cj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9dGhpcy5vYiR0eXBlLGY9ZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1mJiYoYj1mLnRwJGRlc2NyX2dldCx2b2lkIDAhPT1iJiZ2b2lkIDAhPT1mLnRwJGRlc2NyX3NldCkpcmV0dXJuIGIuY2FsbChmLHRoaXMsZSxjKTtjb25zdCBsPXRoaXMuJGQ7aWYodm9pZCAwIT09bCYmKGE9bC5xdWljayRsb29rdXAoYSksdm9pZCAwIT09YSkpcmV0dXJuIGE7aWYodm9pZCAwIT09YilyZXR1cm4gYi5jYWxsKGYsdGhpcyxlLGMpO2lmKHZvaWQgMCE9PWYpcmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmdlbmVyaWMuZ2V0QXR0clwiLFNrLmdlbmVyaWMuZ2V0QXR0cik7U2suZ2VuZXJpYy5zZXRBdHRyPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoYSk7aWYodm9pZCAwIT09ZSYmbnVsbCE9PVxuZSl7Y29uc3QgYT1lLnRwJGRlc2NyX3NldDtpZihhKXJldHVybiBhLmNhbGwoZSx0aGlzLGMsYil9Yj10aGlzLiRkO2lmKHZvaWQgMCE9PWIpaWYoYi5tcCRhc3Nfc3Vic2NyaXB0KXtpZih2b2lkIDAhPT1jKXJldHVybiBiLm1wJGFzc19zdWJzY3JpcHQoYSxjKTt0cnl7cmV0dXJuIGIubXAkYXNzX3N1YnNjcmlwdChhKX1jYXRjaChmKXtpZihmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5LZXlFcnJvcil0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2EuJGpzc3RyKCkrXCInXCIpO3Rocm93IGY7fX1lbHNlIGlmKFwib2JqZWN0XCI9PT10eXBlb2YgYil7ZT1hLiRtYW5nbGVkO2lmKHZvaWQgMCE9PWMpe2JbZV09YztyZXR1cm59aWYodm9pZCAwIT09YltlXSl7ZGVsZXRlIGJbZV07cmV0dXJufX10aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcih0aGlzLnNrJGF0dHJFcnJvcigpK1xuXCIgaGFzIG5vIGF0dHJpYnV0ZSAnXCIrYS4kanNzdHIoKStcIidcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5nZW5lcmljLnNldEF0dHJcIixTay5nZW5lcmljLnNldEF0dHIpO1NrLmdlbmVyaWMubmV3PWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjLGIpe2lmKHRoaXMuY29uc3RydWN0b3I9PT1hKXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcjtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2EuY2FsbChjKTtyZXR1cm4gY319O1NrLmdlbmVyaWMubmV3TWV0aG9kRGVmPXskbWV0aChhLGMpe2NvbnN0IGI9dGhpcy5wcm90b3R5cGU7aWYoMT5hLmxlbmd0aCl0aHJvdyBhPWIudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKCk6IG5vdCBlbm91Z2ggYXJndW1lbnRzXCIpO3ZhciBlPWEuc2hpZnQoKTtpZih2b2lkIDA9PT1lLnNrJHR5cGUpdGhyb3cgYT1iLnRwJG5hbWUsbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCJfX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0IChcIitcblNrLmFic3RyLnR5cGVOYW1lKGUpK1wiKVwiKTtpZighZS4kaXNTdWJUeXBlKHRoaXMpKXRocm93IGE9Yi50cCRuYW1lLGU9ZS5wcm90b3R5cGUudHAkbmFtZSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIi5fX25ld19fKFwiK2UrXCIpOiBcIitlK1wiIGlzIG5vdCBhIHN1YnR5cGUgb2YgXCIrYSk7Y29uc3QgZj1lLnByb3RvdHlwZS5zayRzdGF0aWNOZXcucHJvdG90eXBlO2lmKGYudHAkbmV3IT09Yi50cCRuZXcpdGhyb3cgYT1iLnRwJG5hbWUsZT1lLnByb3RvdHlwZS50cCRuYW1lLG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiLl9fbmV3X18oXCIrZStcIikgaXMgbm90IHNhZmUsIHVzZSBcIitmLnRwJG5hbWUrXCIuX19uZXdfXygpXCIpO3JldHVybiBiLnRwJG5ldy5jYWxsKGUucHJvdG90eXBlLGEsYyl9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCR0eXBlLCAqYXJncywgKiprd2FyZ3MpXCIsJG5hbWU6XCJfX25ld19fXCJ9O1NrLmdlbmVyaWMuc2VsZkl0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307XG5Tay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplPWZ1bmN0aW9uKCl7aWYodGhpcy4kc2VxLmxlbmd0aCE9PXRoaXMuJG9yaWcuZ2V0JHNpemUoKSl7Y29uc3QgYT10aGlzLnRwJG5hbWUuc3BsaXQoXCJfXCIpWzBdO3Rocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihhK1wiIGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uXCIpO31pZighKHRoaXMuJGluZGV4Pj10aGlzLiRzZXEubGVuZ3RoKSlyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfTtTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5PWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107dm9pZCAwPT09YSYmKHRoaXMudHAkaXRlcm5leHQ9KCk9Pnt9KTtyZXR1cm4gYX07U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZj17JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRzZXEubGVuZ3RoLXRoaXMuJGluZGV4KX0sXG4kZmxhZ3M6e05vQXJnczohMH19O1NrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmPXskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuJGluZGV4KX0sJGZsYWdzOntOb0FyZ3M6ITB9fTtTay5nZW5lcmljLmdldFNldERpY3Q9eyRnZXQoKXtyZXR1cm4gdGhpcy4kZH0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRoaXMuJGQ9bmV3IFNrLmJ1aWx0aW4uZGljdDtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpdGhpcy4kZD1hO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19kaWN0X18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0aW9uYXJ5LCBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sJGRvYzpcImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZClcIiwkbmFtZTpcIl9fZGljdF9fXCJ9O1NrLmdlbmVyaWMuc2VxQ29tcGFyZT1mdW5jdGlvbihhLFxuYyl7aWYodGhpcz09PWEmJlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHkoYykpcmV0dXJuITA7aWYoIShhIGluc3RhbmNlb2YgdGhpcy5zayRidWlsdGluQmFzZSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO2NvbnN0IGI9dGhpcy52O2E9YS52O2xldCBlO2lmKGIubGVuZ3RoIT09YS5sZW5ndGgmJihcIkVxXCI9PT1jfHxcIk5vdEVxXCI9PT1jKSlyZXR1cm5cIkVxXCI9PT1jPyExOiEwO2ZvcihlPTA7ZTxiLmxlbmd0aCYmZTxhLmxlbmd0aCYmKGJbZV09PT1hW2VdfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLFwiRXFcIikpOysrZSk7Y29uc3QgZj1iLmxlbmd0aCxsPWEubGVuZ3RoO2lmKGU+PWZ8fGU+PWwpc3dpdGNoKGMpe2Nhc2UgXCJMdFwiOnJldHVybiBmPGw7Y2FzZSBcIkx0RVwiOnJldHVybiBmPD1sO2Nhc2UgXCJFcVwiOnJldHVybiBmPT09bDtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZiE9PWw7Y2FzZSBcIkd0XCI6cmV0dXJuIGY+XG5sO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZj49bDtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbCgpfXJldHVyblwiRXFcIj09PWM/ITE6XCJOb3RFcVwiPT09Yz8hMDpTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYltlXSxhW2VdLGMpfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnB5Q2hlY2tBcmdzPWZ1bmN0aW9uKGEsYyxiLGUsZixsKXtjPWMubGVuZ3RoO3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6MDxiP2ErXCIoKSB0YWtlcyBhdCBtb3N0IFwiK2UrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIG5vIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2MrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NcIixTay5idWlsdGluLnB5Q2hlY2tBcmdzKTtcblNrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe3ZvaWQgMD09PWUmJihlPUluZmluaXR5KTtmJiYtLWM7bCYmLS1jO2lmKGM8Ynx8Yz5lKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYj09PWU/YStcIigpIHRha2VzIGV4YWN0bHkgXCIrYitcIiBhcmd1bWVudHNcIjpjPGI/YStcIigpIHRha2VzIGF0IGxlYXN0IFwiK2IrXCIgYXJndW1lbnRzXCI6YStcIigpIHRha2VzIGF0IG1vc3QgXCIrZStcIiBhcmd1bWVudHNcIikrKFwiIChcIitjK1wiIGdpdmVuKVwiKSk7fTtTay5idWlsdGluLnB5Q2hlY2tUeXBlPWZ1bmN0aW9uKGEsYyxiKXtpZighYil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBtdXN0IGJlIGEgXCIrYyk7fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLnB5Q2hlY2tUeXBlXCIsU2suYnVpbHRpbi5weUNoZWNrVHlwZSk7U2suYnVpbHRpbi5jaGVja1NlcXVlbmNlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdH07XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrU2VxdWVuY2VcIixTay5idWlsdGluLmNoZWNrU2VxdWVuY2UpO1NrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZT1mdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT8hMTphLnRwJGl0ZXI/dm9pZCAwIT09YS50cCRpdGVyKCkudHAkaXRlcm5leHQ6dm9pZCAwIT09YS5tcCRzdWJzY3JpcHR9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZVwiLFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZSk7U2suYnVpbHRpbi5jaGVja0NhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hJiZ2b2lkIDAhPT1hLnRwJGNhbGx9O1NrLmJ1aWx0aW4uY2hlY2tOdW1iZXI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZ307U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja051bWJlclwiLFxuU2suYnVpbHRpbi5jaGVja051bWJlcik7U2suYnVpbHRpbi5jaGVja0NvbXBsZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXh9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4XCIsU2suYnVpbHRpbi5jaGVja0NvbXBsZXgpO1NrLmJ1aWx0aW4uY2hlY2tJbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5jaGVja0ludFwiLFNrLmJ1aWx0aW4uY2hlY2tJbnQpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRffTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRmxvYXRcIixTay5idWlsdGluLmNoZWNrRmxvYXQpO1NrLmJ1aWx0aW4uY2hlY2tTdHJpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tTdHJpbmdcIixTay5idWlsdGluLmNoZWNrU3RyaW5nKTtTay5idWlsdGluLmNoZWNrQnl0ZXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfTtTay5idWlsdGluLmNoZWNrQ2xhc3M9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR5cGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tDbGFzc1wiLFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyk7U2suYnVpbHRpbi5jaGVja0Jvb2w9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2x9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY2hlY2tCb29sXCIsU2suYnVpbHRpbi5jaGVja0Jvb2wpO1NrLmJ1aWx0aW4uY2hlY2tOb25lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrTm9uZVwiLFxuU2suYnVpbHRpbi5jaGVja05vbmUpO1NrLmJ1aWx0aW4uY2hlY2tGdW5jdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmdm9pZCAwIT09YS50cCRjYWxsfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRnVuY3Rpb25cIixTay5idWlsdGluLmNoZWNrRnVuY3Rpb24pO1NrLmJ1aWx0aW4uY2hlY2tEYXRhRGVzY3I9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnZvaWQgMCE9PWEudHAkZGVzY3Jfc2V0fTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNoZWNrRGF0YURlc2NyXCIsU2suYnVpbHRpbi5jaGVja0RhdGFEZXNjcik7U2suYnVpbHRpbi5jaGVja0FueVNldD1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2V0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXR9O1NrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0fHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5tYXBwaW5ncHJveHl8fFxubnVsbCE9YSYmdm9pZCAwIT09YS5tcCRzdWJzY3JpcHQmJnZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyl9fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJGFkZDtjYXNlIFwiU3ViXCI6cmV0dXJuIGEubmIkc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRtdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRtYXRyaXhfbXVsdGlwbHk7Y2FzZSBcIkRpdlwiOnJldHVybiBhLm5iJGRpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRmbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlbWFpbmRlcjtjYXNlIFwiRGl2TW9kXCI6cmV0dXJuIGEubmIkZGl2bW9kO2Nhc2UgXCJQb3dcIjpyZXR1cm4gYS5uYiRwb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyc2hpZnQ7XG5jYXNlIFwiQml0QW5kXCI6cmV0dXJuIGEubmIkYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiR4b3I7Y2FzZSBcIkJpdE9yXCI6cmV0dXJuIGEubmIkb3J9fWZ1bmN0aW9uIGMoYSxiKXtzd2l0Y2goYil7Y2FzZSBcIkFkZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9zdWJ0cmFjdDtjYXNlIFwiTXVsdFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9tdWx0aXBseTtjYXNlIFwiTWF0TXVsdFwiOmlmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfZGl2aWRlO2Nhc2UgXCJGbG9vckRpdlwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGU7Y2FzZSBcIk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9yZW1haW5kZXI7Y2FzZSBcIkRpdk1vZFwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9kaXZtb2Q7Y2FzZSBcIlBvd1wiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9wb3dlcjtcbmNhc2UgXCJMU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfbHNoaWZ0O2Nhc2UgXCJSU2hpZnRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfYW5kO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRyZWZsZWN0ZWRfeG9yO2Nhc2UgXCJCaXRPclwiOnJldHVybiBhLm5iJHJlZmxlY3RlZF9vcn19ZnVuY3Rpb24gYihhLGIpe3N3aXRjaChiKXtjYXNlIFwiQWRkXCI6cmV0dXJuIGEubmIkaW5wbGFjZV9hZGQ7Y2FzZSBcIlN1YlwiOnJldHVybiBhLm5iJGlucGxhY2Vfc3VidHJhY3Q7Y2FzZSBcIk11bHRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX211bHRpcGx5O2Nhc2UgXCJNYXRNdWx0XCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBhLm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5O2Nhc2UgXCJEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2RpdmlkZTtjYXNlIFwiRmxvb3JEaXZcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2Zsb29yX2RpdmlkZTtcbmNhc2UgXCJNb2RcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3JlbWFpbmRlcjtjYXNlIFwiUG93XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9wb3dlcjtjYXNlIFwiTFNoaWZ0XCI6cmV0dXJuIGEubmIkaW5wbGFjZV9sc2hpZnQ7Y2FzZSBcIlJTaGlmdFwiOnJldHVybiBhLm5iJGlucGxhY2VfcnNoaWZ0O2Nhc2UgXCJCaXRBbmRcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX2FuZDtjYXNlIFwiQml0T3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX29yO2Nhc2UgXCJCaXRYb3JcIjpyZXR1cm4gYS5uYiRpbnBsYWNlX3hvcn19ZnVuY3Rpb24gZShiLGQsZSl7dmFyIGs9ZC5jb25zdHJ1Y3RvcixmPWIuY29uc3RydWN0b3I7aWYoaz1rIT09ZiYmdm9pZCAwPT09ay5zayRiYXNlQ2xhc3MmJmQgaW5zdGFuY2VvZiBmKWlmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJmYhPT1jKGIsZSkmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpcmV0dXJuIGY7Zj1hKGIsZSk7aWYodm9pZCAwIT09XG5mJiYoZj1mLmNhbGwoYixkKSxmIT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQpfHwhayYmKGY9YyhkLGUpLHZvaWQgMCE9PWYmJihmPWYuY2FsbChkLGIpLGYhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpKXJldHVybiBmfWZ1bmN0aW9uIGYoYSl7bi5mb3JFYWNoKChbYixjXSk9PnthW2NdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRwJHJpY2hjb21wYXJlKGEsYil9fSl9ZnVuY3Rpb24gbChhKXtjb25zdCBiPVNrLnJlZmxlY3RlZE51bWJlclNsb3RzO09iamVjdC5rZXlzKGIpLmZvckVhY2goYz0+e2lmKHZvaWQgMCE9PWFbY10pe2NvbnN0IGQ9YltjXSxlPWQucmVmbGVjdGVkLGY9YVtlXTt2b2lkIDAhPT1mP251bGw9PT1mJiZkZWxldGUgYVtlXTphW2VdPWQuc2xvdHx8YVtjXX19KX1mdW5jdGlvbiBoKGEpe2NvbnN0IGI9U2suc2VxdWVuY2VBbmRNYXBwaW5nU2xvdHM7T2JqZWN0LmtleXMoYikuZm9yRWFjaChjPT5cbnt2b2lkIDAhPT1hW2NdJiZiW2NdLmZvckVhY2goYj0+e2FbYl09YVtjXX0pfSl9U2suYWJzdHI9e307U2suYWJzdHIudHlwZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJnZvaWQgMCE9PWEudHAkbmFtZT9hLnRwJG5hbWU6XCI8aW52YWxpZCB0eXBlPlwifTtjb25zdCBkPXtBZGQ6XCIrXCIsU3ViOlwiLVwiLE11bHQ6XCIqXCIsTWF0TXVsdDpcIkBcIixEaXY6XCIvXCIsRmxvb3JEaXY6XCIvL1wiLE1vZDpcIiVcIixEaXZNb2Q6XCJkaXZtb2QoKVwiLFBvdzpcIioqIG9yIHBvdygpXCIsTFNoaWZ0OlwiPDxcIixSU2hpZnQ6XCI+PlwiLEJpdEFuZDpcIiZcIixCaXRYb3I6XCJeXCIsQml0T3I6XCJ8XCJ9LGc9e1VBZGQ6XCIrXCIsVVN1YjpcIi1cIixJbnZlcnQ6XCJ+XCJ9O1NrLmFic3RyLm51bWJlckJpbk9wPWZ1bmN0aW9uKGEsYixjKXt2YXIgZjtpZighKGY9ZShhLGIsYykpKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYj1Tay5hYnN0ci50eXBlTmFtZShiKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK1xuZFtjXStcIjogJ1wiK2ErXCInIGFuZCAnXCIrYitcIidcIik7cmV0dXJuIGZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlckJpbk9wXCIsU2suYWJzdHIubnVtYmVyQmluT3ApO1NrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcD1mdW5jdGlvbihhLGMsZil7YTp7dmFyIGs9YihhLGYpO2lmKHZvaWQgMCE9PWsmJihrPWsuY2FsbChhLGMpLGshPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCkpYnJlYWsgYTtrPWUoYSxjLGYpfWlmKCFrKXRocm93IGE9U2suYWJzdHIudHlwZU5hbWUoYSksYz1Tay5hYnN0ci50eXBlTmFtZShjKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIFwiK2RbZl0rXCI9OiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTtyZXR1cm4ga307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wXCIsU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKTtTay5hYnN0ci5udW1iZXJVbmFyeU9wPVxuZnVuY3Rpb24oYSxiKXtpZihcIk5vdFwiPT09YilyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkO2I6e3N3aXRjaChiKXtjYXNlIFwiVVN1YlwiOnZhciBjPWEubmIkbmVnYXRpdmU7YnJlYWsgYjtjYXNlIFwiVUFkZFwiOmM9YS5uYiRwb3NpdGl2ZTticmVhayBiO2Nhc2UgXCJJbnZlcnRcIjpjPWEubmIkaW52ZXJ0O2JyZWFrIGJ9Yz12b2lkIDB9Yz12b2lkIDAhPT1jP2MuY2FsbChhKTp2b2lkIDA7aWYoIWMpdGhyb3cgYT1Tay5hYnN0ci50eXBlTmFtZShhKSxuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSBcIitnW2JdK1wiOiAnXCIrYStcIidcIik7cmV0dXJuIGN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm51bWJlclVuYXJ5T3BcIixTay5hYnN0ci5udW1iZXJVbmFyeU9wKTtTay5hYnN0ci5maXhTZXFJbmRleF89ZnVuY3Rpb24oYSxiKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO1xuMD5iJiZhLnNxJGxlbmd0aCYmKGIrPWEuc3EkbGVuZ3RoKCkpO3JldHVybiBifTtTay5hYnN0ci5zZXF1ZW5jZUNvbnRhaW5zPWZ1bmN0aW9uKGEsYixjKXtpZihhLnNxJGNvbnRhaW5zKXJldHVybiBhLnNxJGNvbnRhaW5zKGIsYyk7YT1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxiLFwiRXFcIik/bmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTohMX0sITEpO3JldHVybiBjP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpfTtTay5hYnN0ci5zZXF1ZW5jZUNvbmNhdD1mdW5jdGlvbihhLGIpe2lmKGEuc3EkY29uY2F0KXJldHVybiBhLnNxJGNvbmNhdChiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWRcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldEluZGV4T2Y9XG5mdW5jdGlvbihhLGIpe2lmKGEuaW5kZXgpcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLmluZGV4LFthLGJdKTtsZXQgYz0wO2ZvcihsZXQgZD1Tay5hYnN0ci5pdGVyKGEpLGU9ZC50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWU7ZT1kLnRwJGl0ZXJuZXh0KCkpe2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLGUsXCJFcVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhjKTtjKz0xfXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2VcIik7fTtTay5hYnN0ci5zZXF1ZW5jZUdldENvdW50T2Y9ZnVuY3Rpb24oYSxiKXtpZihhLmNvdW50KXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYS5jb3VudCxbYSxiXSk7bGV0IGM9MDtmb3IobGV0IGQ9U2suYWJzdHIuaXRlcihhKSxlPWQudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1lO2U9ZC50cCRpdGVybmV4dCgpKVNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChiLFxuZSxcIkVxXCIpJiYoYys9MSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYyl9O1NrLmFic3RyLnNlcXVlbmNlR2V0SXRlbT1mdW5jdGlvbihhLGIsYyl7XCJudW1iZXJcIj09PXR5cGVvZiBiJiYoYj1uZXcgU2suYnVpbHRpbi5pbnRfKGIpKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLGIsYyl9O1NrLmFic3RyLnNlcXVlbmNlU2V0SXRlbT1mdW5jdGlvbihhLGIsYyxkKXtcIm51bWJlclwiPT09dHlwZW9mIGImJihiPW5ldyBTay5idWlsdGluLmludF8oYikpO3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsYixjLGQpfTtTay5hYnN0ci5zZXF1ZW5jZURlbEl0ZW09ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBTay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYixjKX07U2suYWJzdHIuc2VxdWVuY2VHZXRTbGljZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5zbGljZShiLGMpKX07U2suYWJzdHIuc2VxdWVuY2VEZWxTbGljZT1cbmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0RGVsSXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGIsYykpfTtTay5hYnN0ci5zZXF1ZW5jZVNldFNsaWNlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBTay5hYnN0ci5vYmplY3RTZXRJdGVtKGEsbmV3IFNrLmJ1aWx0aW4uc2xpY2UoYixjKSl9O1NrLmFic3RyLnNlcXVlbmNlVW5wYWNrPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IHVucGFjayBub24taXRlcmFibGUgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO2NvbnN0IGU9U2suYWJzdHIuaXRlcihhKSxmPVtdO2xldCBrPTAsZzswPGImJihnPVNrLm1pc2NldmFsLml0ZXJGb3IoZSxhPT57Zi5wdXNoKGEpO2lmKCsraz09PWIpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVha30pKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZyxcbigpPT57aWYoZi5sZW5ndGg8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm90IGVub3VnaCB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCBhdCBsZWFzdCBcIitjK1wiLCBnb3QgXCIrZi5sZW5ndGgrXCIpXCIpO2lmKCFkKXJldHVybiBTay5taXNjZXZhbC5jaGFpbihlLnRwJGl0ZXJuZXh0KCEwKSxhPT57aWYodm9pZCAwIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwidG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgXCIrYitcIilcIik7cmV0dXJuIGZ9KTtjb25zdCBhPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKGUsYj0+e2EucHVzaChiKX0pLCgpPT57Y29uc3QgZD1hLmxlbmd0aCtiLWM7aWYoMD5kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJub3QgZW5vdWdoIHZhbHVlcyB0byB1bnBhY2sgKGV4cGVjdGVkIGF0IGxlYXN0IFwiK2MrXCIsIGdvdCBcIisoYytkKStcIilcIik7Zi5wdXNoKG5ldyBTay5idWlsdGluLmxpc3QoYS5zbGljZSgwLFxuZCkpKTtmLnB1c2goLi4uYS5zbGljZShkKSk7cmV0dXJuIGZ9KX0pfTtTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheT1mdW5jdGlvbihhLGIsYyl7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCliLiRpdGVtcygpLmZvckVhY2goKFtiLGRdKT0+e2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcigoYy4kcXVhbG5hbWU/Yy4kcXVhbG5hbWUrXCIoKSBcIjpcIlwiKStcImtleXdvcmRzIG11c3QgYmUgc3RyaW5nc1wiKTthLnB1c2goYi52KTthLnB1c2goZCl9KTtlbHNle3ZhciBkPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4ka2V5cyk7aWYodm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJPYmplY3QgaXMgbm90IGEgbWFwcGluZ1wiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQpLGQ9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihkKSxcbmQ9PntpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhkKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoKGMuJHF1YWxuYW1lP2MuJHF1YWxuYW1lK1wiKCkgXCI6XCJcIikrXCJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGIubXAkc3Vic2NyaXB0KGQsITApLGI9PnthLnB1c2goZC52KTthLnB1c2goYil9KX0pKX19O1NrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzPWZ1bmN0aW9uKGEsYixjLGQsZSl7ZD1kfHxbXTt2YXIgZj1jLmxlbmd0aCtkLmxlbmd0aC8yO2lmKGY+Yi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBleHBlY3RlZCBhdCBtb3N0IFwiK2IubGVuZ3RoK1wiIGFyZ3VtZW50cyAoXCIrZitcIiBnaXZlbilcIik7aWYoZC5sZW5ndGh8fHZvaWQgMCE9PWUpe2lmKGY9PT1iLmxlbmd0aCYmIWQubGVuZ3RoKXJldHVybiBjO2lmKDA9PT1mJiZiLmxlbmd0aD09PShlJiZlLmxlbmd0aCkpcmV0dXJuIGV9ZWxzZSByZXR1cm4gYztcbmM9Yy5zbGljZSgwKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9Mil7Y29uc3QgZT1kW2ZdLGs9ZFtmKzFdLGc9Yi5pbmRleE9mKGUpO2lmKDA8PWcpe2lmKHZvaWQgMCE9PWNbZ10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBhcmd1bWVudCAnXCIrZStcIidcIik7Y1tnXT1rfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdcIitlK1wiJ1wiKTt9aWYoZSl7ZD1iLmxlbmd0aDtmb3IoZj1kLTE7MDw9ZjtmLS0pdm9pZCAwPT09Y1tmXSYmKGNbZl09ZVtlLmxlbmd0aC0xLShkLTEtZildKTtiPWIuZmlsdGVyKChhLGIpPT52b2lkIDA9PT1jW2JdKTtpZihiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIG1pc3NpbmcgXCIrYi5sZW5ndGgrXCIgcmVxdWlyZWQgcG9zaXRpb25hbCBhcmd1bWVudHM6IFwiK2Iuam9pbihcIiwgXCIpKTtcbn1yZXR1cm4gY307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3NcIixTay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyk7U2suYWJzdHIuY2hlY2tOb0t3YXJncz1mdW5jdGlvbihhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja05vS3dhcmdzXCIsU2suYWJzdHIuY2hlY2tOb0t3YXJncyk7U2suYWJzdHIuY2hlY2tOb0FyZ3M9ZnVuY3Rpb24oYSxiLGMpe2lmKGI9Yi5sZW5ndGgrKGM/Yy5sZW5ndGg6MCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSB0YWtlcyBubyBhcmd1bWVudHMgKFwiK2IrXCIgZ2l2ZW4pXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuY2hlY2tOb0FyZ3NcIixTay5hYnN0ci5jaGVja05vQXJncyk7U2suYWJzdHIuY2hlY2tPbmVBcmc9XG5mdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhhLGMpO2lmKDEhPT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50IChcIitiLmxlbmd0aCtcIiBnaXZlbilcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5jaGVja09uZUFyZ1wiLFNrLmFic3RyLmNoZWNrT25lQXJnKTtTay5hYnN0ci5jaGVja0FyZ3NMZW49ZnVuY3Rpb24oYSxiLGMsZCl7Yj1iLmxlbmd0aDt2b2lkIDA9PT1kJiYoZD1JbmZpbml0eSk7aWYoYjxjfHxiPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKChjPT09ZD9hK1wiKCkgdGFrZXMgZXhhY3RseSBcIitjK1wiIGFyZ3VtZW50c1wiOmI8Yz9hK1wiKCkgdGFrZXMgYXQgbGVhc3QgXCIrYytcIiBhcmd1bWVudHNcIjphK1wiKCkgdGFrZXMgYXQgbW9zdCBcIitkK1wiIGFyZ3VtZW50c1wiKSsoXCIgKFwiK2IrXCIgZ2l2ZW4pXCIpKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmNoZWNrQXJnc0xlblwiLFxuU2suYWJzdHIuY2hlY2tBcmdzTGVuKTtTay5hYnN0ci5vYmplY3RGb3JtYXQ9ZnVuY3Rpb24oYSxiKXthPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZm9ybWF0KTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyBtdXN0IHJldHVybiBhIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGIpKTtyZXR1cm4gYn07U2suYWJzdHIub2JqZWN0SGFzaD1mdW5jdGlvbihhKXtjb25zdCBiPWEudHAkaGFzaDtpZih2b2lkIDAhPT1iKXtpZihTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bmhhc2hhYmxlIHR5cGU6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7cmV0dXJuIGEudHAkaGFzaCgpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInVuc3VwcG9ydGVkIEphdmFzY3JpcHQgdHlwZVwiKTtcbn07U2suYWJzdHIub2JqZWN0QWRkPWZ1bmN0aW9uKGEsYil7aWYoYS5uYiRhZGQpcmV0dXJuIGEubmIkYWRkKGIpO2E9U2suYWJzdHIudHlwZU5hbWUoYSk7Yj1Tay5hYnN0ci50eXBlTmFtZShiKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdcIithK1wiJyBhbmQgJ1wiK2IrXCInXCIpO307U2suYWJzdHIub2JqZWN0TmVnYXRpdmU9ZnVuY3Rpb24oYSl7aWYoYS5uYiRuZWdhdGl2ZSlyZXR1cm4gYS5uYiRuZWdhdGl2ZSgpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IC06ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5hYnN0ci5vYmplY3RQb3NpdGl2ZT1mdW5jdGlvbihhKXtpZihhLm5iJHBvc2l0aXZlKXJldHVybiBhLm5iJHBvc2l0aXZlKCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO307U2suYWJzdHIub2JqZWN0RGVsSXRlbT1mdW5jdGlvbihhLGIsYyl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYix2b2lkIDAsYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIub2JqZWN0RGVsSXRlbVwiLFNrLmFic3RyLm9iamVjdERlbEl0ZW0pO1NrLmFic3RyLm9iamVjdEdldEl0ZW09ZnVuY3Rpb24oYSxiLGMpe2lmKGEubXAkc3Vic2NyaXB0KXJldHVybiBhLm1wJHN1YnNjcmlwdChiLGMpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLm9iamVjdEdldEl0ZW1cIixcblNrLmFic3RyLm9iamVjdEdldEl0ZW0pO1NrLmFic3RyLm9iamVjdFNldEl0ZW09ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYS5tcCRhc3Nfc3Vic2NyaXB0KXJldHVybiBhLm1wJGFzc19zdWJzY3JpcHQoYixjLGQpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5vYmplY3RTZXRJdGVtXCIsU2suYWJzdHIub2JqZWN0U2V0SXRlbSk7U2suYWJzdHIuZ2F0dHI9ZnVuY3Rpb24oYSxiLGMpe2M9YS50cCRnZXRhdHRyKGIsYyk7aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihhLnNrJGF0dHJFcnJvcigpK1wiIGhhcyBubyBhdHRyaWJ1dGUgJ1wiK2IuJGpzc3RyKCkrXCInXCIpO3JldHVybiBjLiRpc1N1c3BlbnNpb24/U2subWlzY2V2YWwuY2hhaW4oYyxmdW5jdGlvbihjKXtpZih2b2lkIDA9PT1cbmMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoYS5zayRhdHRyRXJyb3IoKStcIiBoYXMgbm8gYXR0cmlidXRlICdcIitiLiRqc3N0cigpK1wiJ1wiKTtyZXR1cm4gY30pOmN9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmdhdHRyXCIsU2suYWJzdHIuZ2F0dHIpO1NrLmFic3RyLnNhdHRyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBhLnRwJHNldGF0dHIoYixjLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5zYXR0clwiLFNrLmFic3RyLnNhdHRyKTtTay5hYnN0ci5pdGVybmV4dD1mdW5jdGlvbihhLGIpe3JldHVybiBhLnRwJGl0ZXJuZXh0KGIpfTtTay5leHBvcnRTeW1ib2woXCJTay5hYnN0ci5pdGVybmV4dFwiLFNrLmFic3RyLml0ZXJuZXh0KTtTay5hYnN0ci5pdGVyPWZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcil7YT1hLnRwJGl0ZXIoKTtpZihhLnRwJGl0ZXJuZXh0KXJldHVybiBhO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3Igb2YgdHlwZSAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fWlmKGEubXAkc3Vic2NyaXB0KXJldHVybiBuZXcgU2suYnVpbHRpbi5zZXFfaXRlcl8oYSk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2suYWJzdHIuaXRlclwiLFNrLmFic3RyLml0ZXIpO1NrLmFic3RyLmxvb2t1cFNwZWNpYWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm9iJHR5cGU7aWYodm9pZCAwPT09YylTay5hc3NlcnRzLmZhaWwoXCJqYXZhc2NyaXB0IG9iamVjdCBzZW50IHRvIGxvb2t1cFNwZWNpYWxcIik7ZWxzZSBpZihiPWMuJHR5cGVMb29rdXAoYiksdm9pZCAwIT09YilyZXR1cm4gdm9pZCAwIT09Yi50cCRkZXNjcl9nZXQmJihiPWIudHAkZGVzY3JfZ2V0KGEsYykpLGJ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFic3RyLmxvb2t1cFNwZWNpYWxcIixTay5hYnN0ci5sb29rdXBTcGVjaWFsKTtcblNrLmFic3RyLnR5cGVMb29rdXA9ZnVuY3Rpb24oYSxiKXtiPWEuJHR5cGVMb29rdXAoYik7cmV0dXJuIHZvaWQgMCE9PWImJmIudHAkZGVzY3JfZ2V0P2IudHAkZGVzY3JfZ2V0KG51bGwsYSk6Yn07U2suYWJzdHIubWFya1VuaGFzaGFibGU9ZnVuY3Rpb24oYSl7YT1hLnByb3RvdHlwZTthLl9faGFzaF9fPVNrLmJ1aWx0aW4ubm9uZS5ub25lJDthLnRwJGhhc2g9U2suYnVpbHRpbi5ub25lLm5vbmUkfTtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlPWZ1bmN0aW9uKGEsYixjLGQpe2Q9ZHx8U2suYnVpbHRpbi50eXBlO2M9dm9pZCAwPT09Yz9Tay5idWlsdGluLm9iamVjdDpjO2NvbnN0IGU9bnVsbCE9PWM/Yy5wcm90b3R5cGU6bnVsbDtPYmplY3Quc2V0UHJvdG90eXBlT2YoYixkLnByb3RvdHlwZSk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGIucHJvdG90eXBlLGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGIucHJvdG90eXBlLHtzayRvYmplY3Q6e3ZhbHVlOmIsd3JpdGFibGU6ITB9LFxub2IkdHlwZTp7dmFsdWU6Yix3cml0YWJsZTohMH0sdHAkbmFtZTp7dmFsdWU6YSx3cml0YWJsZTohMH0sdHAkYmFzZTp7dmFsdWU6Yyx3cml0YWJsZTohMH19KX07U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvPWZ1bmN0aW9uKGEpe2xldCBiPWEucHJvdG90eXBlLnRwJGJhc2U7Y29uc3QgYz1udWxsPT09Yj9bXTpbYl07aWYoYj09PVNrLmJ1aWx0aW4ub2JqZWN0fHxudWxsPT09YilPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcInNrJGJhc2VDbGFzc1wiLHt2YWx1ZTohMCx3cml0YWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSxcInNrJGJ1aWx0aW5CYXNlXCIse3ZhbHVlOmEsd3JpdGFibGU6ITB9KTtjb25zdCBkPVthXTtmb3IoO251bGwhPT1iOylkLnB1c2goYiksYj1iLnByb3RvdHlwZS50cCRiYXNlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEucHJvdG90eXBlLHtzayRwcm90b3R5cGljYWw6e3ZhbHVlOiEwLHdyaXRhYmxlOiEwfSx0cCRiYXNlczp7dmFsdWU6YyxcbndyaXRhYmxlOiEwfSx0cCRtcm86e3ZhbHVlOmQsd3JpdGFibGU6ITB9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCIkdHlwZUxvb2t1cFwiLHt2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wcm90b3R5cGVbYS4kbWFuZ2xlZF19LHdyaXRhYmxlOiEwfSl9O1NrLmFic3RyLnNldFVwR2V0U2V0cz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4uZ2V0c2V0X2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRnZXRzZXRzfHx7fTtPYmplY3QuZW50cmllcyhiKS5mb3JFYWNoKChbYixkXSk9PntkLiRuYW1lPWI7Y1tiXT1uZXcgU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcihhLGQpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsXCJ0cCRnZXRzZXRzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLnNldFVwTWV0aG9kcz1mdW5jdGlvbihhLGIpe2lmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPVxuYS5wcm90b3R5cGU7Yj1ifHxjLnRwJG1ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKGEsZCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRwJG1ldGhvZHNcIix7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pfX07U2suYWJzdHIuc2V0VXBDbGFzc01ldGhvZHM9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDAhPT1Tay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3Ipe3ZhciBjPWEucHJvdG90eXBlO2I9Ynx8Yy50cCRjbGFzc21ldGhvZHN8fHt9O09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtiLGRdKT0+e2QuJG5hbWU9YjtjW2JdPW5ldyBTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IoYSxkKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwidHAkY2xhc3NtZXRob2RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O2NvbnN0IG49T2JqZWN0LmVudHJpZXMoe0VxOlwib2IkZXFcIixcbk5vdEVxOlwib2IkbmVcIixHdDpcIm9iJGd0XCIsR3RFOlwib2IkZ2VcIixMdDpcIm9iJGx0XCIsTHRFOlwib2IkbGVcIn0pO1NrLmFic3RyLnNldFVwU2xvdHM9ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIsYyl7ZVtiXT1uZXcgU2suYnVpbHRpbi53cmFwcGVyX2Rlc2NyaXB0b3IoYSxTay5zbG90c1tiXSxjKX1mdW5jdGlvbiBkKGEsYil7XCJzdHJpbmdcIj09PXR5cGVvZiBhP2MoYSxiKTphLmZvckVhY2goYT0+e2MoYSxiKX0pfWlmKHZvaWQgMCE9PVNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXt2YXIgZT1hLnByb3RvdHlwZTtiPWJ8fGUudHAkc2xvdHN8fHt9O2IudHAkbmV3PT09U2suZ2VuZXJpYy5uZXcmJihiLnRwJG5ldz1Tay5nZW5lcmljLm5ldyhhKSk7Yi50cCRyaWNoY29tcGFyZSYmZihiKTtiLnRwJGFzX251bWJlciYmbChiKTtiLnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmcmJmgoYik7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2EsYl0pPT57T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXG5hLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTtiLnRwJG5ldyYmKGUuX19uZXdfXz1uZXcgU2suYnVpbHRpbi5za19tZXRob2QoU2suZ2VuZXJpYy5uZXdNZXRob2REZWYsYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJzayRzdGF0aWNOZXdcIix7dmFsdWU6YSx3cml0YWJsZTohMH0pKTtTay5zdWJTbG90cy5tYWluX3Nsb3RzLmZvckVhY2goKFthLGNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTt2YXIgZz1iLnRwJGhhc2g7dm9pZCAwIT09ZyYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnP2MoXCJfX2hhc2hfX1wiLGcpOmc9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/ZS5fX2hhc2hfXz1nOlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgdHAkaGFzaFwiKSk7Yi50cCRhc19udW1iZXImJlNrLnN1YlNsb3RzLm51bWJlcl9zbG90cy5mb3JFYWNoKChbYSxjXSk9PnthPWJbYV07dm9pZCAwIT09YSYmZChjLGEpfSk7Yi50cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nJiZTay5zdWJTbG90cy5zZXF1ZW5jZV9hbmRfbWFwcGluZ19zbG90cy5mb3JFYWNoKChbYSxcbmNdKT0+e2E9YlthXTt2b2lkIDAhPT1hJiZkKGMsYSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRwJHNsb3RzXCIse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KX19O1NrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3M9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O1NrLmFzc2VydHMuYXNzZXJ0KGIuaGFzT3duUHJvcGVydHkoXCJjb25zdHJ1Y3RvclwiKSxcIkEgY29uc3RydWN0b3IgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSBuYXRpdmUgY2xhc3NcIik7bGV0IGM9Yi5jb25zdHJ1Y3RvcjtpZihhLmluY2x1ZGVzKFwiLlwiKSl7dmFyIGQ9YS5zcGxpdChcIi5cIik7YT1kLnBvcCgpO2Q9ZC5qb2luKFwiLlwiKX1Tay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKGEsYyxiLmJhc2UsYi5tZXRhKTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oYyk7Y29uc3QgZT1jLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHt0cCRzbG90czp7dmFsdWU6Yi5zbG90cyx3cml0YWJsZTohMH0sdHAkZ2V0c2V0czp7dmFsdWU6Yi5nZXRzZXRzLFxud3JpdGFibGU6ITB9LHRwJG1ldGhvZHM6e3ZhbHVlOmIubWV0aG9kcyx3cml0YWJsZTohMH0sdHAkY2xhc3NtZXRob2RzOnt2YWx1ZTpiLmNsYXNzbWV0aG9kcyx3cml0YWJsZTohMH19KTtTay5hYnN0ci5zZXRVcFNsb3RzKGMsYi5zbG90c3x8e30pO1NrLmFic3RyLnNldFVwTWV0aG9kcyhjLGIubWV0aG9kcyk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGMsYi5nZXRzZXRzKTtTay5hYnN0ci5zZXRVcENsYXNzTWV0aG9kcyhjLGIuY2xhc3NtZXRob2RzKTt2b2lkIDAhPT1kJiYoZS5fX21vZHVsZV9fPW5ldyBTay5idWlsdGluLnN0cihkKSk7T2JqZWN0LmVudHJpZXMoYi5wcm90b3x8e30pLmZvckVhY2goKFthLGJdKT0+e09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEse3ZhbHVlOmIsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohKGEuaW5jbHVkZXMoXCIkXCIpfHxhIGluIE9iamVjdC5wcm90b3R5cGUpfSl9KTtPYmplY3QuZW50cmllcyhiLmZsYWdzfHx7fSkuZm9yRWFjaCgoW2EsYl0pPT5cbntPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxhLHt2YWx1ZTpiLHdyaXRhYmxlOiEwfSl9KTt2b2lkIDAhPT1Tay5idWlsdGluLnN0ciYmZS5oYXNPd25Qcm9wZXJ0eShcInRwJGRvY1wiKSYmIWUuaGFzT3duUHJvcGVydHkoXCJfX2RvY19fXCIpJiYoYT1lLnRwJGRvY3x8bnVsbCxlLl9fZG9jX189XCJzdHJpbmdcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhKTpTay5idWlsdGluLm5vbmUubm9uZSQpO3JldHVybiBjfTtTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3M9ZnVuY3Rpb24oYSxiKXtTay5hc3NlcnRzLmFzc2VydChiLmhhc093blByb3BlcnR5KFwiY29uc3RydWN0b3JcIiksXCJtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvclwiKTtiLnNsb3RzPWIuc2xvdHN8fHt9O2Iuc2xvdHMudHAkaXRlcj1Tay5nZW5lcmljLnNlbGZJdGVyO2Iuc2xvdHMudHAkaXRlcm5leHQ9Yi5zbG90cy50cCRpdGVybmV4dHx8Yi5pdGVybmV4dDtiLnNsb3RzLnRwJGdldGF0dHI9Yi5zbG90cy50cCRnZXRhdHRyfHxcblNrLmdlbmVyaWMuZ2V0QXR0cjthPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoYSxiKTtTay5hYnN0ci5idWlsdCRpdGVyYXRvcnMucHVzaChhKTtyZXR1cm4gYX07U2suYWJzdHIuYnVpbHQkaXRlcmF0b3JzPVtdO1NrLmFic3RyLnNldFVwTW9kdWxlTWV0aG9kcz1mdW5jdGlvbihhLGIsYyl7T2JqZWN0LmVudHJpZXMoYykuZm9yRWFjaCgoW2MsZF0pPT57ZC4kbmFtZT1kLiRuYW1lfHxjO2JbY109bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKGQsbnVsbCxhKX0pfTtTay5hYnN0ci5zdXBlckNvbnN0cnVjdG9yPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMik7YS5wcm90b3R5cGUudHAkYmFzZS5hcHBseShiLGQpfX0sZnVuY3Rpb24obSxxKXtjb25zdCBhPW5ldyBNYXA7U2suYnVpbHRpbi5vYmplY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIm9iamVjdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5vYmplY3QsXCJiYWQgY2FsbCB0byBvYmplY3QsIHVzZSAnbmV3J1wiKX0sYmFzZTpudWxsLHNsb3RzOnt0cCRuZXcoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkbmV3IT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJG5ldyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvYmplY3QuX19uZXdfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgdHlwZSB0byBpbnN0YW50aWF0ZSlcIik7aWYodGhpcy50cCRpbml0PT09U2suYnVpbHRpbi5vYmplY3QucHJvdG90eXBlLnRwJGluaXQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKCkgdGFrZXMgbm8gYXJndW1lbnRzXCIpO31yZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3J9LHRwJGluaXQoYSxiKXtpZihhLmxlbmd0aHx8YiYmYi5sZW5ndGgpe2lmKHRoaXMudHAkaW5pdCE9PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRpbml0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdC5fX2luaXRfXygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZSlcIik7XG5pZih0aGlzLnRwJG5ldz09PVNrLmJ1aWx0aW4ub2JqZWN0LnByb3RvdHlwZS50cCRuZXcpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiLl9faW5pdF9fKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplKVwiKTt9fSx0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRzZXRhdHRyOlNrLmdlbmVyaWMuc2V0QXR0ciwkcigpe2NvbnN0IGE9U2suYWJzdHIubG9va3VwU3BlY2lhbCh0aGlzLFNrLmJ1aWx0aW4uc3RyLiRtb2R1bGUpO2xldCBiPVwiXCI7YSYmU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSYmKGI9YS52K1wiLlwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPFwiK2IrU2suYWJzdHIudHlwZU5hbWUodGhpcykrXCIgb2JqZWN0PlwiKX0sdHAkc3RyKCl7cmV0dXJuIHRoaXMuJHIoKX0sdHAkaGFzaCgpe2xldCBjPWEuZ2V0KHRoaXMpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7XG5jPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUi1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUi8yKTthLnNldCh0aGlzLGMpO3JldHVybiBjfSx0cCRyaWNoY29tcGFyZShhLGIpe3N3aXRjaChiKXtjYXNlIFwiRXFcIjphPXRoaXM9PT1hfHxTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDticmVhaztjYXNlIFwiTm90RXFcIjphPXRoaXMudHAkcmljaGNvbXBhcmUoYSxcIkVxXCIpO2EhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCYmKGE9IVNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7YnJlYWs7ZGVmYXVsdDphPVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfXJldHVybiBhfSx0cCRkb2M6XCJUaGUgbW9zdCBiYXNlIHR5cGVcIn0sZ2V0c2V0czp7X19jbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2IkdHlwZX0sJHNldChhKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IGRlbGV0ZSBfX2NsYXNzX18gYXR0cmlidXRlXCIpO1xuaWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gYSBjbGFzcywgbm90ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO2NvbnN0IGI9dGhpcy5vYiR0eXBlO2lmKCEoYi4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKSYmYS4kaXNTdWJUeXBlKFNrLmJ1aWx0aW4ubW9kdWxlKXx8dm9pZCAwIT09Yi5zayRrbGFzcyYmdm9pZCAwIT09YS5zayRrbGFzcykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiIF9fY2xhc3NfXyBhc3NpZ25tZW50IG9ubHkgc3VwcG9ydGVkIGZvciBoZWFwIHR5cGVzIG9yIE1vZHVsZVR5cGUgc3ViY2xhc3Nlc1wiKTtpZihhLnByb3RvdHlwZS5zayRidWlsdGluQmFzZSE9PXRoaXMuc2skYnVpbHRpbkJhc2UpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jbGFzc19fIGFzc2lnbm1lbnQ6ICdcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcblwiJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnXCIrYS5wcm90b3R5cGUudHAkbmFtZStcIidcIik7T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsYS5wcm90b3R5cGUpfSwkZG9jOlwidGhlIG9iamVjdCdzIGNsYXNzXCJ9fSxtZXRob2RzOntfX2Rpcl9fOnskbWV0aDpmdW5jdGlvbigpe2xldCBhPVtdO2lmKHRoaXMuJGQpaWYodGhpcy4kZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdClhPXRoaXMuJGQuc2skYXNhcnJheSgpO2Vsc2UgZm9yKHZhciBiIGluIHRoaXMuJGQpYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cihiKSk7Yj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoU2suYnVpbHRpbi50eXBlLnByb3RvdHlwZS5fX2Rpcl9fLFt0aGlzLm9iJHR5cGVdKTthLnB1c2goLi4uYi52KTtiLnY9YTtyZXR1cm4gYn0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJEZWZhdWx0IGRpcigpIGltcGxlbWVudGF0aW9uLlwifSxfX2Zvcm1hdF9fOnskbWV0aChhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZihhPVxuU2suZmZpLnJlbWFwVG9KcyhhKSxcIlwiIT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiZm9ybWF0IHNwZWMgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9ZWxzZXtpZihTay5fX2Z1dHVyZV9fLmV4Y2VwdGlvbnMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZm9ybWF0KCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQgZXhwZWN0cyBhcmcgMiB0byBiZSBzdHJpbmcgb3IgdW5pY29kZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9cmV0dXJuIHRoaXMudHAkc3RyKCl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiRGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyLlwifX0scHJvdG86e3ZhbHVlT2Y6T2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHAkc3RyKCkudn0saGFzT3duUHJvcGVydHk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbmhwJHR5cGU6dm9pZCAwLHNrJGF0dHJFcnJvcigpe3JldHVyblwiJ1wiK3RoaXMudHAkbmFtZStcIicgb2JqZWN0XCJ9fX0pO1NrLmFic3RyLnNldFVwSW5oZXJpdGFuY2UoXCJ0eXBlXCIsU2suYnVpbHRpbi50eXBlLFNrLmJ1aWx0aW4ub2JqZWN0KTtTay5hYnN0ci5zZXRVcEJ1aWx0aW5Ncm8oU2suYnVpbHRpbi50eXBlKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGIsYyk7YT10aGlzLmNhbGwoYSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYyhhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO2E9dGhpcy5jYWxsKGEsYlswXSk7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gYihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLFxuYiwxLDIpO2E9dGhpcy5jYWxsKGEsLi4uYik7cmV0dXJuIHZvaWQgMD09PWE/U2suYnVpbHRpbi5ub25lLm5vbmUkOmF9ZnVuY3Rpb24gZShhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTt0aGlzLmNhbGwoYSxiWzBdLGJbMV0pO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9ZnVuY3Rpb24gZihhLGIsZCl7YT1jLmNhbGwodGhpcyxhLGIsZCk7cmV0dXJuIGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9hOm5ldyBTay5idWlsdGluLmJvb2woYSl9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7Yz1hLmNhbGwodGhpcyxjLGQsZSk7cmV0dXJuIGIoYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgYj1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYixcbltdKX19ZnVuY3Rpb24gZChhLGIsYyxkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGY9ZS50cCRkZXNjcl9nZXQ/ZS50cCRkZXNjcl9nZXQodGhpcyk6ZTtmPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShmLFtdKTtpZighYihmKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIiBzaG91bGQgcmV0dXJuIFwiK2MrXCIgKHJldHVybmVkIFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiKVwiKTtyZXR1cm4gdm9pZCAwIT09ZD9kKGYpOmZ9fX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtiXSl9fWZ1bmN0aW9uIG4oYSxiKXtsZXQgYz10aGlzLm9iJHR5cGUuJHR5cGVMb29rdXAoU2suYnVpbHRpbi5zdHIuJGdldGF0dHJpYnV0ZSk7aWYoYyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBjLmQkd3JhcHBlZC5jYWxsKHRoaXMsXG5hLGIpO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7Y29uc3QgZD1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gYj9kOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhkKX1mdW5jdGlvbiBrKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGZ1bmN0aW9uKGQsZSxmKXtsZXQgZzt2b2lkIDA9PT1lPyhnPWIsYz1udWxsKTpnPWE7bGV0IGg9dGhpcy5vYiR0eXBlLiR0eXBlTG9va3VwKG5ldyBTay5idWlsdGluLnN0cihnKSk7aWYoaCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKXJldHVybiBoLmQkd3JhcHBlZC5jYWxsKHRoaXMsZCxlKTtoLnRwJGRlc2NyX2dldCYmKGg9aC50cCRkZXNjcl9nZXQodGhpcykpO1xuaWYodm9pZCAwIT09aClkPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShoLHZvaWQgMD09PWU/W2RdOltkLGVdKTtlbHNle2lmKGMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBvYmplY3QgXCIrYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoZyk7fXJldHVybiBmP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX19ZnVuY3Rpb24gcChhLGIpe2xldCBjPWEub2IkdHlwZTtmb3IoO2MmJnZvaWQgMCE9PWMuc2ska2xhc3M7KWM9Yy5wcm90b3R5cGUudHAkYmFzZTtpZihjJiZjLnByb3RvdHlwZS50cCRzZXRhdHRyIT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBhcHBseSB0aGlzIFwiK2IuJG5hbWUrXCIgdG8gXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgb2JqZWN0XCIpO31Tay5zbG90cz1PYmplY3QuY3JlYXRlKG51bGwpO1xubT1Tay5zbG90cztTay5zbG90cy5fX2luaXRfXz17JG5hbWU6XCJfX2luaXRfX1wiLCRzbG90X25hbWU6XCJ0cCRpbml0XCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7Yj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxiLGMpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGE9PntpZighU2suYnVpbHRpbi5jaGVja05vbmUoYSkmJnZvaWQgMCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSl9fSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7dGhpcy5jYWxsKGEsYixjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJJbml0aWFsaXplIHNlbGYuICBTZWUgaGVscCh0eXBlKHNlbGYpKSBmb3IgYWNjdXJhdGUgc2lnbmF0dXJlLlwifTtcbm0uX19uZXdfXz17JG5hbWU6XCJfX25ld19fXCIsJHNsb3RfbmFtZTpcInRwJG5ld1wiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7Y29uc3QgYj1mdW5jdGlvbihiLGMpe2xldCBkPWE7YS50cCRkZXNjcl9nZXQmJihkPWEudHAkZGVzY3JfZ2V0KG51bGwsdGhpcy5jb25zdHJ1Y3RvcikpO3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoZCxbdGhpcy5jb25zdHJ1Y3RvciwuLi5iXSxjKX07Yi5zayRzdGF0aWNfbmV3PSExO3JldHVybiBifSwkd3JhcHBlcjpudWxsLCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCAqYXJncywgKiprd2FyZ3MpXCIsJGZsYWdzOntGYXN0Q2FsbDohMH0sJGRvYzpcIkNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdC5cIn07bS5fX2NhbGxfXz17JG5hbWU6XCJfX2NhbGxfX1wiLCRzbG90X25hbWU6XCJ0cCRjYWxsXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXtjb25zdCBkPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOlxuYTtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsYixjKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXthPWEudHAkY2FsbChiLGMpO3JldHVybiB2b2lkIDA9PT1hP1NrLmJ1aWx0aW4ubm9uZS5ub25lJDphfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKmFyZ3MsICoqa3dhcmdzKVwiLCRmbGFnczp7RmFzdENhbGw6ITB9LCRkb2M6XCJDYWxsIHNlbGYgYXMgYSBmdW5jdGlvbi5cIn07bS5fX3JlcHJfXz17JG5hbWU6XCJfX3JlcHJfX1wiLCRzbG90X25hbWU6XCIkclwiLCRzbG90X2Z1bmM6ZChcIl9fcmVwcl9fXCIsU2suYnVpbHRpbi5jaGVja1N0cmluZyxcInN0clwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHJlcHIoc2VsZikuXCJ9O20uX19zdHJfXz17JG5hbWU6XCJfX3N0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHN0clwiLCRzbG90X2Z1bmM6ZChcIl9fc3RyX19cIixTay5idWlsdGluLmNoZWNrU3RyaW5nLFxuXCJzdHJcIiksJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBzdHIoc2VsZikuXCJ9O3ZhciB1PWQoXCJfX2hhc2hfX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT5cIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY6YS50cCRoYXNoKCkpO20uX19oYXNoX189eyRuYW1lOlwiX19oYXNoX19cIiwkc2xvdF9uYW1lOlwidHAkaGFzaFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/U2suYnVpbHRpbi5ub25lLm5vbmUkOnUoYSl9LCR3cmFwcGVyOmwoYSxhPT5uZXcgU2suYnVpbHRpbi5pbnRfKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIlJldHVybiBoYXNoKHNlbGYpLlwifTttLl9fZ2V0YXR0cmlidXRlX189eyRuYW1lOlwiX19nZXRhdHRyaWJ1dGVfX1wiLCRzbG90X25hbWU6XCJ0cCRnZXRhdHRyXCIsJHNsb3RfZnVuYzpmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYSxcbmIpe2xldCBjPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChTay5idWlsdGluLnN0ci4kZ2V0YXR0cik7aWYodm9pZCAwPT09YylyZXR1cm4gbi5jYWxsKHRoaXMsYSxiKTtjb25zdCBkPVNrLm1pc2NldmFsLmNoYWluKG4uY2FsbCh0aGlzLGEsYiksYj0+U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PntpZih2b2lkIDAhPT1iKXJldHVybiBiO2MudHAkZGVzY3JfZ2V0JiYoYz1jLnRwJGRlc2NyX2dldCh0aGlzKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFthXSl9LGZ1bmN0aW9uKGEpe2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSkpO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrT25lQXJnKHRoaXMuJG5hbWUsYixjKTtiPWJbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKStcIidcIik7Yz10aGlzLmNhbGwoYSxiKTtpZih2b2lkIDA9PT1jKXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGhhcyBubyBhdHRyaWJ1dGUgXCIrYi4kanNzdHIoKSk7cmV0dXJuIGN9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRhdHRyX189eyRuYW1lOlwiX19nZXRhdHRyX19cIiwkc2xvdF9uYW1lOlwidHAkZ2V0YXR0clwiLCRzbG90X2Z1bmM6bS5fX2dldGF0dHJpYnV0ZV9fLiRzbG90X2Z1bmMsJHdyYXBwZXI6bnVsbCwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpLlwifTttLl9fc2V0YXR0cl9fPXskbmFtZTpcIl9fc2V0YXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOmsoXCJfX3NldGF0dHJfX1wiLFxuXCJfX2RlbGF0dHJfX1wiKSwkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyh0aGlzLiRuYW1lLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLiRuYW1lLGIsMiwyKTtwKGEsdGhpcyk7dGhpcy5jYWxsKGEsYlswXSxiWzFdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkdGV4dHNpZzpcIigkc2VsZiwgbmFtZSwgdmFsdWUsIC8pXCIsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkZG9jOlwiSW1wbGVtZW50IHNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpLlwifTttLl9fZGVsYXR0cl9fPXskbmFtZTpcIl9fZGVsYXR0cl9fXCIsJHNsb3RfbmFtZTpcInRwJHNldGF0dHJcIiwkc2xvdF9mdW5jOm0uX19zZXRhdHRyX18uJHNsb3RfZnVuYywkd3JhcHBlcjpmdW5jdGlvbihhLGIsYyl7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy4kbmFtZSxiLGMpO3AoYSx0aGlzKTt0aGlzLmNhbGwoYSxiWzBdKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiR0ZXh0c2lnOlwiKCRzZWxmLCBuYW1lLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IGRlbGF0dHIoc2VsZiwgbmFtZSkuXCJ9O20uX19nZXRfXz17JG5hbWU6XCJfX2dldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX2dldFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtudWxsPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTtudWxsPT1jJiYoYz1Tay5idWlsdGluLm5vbmUubm9uZSQpO2NvbnN0IGU9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFtiLGNdKTtyZXR1cm4gZD9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmZ1bmN0aW9uKGEsYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKHRoaXMuJG5hbWUsXG5iLDEsMik7Yz1iWzBdO2I9YlsxXTtjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYz1udWxsKTtiPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYj1udWxsKTtpZihudWxsPT09YiYmbnVsbD09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19nZXRfXyhOb25lLCBOb25lKSBpcyBpbnZhbGlkXCIpO3JldHVybiB0aGlzLmNhbGwoYSxjLGIpfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIG93bmVyLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlJldHVybiBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UsIHdoaWNoIGlzIG9mIHR5cGUgb3duZXIuXCJ9O20uX19zZXRfXz17JG5hbWU6XCJfX3NldF9fXCIsJHNsb3RfbmFtZTpcInRwJGRlc2NyX3NldFwiLCRzbG90X2Z1bmM6ayhcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIiksJHdyYXBwZXI6ZSwkdGV4dHNpZzpcIigkc2VsZiwgaW5zdGFuY2UsIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sXG4kZG9jOlwiU2V0IGFuIGF0dHJpYnV0ZSBvZiBpbnN0YW5jZSB0byB2YWx1ZS5cIn07bS5fX2RlbGV0ZV9fPXskbmFtZTpcIl9fZGVsZXRlX19cIiwkc2xvdF9uYW1lOlwidHAkZGVzY3Jfc2V0XCIsJHNsb3RfZnVuYzptLl9fc2V0X18uJHNsb3RfZnVuYywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCBpbnN0YW5jZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBhbiBhdHRyaWJ1dGUgb2YgaW5zdGFuY2UuXCJ9O20uX19lcV9fPXskbmFtZTpcIl9fZXFfX1wiLCRzbG90X25hbWU6XCJvYiRlcVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPT12YWx1ZS5cIn07bS5fX2dlX189eyRuYW1lOlwiX19nZV9fXCIsJHNsb3RfbmFtZTpcIm9iJGdlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmYsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gc2VsZj49dmFsdWUuXCJ9O20uX19ndF9fPXskbmFtZTpcIl9fZ3RfX1wiLCRzbG90X25hbWU6XCJvYiRndFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPnZhbHVlLlwifTttLl9fbGVfXz17JG5hbWU6XCJfX2xlX19cIiwkc2xvdF9uYW1lOlwib2IkbGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6ZiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw9dmFsdWUuXCJ9O20uX19sdF9fPXskbmFtZTpcIl9fbHRfX1wiLCRzbG90X25hbWU6XCJvYiRsdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmPHZhbHVlLlwifTttLl9fbmVfXz17JG5hbWU6XCJfX25lX19cIiwkc2xvdF9uYW1lOlwib2IkbmVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpmLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmIT12YWx1ZS5cIn07bS5fX2l0ZXJfXz17JG5hbWU6XCJfX2l0ZXJfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVyXCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJJbXBsZW1lbnQgaXRlcihzZWxmKS5cIn07bS5fX25leHRfXz17JG5hbWU6XCJfX25leHRfX1wiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YSxkPVNrLm1pc2NldmFsLnRyeUNhdGNoKCgpPT5Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbikpdGhyb3cgYTtcbn0pO3JldHVybiBiP2Q6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGQpfX0sJHdyYXBwZXI6ZnVuY3Rpb24oYSxiLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuJG5hbWUsYixjKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYS50cCRpdGVybmV4dCghMCksYT0+e2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbjtyZXR1cm4gYX0pfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIkltcGxlbWVudCBuZXh0KHNlbGYpLlwifTttLl9fbGVuX189eyRuYW1lOlwiX19sZW5fX1wiLCRzbG90X25hbWU6XCJzcSRsZW5ndGhcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtjb25zdCBjPWEudHAkZGVzY3JfZ2V0P2EudHAkZGVzY3JfZ2V0KHRoaXMpOmE7aWYoYilyZXR1cm4gYj1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxbXSksU2subWlzY2V2YWwuY2hhaW4oYixcbmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpKTtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFtdKTtyZXR1cm4gU2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYil9fSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gbGVuKHNlbGYpLlwifTttLl9fY29udGFpbnNfXz17JG5hbWU6XCJfX2NvbnRhaW5zX19cIiwkc2xvdF9uYW1lOlwic3EkY29udGFpbnNcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtiPVNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtiXSk7Yj1Tay5taXNjZXZhbC5jaGFpbihiLGE9PlNrLm1pc2NldmFsLmlzVHJ1ZShhKSk7cmV0dXJuIGIuJGlzU3VzcGVuc2lvbj9jP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpOlxuYn19LCR3cmFwcGVyOmwoYyxhPT5uZXcgU2suYnVpbHRpbi5ib29sKGEpKSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIGtleSBpbiBzZWxmLlwifTttLl9fZ2V0aXRlbV9fPXskbmFtZTpcIl9fZ2V0aXRlbV9fXCIsJHNsb3RfbmFtZTpcIm1wJHN1YnNjcmlwdFwiLCRzbG90X2Z1bmM6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7Y29uc3QgZD1hLnRwJGRlc2NyX2dldD9hLnRwJGRlc2NyX2dldCh0aGlzKTphO2I9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGQsW2JdKTtyZXR1cm4gYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX19LCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmW2tleV0uXCJ9O20uX19zZXRpdGVtX189eyRuYW1lOlwiX19zZXRpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLFxuJHNsb3RfZnVuYzprKFwiX19zZXRpdGVtX19cIixcIl9fZGVsaXRlbV9fXCIsXCJkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudFwiKSwkd3JhcHBlcjplLCR0ZXh0c2lnOlwiKCRzZWxmLCBrZXksIHZhbHVlLCAvKVwiLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJGRvYzpcIlNldCBzZWxmW2tleV0gdG8gdmFsdWUuXCJ9O20uX19kZWxpdGVtX189eyRuYW1lOlwiX19kZWxpdGVtX19cIiwkc2xvdF9uYW1lOlwibXAkYXNzX3N1YnNjcmlwdFwiLCRzbG90X2Z1bmM6bS5fX3NldGl0ZW1fXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIGtleSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkRlbGV0ZSBzZWxmW2tleV0uXCJ9O20uX19hZGRfXz17JG5hbWU6XCJfX2FkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmK3ZhbHVlLlwifTtcbm0uX19yYWRkX189eyRuYW1lOlwiX19yYWRkX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2FkZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZStzZWxmLlwifTttLl9faWFkZF9fPXskbmFtZTpcIl9faWFkZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfYWRkXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYrPXZhbHVlLlwifTttLl9fc3ViX189eyRuYW1lOlwiX19zdWJfX1wiLCRzbG90X25hbWU6XCJuYiRzdWJ0cmFjdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmLXZhbHVlLlwifTttLl9fcnN1Yl9fPXskbmFtZTpcIl9fcnN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlLXNlbGYuXCJ9O20uX19pbXVsX189eyRuYW1lOlwiX19pbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmKj12YWx1ZS5cIn07bS5fX211bF9fPXskbmFtZTpcIl9fbXVsX19cIiwkc2xvdF9uYW1lOlwibmIkbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZip2YWx1ZS5cIn07bS5fX3JtdWxfXz17JG5hbWU6XCJfX3JtdWxfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YyxcbiR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSpzZWxmLlwifTttLl9faXN1Yl9fPXskbmFtZTpcIl9faXN1Yl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2Vfc3VidHJhY3RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi09dmFsdWUuXCJ9O20uX19tb2RfXz17JG5hbWU6XCJfX21vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlbWFpbmRlclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJXZhbHVlLlwifTttLl9fcm1vZF9fPXskbmFtZTpcIl9fcm1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9yZW1haW5kZXJcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSVzZWxmLlwifTttLl9faW1vZF9fPXskbmFtZTpcIl9faW1vZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcmVtYWluZGVyXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHZhbHVlJT1zZWxmLlwifTttLl9fZGl2bW9kX189eyRuYW1lOlwiX19kaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZtb2RcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gZGl2bW9kKHNlbGYsIHZhbHVlKS5cIn07bS5fX3JkaXZtb2RfXz17JG5hbWU6XCJfX3JkaXZtb2RfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSxcbiRkb2M6XCJSZXR1cm4gZGl2bW9kKHZhbHVlLCBzZWxmKVwifTttLl9fcG9zX189eyRuYW1lOlwiX19wb3NfX1wiLCRzbG90X25hbWU6XCJuYiRwb3NpdGl2ZVwiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiK3NlbGZcIn07bS5fX25lZ19fPXskbmFtZTpcIl9fbmVnX19cIiwkc2xvdF9uYW1lOlwibmIkbmVnYXRpdmVcIiwkc2xvdF9mdW5jOmgsJHdyYXBwZXI6YSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZmxhZ3M6e05vQXJnczohMH0sJGRvYzpcIi1zZWxmXCJ9O20uX19hYnNfXz17JG5hbWU6XCJfX2Fic19fXCIsJHNsb3RfbmFtZTpcIm5iJGFic1wiLCRzbG90X2Z1bmM6aCwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiYWJzKHNlbGYpXCJ9O20uX19ib29sX189eyRuYW1lOlwiX19ib29sX19cIiwkc2xvdF9uYW1lOlwibmIkYm9vbFwiLCRzbG90X2Z1bmM6ZChcIl9fYm9vbF9fXCIsXG5Tay5idWlsdGluLmNoZWNrQm9vbCxcImJvb2xcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJzZWxmICE9IDBcIn07bS5fX2ludmVydF9fPXskbmFtZTpcIl9faW52ZXJ0X19cIiwkc2xvdF9uYW1lOlwibmIkaW52ZXJ0XCIsJHNsb3RfZnVuYzpoLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ+c2VsZlwifTttLl9fbHNoaWZ0X189eyRuYW1lOlwiX19sc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRsc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZjw8dmFsdWUuXCJ9O20uX19ybHNoaWZ0X189eyRuYW1lOlwiX19ybHNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLCRzbG90X2Z1bmM6ZyxcbiR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHZhbHVlPDxzZWxmLlwifTttLl9fcnNoaWZ0X189eyRuYW1lOlwiX19yc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRyc2hpZnRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZj4+dmFsdWUuXCJ9O20uX19ycnNoaWZ0X189eyRuYW1lOlwiX19ycnNoaWZ0X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZT4+c2VsZi5cIn07bS5fX2lsc2hpZnRfXz17JG5hbWU6XCJfX2lsc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX2xzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGY8PD12YWx1ZS5cIn07bS5fX2lyc2hpZnRfXz17JG5hbWU6XCJfX2lyc2hpZnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnBsYWNlX3JzaGlmdFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmPT4+dmFsdWUuXCJ9O20uX19hbmRfXz17JG5hbWU6XCJfX2FuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmJnZhbHVlLlwifTttLl9fcmFuZF9fPXskbmFtZTpcIl9fcmFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmVsY3RlZF9hbmRcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsXG4kZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZSZzZWxmLlwifTttLl9faWFuZF9fPXskbmFtZTpcIl9faWFuZF9fXCIsJHNsb3RfbmFtZTpcIm5iJGFuZFwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIkltcGxlbWVudCBzZWxmJj12YWx1ZS5cIn07bS5fX3hvcl9fPXskbmFtZTpcIl9feG9yX19cIiwkc2xvdF9uYW1lOlwibmIkeG9yXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZedmFsdWUuXCJ9O20uX19yeG9yX189eyRuYW1lOlwiX19yeG9yX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX3hvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZV5zZWxmLlwifTtcbm0uX19peG9yX189eyRuYW1lOlwiX19peG9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV94b3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZl49dmFsdWUuXCJ9O20uX19vcl9fPXskbmFtZTpcIl9fb3JfX1wiLCRzbG90X25hbWU6XCJuYiRvclwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmfHZhbHVlLlwifTttLl9fcm9yX189eyRuYW1lOlwiX19yb3JfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfb3JcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWV8c2VsZi5cIn07bS5fX2lvcl9fPXskbmFtZTpcIl9faW9yX19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9vclwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZ8PXZhbHVlLlwifTttLl9faW50X189eyRuYW1lOlwiX19pbnRfX1wiLCRzbG90X25hbWU6XCJuYiRpbnRcIiwkc2xvdF9mdW5jOmQoXCJfX2ludF9fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O20uX19mbG9hdF9fPXskbmFtZTpcIl9fZmxvYXRfX1wiLCRzbG90X25hbWU6XCJuYiRmbG9hdFwiLCRzbG90X2Z1bmM6ZChcIl9fZmxvYXRfX1wiLFNrLmJ1aWx0aW4uY2hlY2tGbG9hdCxcImZsb2F0XCIpLCR3cmFwcGVyOmEsJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJmbG9hdChzZWxmKVwifTttLl9fZmxvb3JkaXZfXz17JG5hbWU6XCJfX2Zsb29yZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZmxvb3JfZGl2aWRlXCIsXG4kc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gc2VsZi8vdmFsdWUuXCJ9O20uX19yZmxvb3JkaXZfXz17JG5hbWU6XCJfX3JmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJSZXR1cm4gdmFsdWUvL3NlbGYuXCJ9O20uX19pZmxvb3JkaXZfXz17JG5hbWU6XCJfX2lmbG9vcmRpdl9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfZmxvb3JfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGYvLz12YWx1ZS5cIn07bS5fX3RydWVkaXZfXz17JG5hbWU6XCJfX3RydWVkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRkaXZpZGVcIixcbiRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiBzZWxmL3ZhbHVlLlwifTttLl9fcnRydWVkaXZfXz17JG5hbWU6XCJfX3J0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX2RpdmlkZVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZS9zZWxmLlwifTttLl9faXRydWVkaXZfXz17JG5hbWU6XCJfX2l0cnVlZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGZsYWdzOntPbmVBcmc6ITB9LCRkb2M6XCJJbXBsZW1lbnQgc2VsZi89dmFsdWUuXCJ9O20uX19pbmRleF9fPXskbmFtZTpcIl9faW5kZXhfX1wiLCRzbG90X25hbWU6XCJuYiRpbmRleFwiLCRzbG90X2Z1bmM6ZChcIl9faW5kZXhfX1wiLFxuU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiLGE9PmEudiksJHdyYXBwZXI6bChhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGYgY29udmVydGVkIHRvIGFuIGludGVnZXIsIGlmIHNlbGYgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpbmRleCBpbnRvIGEgbGlzdC5cIn07bS5fX3Bvd19fPXskbmFtZTpcIl9fcG93X19cIiwkc2xvdF9uYW1lOlwibmIkcG93ZXJcIiwkc2xvdF9mdW5jOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YS50cCRkZXNjcl9nZXQ/YS50cCRkZXNjcl9nZXQodGhpcyk6YTtyZXR1cm4gdm9pZCAwPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1BcnJheShkLFtiXSk6U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGQsW2IsY10pfX0sJHdyYXBwZXI6YiwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIG1vZD1Ob25lLCAvKVwiLCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczoyfSwkZG9jOlwiUmV0dXJuIHBvdyhzZWxmLCB2YWx1ZSwgbW9kKS5cIn07bS5fX3Jwb3dfXz17JG5hbWU6XCJfX3Jwb3dfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJSZXR1cm4gcG93KHZhbHVlLCBzZWxmLCBtb2QpLlwifTttLl9faXBvd19fPXskbmFtZTpcIl9faXBvd19fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfcG93ZXJcIiwkc2xvdF9mdW5jOm0uX19wb3dfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOmIsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBtb2Q9Tm9uZSwgLylcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCRkb2M6XCJJbXBsZW1lbnQgKio9XCJ9O20uX19tYXRtdWxfXz17JG5hbWU6XCJfX21hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJG1hdHJpeF9tdWx0aXBseVwiLFxuJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiUmV0dXJuIHNlbGZAdmFsdWUuXCJ9O20uX19ybWF0bXVsX189eyRuYW1lOlwiX19ybWF0bXVsX19cIiwkc2xvdF9uYW1lOlwibmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseVwiLCRzbG90X2Z1bmM6Zywkd3JhcHBlcjpjLCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcIlJldHVybiB2YWx1ZUBzZWxmLlwifTttLl9faW1hdG11bF9fPXskbmFtZTpcIl9faW1hdG11bF9fXCIsJHNsb3RfbmFtZTpcIm5iJGlucGxhY2VfbWF0cml4X211bHRpcGx5XCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiSW1wbGVtZW50IHNlbGZAPXZhbHVlLlwifTttLl9fbG9uZ19fPXskbmFtZTpcIl9fbG9uZ19fXCIsJHNsb3RfbmFtZTpcIm5iJGxvbmdcIixcbiRzbG90X2Z1bmM6ZChcIl9fbG9uZ19fXCIsU2suYnVpbHRpbi5jaGVja0ludCxcImludFwiKSwkd3JhcHBlcjphLCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRmbGFnczp7Tm9BcmdzOiEwfSwkZG9jOlwiaW50KHNlbGYpXCJ9O3ZhciBBLHQ9e25leHQ6eyRuYW1lOlwibmV4dFwiLCRzbG90X25hbWU6XCJ0cCRpdGVybmV4dFwiLCRzbG90X2Z1bmM6bS5fX25leHRfXy4kc2xvdF9mdW5jLCR3cmFwcGVyOm0uX19uZXh0X18uJHdyYXBwZXIsJHRleHRzaWc6bS5fX25leHRfXy4kdGV4dHNpZywkZmxhZ3M6bS5fX25leHRfXy4kZmxhZ3N9LF9fbm9uemVyb19fOnskbmFtZTpcIl9fbm9uemVyb19fXCIsJHNsb3RfbmFtZTpcIm5iJGJvb2xcIiwkc2xvdF9mdW5jOmQoXCJfX25vbnplcm9fX1wiLFNrLmJ1aWx0aW4uY2hlY2tJbnQsXCJpbnRcIixhPT4wIT09YS52KSwkd3JhcHBlcjpsKGEsYT0+bmV3IFNrLmJ1aWx0aW4uYm9vbChhKSksJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJ4Ll9fbm9uemVyb19fKCkgPD09PiB4ICE9IDBcIn0sXG5fX2Rpdl9fOnskbmFtZTpcIl9fZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19kaXZfXyh5KSA8PT0+IHgveVwifSxfX3JkaXZfXzp7JG5hbWU6XCJfX3JkaXZfX1wiLCRzbG90X25hbWU6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsJHNsb3RfZnVuYzpnLCR3cmFwcGVyOmMsJHRleHRzaWc6XCIoJHNlbGYsIG90aGVyLylcIiwkZmxhZ3M6e09uZUFyZzohMH0sJGRvYzpcInguX19yZGl2X18oeSkgPD09PiB4L3lcIn0sX19pZGl2X186eyRuYW1lOlwiX19pZGl2X19cIiwkc2xvdF9uYW1lOlwibmIkaW5wbGFjZV9kaXZpZGVcIiwkc2xvdF9mdW5jOmcsJHdyYXBwZXI6YywkdGV4dHNpZzpcIigkc2VsZiwgb3RoZXIvKVwiLCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwiaW1wbGVtZW50IHNlbGYgLz0gb3RoZXJcIn19O1NrLnN1YlNsb3RzPXttYWluX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHt0cCRpbml0OlwiX19pbml0X19cIixcbnRwJGNhbGw6XCJfX2NhbGxfX1wiLCRyOlwiX19yZXByX19cIix0cCRzdHI6XCJfX3N0cl9fXCIsdHAkZ2V0YXR0cjpcIl9fZ2V0YXR0cmlidXRlX19cIix0cCRzZXRhdHRyOltcIl9fc2V0YXR0cl9fXCIsXCJfX2RlbGF0dHJfX1wiXSxvYiRlcTpcIl9fZXFfX1wiLG9iJG5lOlwiX19uZV9fXCIsb2IkbHQ6XCJfX2x0X19cIixvYiRsZTpcIl9fbGVfX1wiLG9iJGd0OlwiX19ndF9fXCIsb2IkZ2U6XCJfX2dlX19cIix0cCRkZXNjcl9nZXQ6XCJfX2dldF9fXCIsdHAkZGVzY3Jfc2V0OltcIl9fc2V0X19cIixcIl9fZGVsZXRlX19cIl0sdHAkaXRlcjpcIl9faXRlcl9fXCIsdHAkaXRlcm5leHQ6XCJfX25leHRfX1wifSksbnVtYmVyX3Nsb3RzOk9iamVjdC5lbnRyaWVzKHtuYiRhYnM6XCJfX2Fic19fXCIsbmIkbmVnYXRpdmU6XCJfX25lZ19fXCIsbmIkcG9zaXRpdmU6XCJfX3Bvc19fXCIsbmIkaW50OlwiX19pbnRfX1wiLG5iJGxvbmc6XCJfX2xvbmdfX1wiLG5iJGZsb2F0OlwiX19mbG9hdF9fXCIsbmIkYWRkOlwiX19hZGRfX1wiLG5iJHJlZmxlY3RlZF9hZGQ6XCJfX3JhZGRfX1wiLFxubmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJHN1YnRyYWN0OlwiX19zdWJfX1wiLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpcIl9fcnN1Yl9fXCIsbmIkaW5wbGFjZV9zdWJ0cmFjdDpcIl9faXN1Yl9fXCIsbmIkbXVsdGlwbHk6XCJfX211bF9fXCIsbmIkcmVmbGVjdGVkX211bHRpcGx5OlwiX19ybXVsX19cIixuYiRpbnBsYWNlX211bHRpcGx5OlwiX19pbXVsX19cIixuYiRmbG9vcl9kaXZpZGU6XCJfX2Zsb29yZGl2X19cIixuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOlwiX19yZmxvb3JkaXZfX1wiLG5iJGlucGxhY2VfZmxvb3JfZGl2aWRlOlwiX19pZmxvb3JkaXZfX1wiLG5iJGludmVydDpcIl9faW52ZXJ0X19cIixuYiRyZW1haW5kZXI6XCJfX21vZF9fXCIsbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpcIl9fcm1vZF9fXCIsbmIkaW5wbGFjZV9yZW1haW5kZXI6XCJfX2ltb2RfX1wiLG5iJGRpdm1vZDpcIl9fZGl2bW9kX19cIixuYiRyZWZsZWN0ZWRfZGl2bW9kOlwiX19yZGl2bW9kX19cIixuYiRwb3dlcjpcIl9fcG93X19cIixuYiRyZWZsZWN0ZWRfcG93ZXI6XCJfX3Jwb3dfX1wiLFxubmIkaW5wbGFjZV9wb3dlcjpcIl9faXBvd19fXCIsbmIkZGl2aWRlOlwiX190cnVlZGl2X19cIixuYiRyZWZsZWN0ZWRfZGl2aWRlOlwiX19ydHJ1ZWRpdl9fXCIsbmIkaW5wbGFjZV9kaXZpZGU6XCJfX2l0cnVlZGl2X19cIixuYiRib29sOlwiX19ib29sX19cIixuYiRhbmQ6XCJfX2FuZF9fXCIsbmIkcmVmbGVjdGVkX2FuZDpcIl9fcmFuZF9fXCIsbmIkaW5wbGFjZV9hbmQ6XCJfX2lhbmRfX1wiLG5iJG9yOlwiX19vcl9fXCIsbmIkcmVmbGVjdGVkX29yOlwiX19yb3JfX1wiLG5iJGlucGxhY2Vfb3I6XCJfX2lvcl9fXCIsbmIkeG9yOlwiX194b3JfX1wiLG5iJHJlZmxlY3RlZF94b3I6XCJfX3J4b3JfX1wiLG5iJGlucGxhY2VfeG9yOlwiX19peG9yX19cIixuYiRsc2hpZnQ6XCJfX2xzaGlmdF9fXCIsbmIkcmVmbGVjdGVkX2xzaGlmdDpcIl9fcmxzaGlmdF9fXCIsbmIkcnNoaWZ0OlwiX19yc2hpZnRfX1wiLG5iJHJlZmxlY3RlZF9yc2hpZnQ6XCJfX3Jyc2hpZnRfX1wiLG5iJGlucGxhY2VfbHNoaWZ0OlwiX19pbHNoaWZ0X19cIixuYiRpbnBsYWNlX3JzaGlmdDpcIl9faXJzaGlmdF9fXCIsXG5uYiRtYXRyaXhfbXVsdGlwbHk6XCJfX21hdG11bF9fXCIsbmIkcmVmbGVjdGVkX21hdHJpeF9tdWx0aXBseTpcIl9fcm1hdG11bF9fXCIsbmIkaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHk6XCJfX2ltYXRtdWxfX1wifSksc2VxdWVuY2VfYW5kX21hcHBpbmdfc2xvdHM6T2JqZWN0LmVudHJpZXMoe3NxJGxlbmd0aDpcIl9fbGVuX19cIixzcSRjb250YWluczpcIl9fY29udGFpbnNfX1wiLG1wJHN1YnNjcmlwdDpcIl9fZ2V0aXRlbV9fXCIsbXAkYXNzX3N1YnNjcmlwdDpbXCJfX3NldGl0ZW1fX1wiLFwiX19kZWxpdGVtX19cIl0sbmIkYWRkOlwiX19hZGRfX1wiLG5iJG11bHRpcGx5OlwiX19tdWxfX1wiLG5iJHJlZmxlY3RlZF9tdWx0aXBseTpcIl9fcm11bF9fXCIsbmIkaW5wbGFjZV9hZGQ6XCJfX2lhZGRfX1wiLG5iJGlucGxhY2VfbXVsdGlwbHk6XCJfX2ltdWxfX1wifSl9O1NrLnJlZmxlY3RlZE51bWJlclNsb3RzPXtuYiRhZGQ6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9hZGRcIn0sbmIkc3VidHJhY3Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9zdWJ0cmFjdFwiLFxuc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRzdWJ0cmFjdCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJG11bHRpcGx5OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIn0sbmIkZGl2aWRlOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRkaXZpZGUodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRmbG9vcl9kaXZpZGU6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9mbG9vcl9kaXZpZGVcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGZsb29yX2RpdmlkZSh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LFxubmIkcmVtYWluZGVyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcmVtYWluZGVyXCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyZW1haW5kZXIodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRkaXZtb2Q6e3JlZmxlY3RlZDpcIm5iJHJlZmxlY3RlZF9kaXZtb2RcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9hLm5iJGRpdm1vZCh0aGlzKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJHBvd2VyOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixzbG90OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkcG93ZXIodGhpcyxiKTpTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LG5iJGFuZDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2FuZFwifSxcbm5iJG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfb3JcIn0sbmIkeG9yOntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfeG9yXCJ9LG5iJGxzaGlmdDp7cmVmbGVjdGVkOlwibmIkcmVmbGVjdGVkX2xzaGlmdFwiLHNsb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yP2EubmIkbHNoaWZ0KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX0sbmIkcnNoaWZ0OntyZWZsZWN0ZWQ6XCJuYiRyZWZsZWN0ZWRfcnNoaWZ0XCIsc2xvdDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/YS5uYiRyc2hpZnQodGhpcyk6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fSxuYiRtYXRyaXhfbXVsdGlwbHk6e3JlZmxlY3RlZDpcIm5iJHJlZmxleHRlZF9tYXRyaXhfbXVsdGlwbHlcIixzbG90OmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj9cbmEubmIkbWF0cml4X211bHRpcGx5KHRoaXMpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX19O1NrLnNlcXVlbmNlQW5kTWFwcGluZ1Nsb3RzPXtzcSRjb25jYXQ6W1wibmIkYWRkXCJdLHNxJHJlcGVhdDpbXCJuYiRtdWx0aXBseVwiLFwibmIkcmVmbGVjdGVkX211bHRpcGx5XCJdLG1wJGxlbmd0aDpbXCJzcSRsZW5ndGhcIl0sc3EkaW5wbGFjZV9yZXBlYXQ6W1wibmIkaW5wbGFjZV9tdWx0aXBseVwiXSxzcSRpbnBsYWNlX2NvbmNhdDpbXCJuYiRpbnBsYWNlX2FkZFwiXX07U2suZHVuZGVyVG9Ta3VscHQ9e19fcmVwcl9fOlwiJHJcIixfX3N0cl9fOlwidHAkc3RyXCIsX19pbml0X186XCJ0cCRpbml0XCIsX19uZXdfXzpcInRwJG5ld1wiLF9faGFzaF9fOlwidHAkaGFzaFwiLF9fY2FsbF9fOlwidHAkY2FsbFwiLF9faXRlcl9fOlwidHAkaXRlclwiLF9fbmV4dF9fOlwidHAkaXRlcm5leHRcIixfX2VxX186XCJvYiRlcVwiLF9fbmVfXzpcIm9iJG5lXCIsX19sdF9fOlwib2IkbHRcIixfX2xlX186XCJvYiRsZVwiLFxuX19ndF9fOlwib2IkZ3RcIixfX2dlX186XCJvYiRnZVwiLF9fYWJzX186XCJuYiRhYnNcIixfX25lZ19fOlwibmIkbmVnYXRpdmVcIixfX3Bvc19fOlwibmIkcG9zaXRpdmVcIixfX2ludF9fOlwibmIkaW50XCIsX19mbG9hdF9fOlwibmIkZmxvYXRcIixfX2FkZF9fOlwibmIkYWRkXCIsX19yYWRkX186XCJuYiRyZWZsZWN0ZWRfYWRkXCIsX19pYWRkX186XCJuYiRpbnBsYWNlX2FkZFwiLF9fc3ViX186XCJuYiRzdWJ0cmFjdFwiLF9fcnN1Yl9fOlwibmIkcmVmbGVjdGVkX3N1YnRyYWN0XCIsX19pc3ViX186XCJuYiRpbnBsYWNlX3N1YnRyYWN0XCIsX19tdWxfXzpcIm5iJG11bHRpcGx5XCIsX19ybXVsX186XCJuYiRyZWZsZWN0ZWRfbXVsdGlwbHlcIixfX2ltdWxfXzpcIm5iJGlucGxhY2VfbXVsdGlwbHlcIixfX3RydWVkaXZfXzpcIm5iJGRpdmlkZVwiLF9fcnRydWVkaXZfXzpcIm5iJHJlZmxlY3RlZF9kaXZpZGVcIixfX2l0cnVlZGl2X186XCJuYiRpbnBsYWNlX2RpdmlkZVwiLF9fZmxvb3JkaXZfXzpcIm5iJGZsb29yX2RpdmlkZVwiLF9fcmZsb29yZGl2X186XCJuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlXCIsXG5fX2lmbG9vcmRpdl9fOlwibmIkaW5wbGFjZV9mbG9vcl9kaXZpZGVcIixfX2ludmVydF9fOlwibmIkaW52ZXJ0XCIsX19tb2RfXzpcIm5iJHJlbWFpbmRlclwiLF9fcm1vZF9fOlwibmIkcmVmbGVjdGVkX3JlbWFpbmRlclwiLF9faW1vZF9fOlwibmIkaW5wbGFjZV9yZW1haW5kZXJcIixfX2Rpdm1vZF9fOlwibmIkZGl2bW9kXCIsX19yZGl2bW9kX186XCJuYiRyZWZsZWN0ZWRfZGl2bW9kXCIsX19wb3dfXzpcIm5iJHBvd2VyXCIsX19ycG93X186XCJuYiRyZWZsZWN0ZWRfcG93ZXJcIixfX2lwb3dfXzpcIm5iJGlucGxhY2VfcG93ZXJcIixfX2Jvb2xfXzpcIm5iJGJvb2xcIixfX2xvbmdfXzpcIm5iJGxvbmdcIixfX2xzaGlmdF9fOlwibmIkbHNoaWZ0XCIsX19ybHNoaWZ0X186XCJuYiRyZWZsZWN0ZWRfbHNoaWZ0XCIsX19pbHNoaWZ0X186XCJuYiRpbnBsYWNlX2xzaGlmdFwiLF9fcnNoaWZ0X186XCJuYiRyc2hpZnRcIixfX3Jyc2hpZnRfXzpcIm5iJHJlZmxlY3RlZF9yc2hpZnRcIixfX2lyc2hpZnRfXzpcIm5iJGlucGxhY2VfcnNoaWZ0XCIsXG5fX2FuZF9fOlwibmIkYW5kXCIsX19yYW5kX186XCJuYiRyZWZsZWN0ZWRfYW5kXCIsX19pYW5kX186XCJuYiRpbnBsYWNlX2FuZFwiLF9fb3JfXzpcIm5iJG9yXCIsX19yb3JfXzpcIm5iJHJlZmxlY3RlZF9vclwiLF9faW9yX186XCJuYiRpbnBsYWNlX29yXCIsX194b3JfXzpcIm5iJHhvclwiLF9fcnhvcl9fOlwibmIkcmVmbGVjdGVkX3hvclwiLF9faXhvcl9fOlwibmIkaW5wbGFjZV94b3JcIixfX21hdG11bF9fOlwibmIkbWF0cml4X211bHRpcGx5XCIsX19ybWF0bXVsX186XCJuYiRyZWZsZWN0ZWRfbWF0cml4X211bHRpcGx5XCIsX19pbWF0bXVsX186XCJuYiRpbnBsYWNlX21hdHJpeF9tdWx0aXBseVwiLF9fZ2V0X186XCJ0cCRkZXNjcl9nZXRcIixfX3NldF9fOlwidHAkZGVzY3Jfc2V0XCIsX19kZWxldGVfXzpcInRwJGRlc2NyX3NldFwiLF9fZ2V0YXR0cmlidXRlX186XCJ0cCRnZXRhdHRyXCIsX19nZXRhdHRyX186XCJ0cCRnZXRhdHRyXCIsX19zZXRhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19kZWxhdHRyX186XCJ0cCRzZXRhdHRyXCIsX19sZW5fXzpcInNxJGxlbmd0aFwiLFxuX19jb250YWluc19fOlwic3EkY29udGFpbnNcIixfX2dldGl0ZW1fXzpcIm1wJHN1YnNjcmlwdFwiLF9fc2V0aXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwiLF9fZGVsaXRlbV9fOlwibXAkYXNzX3N1YnNjcmlwdFwifTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cER1bmRlck1ldGhvZHNcIixTay5zZXR1cER1bmRlck1ldGhvZHMpO1NrLnNldHVwRHVuZGVyTWV0aG9kcz1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYixjKXtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyl7Y29uc3QgZT1hW2RdLnByb3RvdHlwZTtlLmhhc093blByb3BlcnR5KGMpfHwoZVtjXT1lW2JdLGRlbGV0ZSBlW2JdKX19dmFyIGM9U2suc2xvdHM7aWYoIWF8fHZvaWQgMCE9PUEpe3ZhciBkPVNrLmFic3RyLmJ1aWx0JGl0ZXJhdG9ycyxlPVtTay5idWlsdGluLmludF8sU2suYnVpbHRpbi5sbmcsU2suYnVpbHRpbi5mbG9hdF8sU2suYnVpbHRpbi5jb21wbGV4XSxmPVNrLnN1YlNsb3RzLm51bWJlcl9zbG90cyxnPVNrLnN1YlNsb3RzLm1haW5fc2xvdHMsXG5oPWcuZmluZEluZGV4KGE9PlwidHAkaXRlcm5leHRcIj09PWFbMF0pLGs9Zi5maW5kSW5kZXgoYT0+XCJuYiRib29sXCI9PT1hWzBdKSxsPVNrLmR1bmRlclRvU2t1bHB0O2lmKGEpe2wuX19ib29sX189XCJuYiRib29sXCI7bC5fX25leHRfXz1cInRwJGl0ZXJuZXh0XCI7ZGVsZXRlIGwuX19ub256ZXJvX187ZGVsZXRlIGwuX19kaXZfXztkZWxldGUgbC5fX3JkaXZfXztkZWxldGUgbC5fX2lkaXZfXztkZWxldGUgbC5uZXh0O2ZvcihsZXQgYSBpbiBBKWNbYV09QVthXTtmb3IobGV0IGEgaW4gdClkZWxldGUgY1thXTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKWM9ZVthXS5wcm90b3R5cGUsZGVsZXRlIGMuX19kaXZfXyxkZWxldGUgYy5fX3JkaXZfXztnW2hdWzFdPVwiX19uZXh0X19cIjtmW2tdWzFdPVwiX19ib29sX19cIjtiKGQsXCJuZXh0XCIsXCJfX25leHRfX1wiKTtiKGUsXCJfX2Jvb2xfX1wiLFwiX19ub256ZXJvX19cIil9ZWxzZXt2b2lkIDA9PT1BJiYoYy5weTMkc2xvdHM9e19fbmV4dF9fOmMuX19uZXh0X199LFxuQT1jLnB5MyRzbG90cyk7bC5uZXh0PVwidHAkaXRlcm5leHRcIjtsLl9fbm9uemVyb19fPVwibmIkYm9vbFwiO2wuX19kaXZfXz1cIm5iJGRpdmlkZVwiO2wuX19yZGl2X189XCJuYiRyZWZsZWN0ZWRfZGl2aWRlXCI7bC5fX2lkaXZfXz1cIm5iJGlucGxhY2VfZGl2aWRlXCI7ZGVsZXRlIGwuX19ib29sX187ZGVsZXRlIGwuX19uZXh0X187Zm9yKGxldCBhIGluIHQpY1thXT10W2FdO2ZvcihsZXQgYSBpbiBBKWRlbGV0ZSBjW2FdO2dbaF1bMV09XCJuZXh0XCI7ZltrXVsxXT1cIl9fbm9uemVyb19fXCI7YihkLFwiX19uZXh0X19cIixcIm5leHRcIik7YihlLFwiX19ub256ZXJvX19cIixcIl9fYm9vbF9fXCIpO2ZvcihkPTA7ZDxlLmxlbmd0aDtkKyspZj1lW2RdLGc9Zi5wcm90b3R5cGUsZy5oYXNPd25Qcm9wZXJ0eShcIl9fZGl2X19cIil8fChnLl9fZGl2X189bmV3IFNrLmJ1aWx0aW4ud3JhcHBlcl9kZXNjcmlwdG9yKGYsdC5fX2Rpdl9fLGcubmIkZGl2aWRlKSxnLl9fcmRpdl9fPW5ldyBTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcihmLFxudC5fX3JkaXZfXyxTay5yZWZsZWN0ZWROdW1iZXJTbG90cy5uYiRkaXZpZGUuc2xvdCkpfX19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxoLGQpe3JldHVybiBTay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKGEse2NvbnN0cnVjdG9yOmQuY29uc3RydWN0b3Isc2xvdHM6T2JqZWN0LmFzc2lnbih7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHI6ZX0sZC5zbG90cyksZ2V0c2V0czpPYmplY3QuYXNzaWduKGQuZ2V0c2V0c3x8e30sZikscHJvdG86T2JqZWN0LmFzc2lnbihkLnByb3RvfHx7fSx7ZCRyZXByX25hbWU6aHx8YSxkJGNoZWNrOmMsZCRzZXRfY2hlY2s6Yn0pLGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9ZnVuY3Rpb24gYyhhKXtpZihudWxsPT1hKXJldHVybiB0aGlzO2lmKCFhLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXG5cIicgcmVxdWlyZXMgYSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG9iamVjdCBidXQgcmVjZWl2ZWQgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIG9iamVjdFwiKTt9ZnVuY3Rpb24gYihhKXtpZighYS5vYiR0eXBlLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyByZXF1aXJlcyBhICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IGJ1dCByZWNlaXZlZCBhICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0XCIpO31mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxcIit0aGlzLmQkcmVwcl9uYW1lK1wiICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzPlwiKX1jb25zdCBmPXtfX2RvY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJGRvYz9cbm5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkZGVmLiRkb2MpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19LF9fb2JqY2xhc3NfXzp7JGdldCgpe3JldHVybiB0aGlzLmQkdHlwZX19LF9fbmFtZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLmQkbmFtZSl9fX07bT17X190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuZCRkZWYuJHRleHRzaWc/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuZCRkZWYuJHRleHRzaWcpOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fTtTay5idWlsdGluLmdldHNldF9kZXNjcmlwdG9yPWEoXCJnZXRzZXRfZGVzY3JpcHRvclwiLHZvaWQgMCx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiKXt0aGlzLmQkZGVmPWI7dGhpcy4kZ2V0PWIuJGdldDt0aGlzLiRzZXQ9Yi4kc2V0O3RoaXMuZCR0eXBlPWE7dGhpcy5kJG5hbWU9Yi4kbmFtZX0sc2xvdHM6e3RwJGRlc2NyX2dldChhLGIpe2lmKGI9dGhpcy5kJGNoZWNrKGEpKXJldHVybiBiO1xuaWYodm9pZCAwIT09dGhpcy4kZ2V0KXJldHVybiB0aGlzLiRnZXQuY2FsbChhKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcImdldHNldF9kZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZVwiKTt9LHRwJGRlc2NyX3NldChhLGIpe3RoaXMuZCRzZXRfY2hlY2soYSk7aWYodm9pZCAwIT09dGhpcy4kc2V0KXJldHVybiB0aGlzLiRzZXQuY2FsbChhLGIpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwiYXR0cmlidXRlICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3RzIGlzIHJlYWRvbmx5XCIpO319fSk7U2suYnVpbHRpbi5tZXRob2RfZGVzY3JpcHRvcj1hKFwibWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9XG5iO3RoaXMuJG1ldGg9Yi4kbWV0aDt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWIuJG5hbWV8fFwiPG5hdGl2ZSBKUz5cIjt0aGlzLiRmbGFncz1hPWIuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGhvZEZhc3RDYWxsOmEuTm9BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTm9BcmdzOmEuT25lQXJnP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsT25lQXJnOmEuTmFtZWRBcmdzP3RoaXMudHAkY2FsbD10aGlzLiRtZXRob2RDYWxsTmFtZWRBcmdzOnZvaWQgMCE9PWEuTWluQXJncz90aGlzLnRwJGNhbGw9dGhpcy4kbWV0aG9kQ2FsbE1pbkFyZ3M6KHRoaXMuZnVuY19jb2RlPWIuJG1ldGgsdGhpcy50cCRjYWxsPXRoaXMuJGRlZmF1bHRDYWxsLHRoaXMuJG1lbW9pc2VGbGFncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MsXG50aGlzLiRyZXNvbHZlQXJncz1Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRyZXNvbHZlQXJncyl9LHNsb3RzOnt0cCRjYWxsKGEsYil7cmV0dXJuIHRoaXMudHAkY2FsbChhLGIpfSx0cCRkZXNjcl9nZXQoYSxiKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHRoaXMuZCRkZWYsYSl9fSxnZXRzZXRzOm0scHJvdG86eyRtZXRob2RGYXN0Q2FsbChhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7cmV0dXJuIHRoaXMuJG1ldGguY2FsbChjLGEsYil9LCRtZXRob2RGYXN0Q2FsbE5vS3dhcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYyxhKX0sJG1ldGhvZENhbGxOb0FyZ3MoYSxiKXtjb25zdCBjPWEuc2hpZnQoKTt0aGlzLm0kY2hlY2tzZWxmKGMpO1NrLmFic3RyLmNoZWNrTm9BcmdzKHRoaXMuZCRuYW1lLFxuYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMpfSwkbWV0aG9kQ2FsbE9uZUFyZyhhLGIpe2NvbnN0IGM9YS5zaGlmdCgpO3RoaXMubSRjaGVja3NlbGYoYyk7U2suYWJzdHIuY2hlY2tPbmVBcmcodGhpcy5kJG5hbWUsYSxiKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsYVswXSl9LCRtZXRob2RDYWxsTmFtZWRBcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTthPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKHRoaXMuZCRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGIsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoLmNhbGwoYywuLi5hKX0sJG1ldGhvZENhbGxNaW5BcmdzKGEsYil7Y29uc3QgYz1hLnNoaWZ0KCk7dGhpcy5tJGNoZWNrc2VsZihjKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuZCRuYW1lLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbih0aGlzLmQkbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsXG50aGlzLiRmbGFncy5NYXhBcmdzKTtyZXR1cm4gdGhpcy4kbWV0aC5jYWxsKGMsLi4uYSl9LCRkZWZhdWx0Q2FsbChhLGIpe3RoaXMubSRjaGVja3NlbGYoYVswXSk7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxiKX0sbSRjaGVja3NlbGYoYSl7aWYodm9pZCAwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7dGhpcy5kJGNoZWNrKGEpfX19KTtTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcj1hKFwid3JhcHBlcl9kZXNjcmlwdG9yXCIsXCJzbG90IHdyYXBwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuZCRkZWY9Yjt0aGlzLmQkdHlwZT1hO3RoaXMuZCRuYW1lPWMuJG5hbWU9Yi4kbmFtZTt0aGlzLmQkd3JhcHBlZD1jfSxzbG90czp7dHAkZGVzY3JfZ2V0KGEsXG5iKXtsZXQgYztyZXR1cm4oYz10aGlzLmQkY2hlY2soYSkpP2M6bmV3IFNrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXIodGhpcyxhKX0sdHAkY2FsbChhLGIpe2lmKDE+YS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mICdcIit0aGlzLmQkdHlwZS5wcm90b3R5cGUudHAkbmFtZStcIicgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XCIpO2NvbnN0IGM9YS5zaGlmdCgpO2lmKCFjLm9iJHR5cGUuJGlzU3ViVHlwZSh0aGlzLmQkdHlwZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZGVzY3JpcHRvciAnXCIrdGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJ1wiKTtyZXR1cm4gdGhpcy5yYXckY2FsbChjLGEsYil9fSxwcm90bzp7cmF3JGNhbGwoYSxiLGMpe3RoaXMuZCR3cmFwcGVkLiRuYW1lPVxudGhpcy5kJG5hbWU7cmV0dXJuIHRoaXMuZCRkZWYuJHdyYXBwZXIuY2FsbCh0aGlzLmQkd3JhcHBlZCxhLGIsYyl9fX0pO1NrLmJ1aWx0aW4ubWV0aG9kX3dyYXBwZXI9YShcIm1ldGhvZF93cmFwcGVyXCIsdm9pZCAwLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMubSRkZXNjcj1hO3RoaXMubSRzZWxmPWI7dGhpcy5kJGRlZj1hLmQkZGVmO3RoaXMuZCRuYW1lPWEuZCRuYW1lO3RoaXMuZCR0eXBlPWEuZCR0eXBlfSxzbG90czp7dHAkY2FsbChhLGIpe3JldHVybiB0aGlzLm0kZGVzY3IucmF3JGNhbGwodGhpcy5tJHNlbGYsYSxiKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZihcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1ifHwhKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLm1ldGhvZF93cmFwcGVyKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT10aGlzLm0kc2VsZj09PWEubSRzZWxmJiZ0aGlzLm0kZGVzY3I9PT1hLm0kZGVzY3I7cmV0dXJuXCJFcVwiPT09XG5iP2E6IWF9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIjxtZXRob2Qtd3JhcHBlciAnXCIrdGhpcy5kJG5hbWUrXCInIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMubSRzZWxmKStcIiBvYmplY3Q+XCIpfX0sZ2V0c2V0czp7X19zZWxmX186eyRnZXQoKXtyZXR1cm4gdGhpcy5tJHNlbGZ9fX19KTtTay5idWlsdGluLmNsYXNzbWV0aG9kX2Rlc2NyaXB0b3I9YShcImNsYXNzbWV0aG9kX2Rlc2NyaXB0b3JcIixcIm1ldGhvZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIpe3RoaXMuZCRkZWY9Yjt0aGlzLiRtZXRoPWIuJG1ldGg7dGhpcy5kJHR5cGU9YTt0aGlzLmQkbmFtZT1iLiRuYW1lfHxcIjxuYXRpdmUgSlM+XCJ9LHNsb3RzOnt0cCRjYWxsKGEsYil7aWYoMT5hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJkZXNjcmlwdG9yICdcIit0aGlzLmQkbmFtZStcIicgb2YgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcIik7XG5jb25zdCBjPWEuc2hpZnQoKTtyZXR1cm4gdGhpcy50cCRkZXNjcl9nZXQobnVsbCxjKS50cCRjYWxsKGEsYil9LHRwJGRlc2NyX2dldChhLGIsYyl7aWYodm9pZCAwPT09YilpZihudWxsIT09YSliPWJ8fGEub2IkdHlwZTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGFuIG9iamVjdCBvciBhIHR5cGVcIik7aWYoYi5vYiR0eXBlIT09U2suYnVpbHRpbi50eXBlKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK3RoaXMuZCRuYW1lK1wiJyBmb3IgdHlwZSAnXCIrdGhpcy5kJHR5cGUucHJvdG90eXBlLnRwJG5hbWUrXCInIG5lZWRzIGEgdHlwZSBub3QgYSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYikrXCInIGFzIGFyZyAyXCIpO2lmKCFiLiRpc1N1YlR5cGUodGhpcy5kJHR5cGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlc2NyaXB0b3IgJ1wiK1xudGhpcy5kJG5hbWUrXCInIHJlcXVpcmVzIGEgJ1wiK3RoaXMuZCR0eXBlLnByb3RvdHlwZS50cCRuYW1lK1wiJyBvYmplY3QgYnV0IHJlY2VpdmVkIGEgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGIpK1wiJyBvYmplY3RcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnNrX21ldGhvZCh0aGlzLmQkZGVmLGIpfX0sZ2V0c2V0czptfSk7W1NrLmJ1aWx0aW4ubWV0aG9kX2Rlc2NyaXB0b3IsU2suYnVpbHRpbi5nZXRzZXRfZGVzY3JpcHRvcixTay5idWlsdGluLndyYXBwZXJfZGVzY3JpcHRvcixTay5idWlsdGluLm1ldGhvZF93cmFwcGVyLFNrLmJ1aWx0aW4uY2xhc3NtZXRob2RfZGVzY3JpcHRvcl0uZm9yRWFjaChhPT57U2suYWJzdHIuc2V0VXBTbG90cyhhKTtTay5hYnN0ci5zZXRVcE1ldGhvZHMoYSk7U2suYWJzdHIuc2V0VXBHZXRTZXRzKGEpfSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5za19tZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3RoaXMuJG1ldGg9YS4kbWV0aC5iaW5kKGMpO3RoaXMuJGRvYz1hLiRkb2M7dGhpcy4kc2VsZj1jfHxudWxsO3RoaXMuJG1vZHVsZT1iP25ldyBTay5idWlsdGluLnN0cihiKTpudWxsO3RoaXMuJG5hbWU9YS4kbmFtZXx8YS4kbWV0aC5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy5tJGRlZj1hO3RoaXMuJHRleHRzaWc9YS4kdGV4dHNpZzt0aGlzLiRmbGFncz1hPWEuJGZsYWdzfHx7fTthLkZhc3RDYWxsJiZhLk5vS3dhcmdzP3RoaXMudHAkY2FsbD10aGlzLiRmYXN0Q2FsbE5vS3dhcmdzOmEuRmFzdENhbGw/dGhpcy50cCRjYWxsPXRoaXMuJG1ldGg6YS5Ob0FyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOb0FyZ3M6YS5PbmVBcmc/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxPbmVBcmc6YS5OYW1lZEFyZ3M/dGhpcy50cCRjYWxsPXRoaXMuJGNhbGxOYW1lZEFyZ3M6dm9pZCAwIT09YS5NaW5BcmdzP3RoaXMudHAkY2FsbD10aGlzLiRjYWxsTWluQXJnczpcbih0aGlzLmZ1bmNfY29kZT10aGlzLiRtZXRoLHRoaXMudHAkY2FsbD10aGlzLiRkZWZhdWx0Q2FsbE1ldGhvZCl9LHByb3RvOnskZmFzdENhbGxOb0t3YXJncyhhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3ModGhpcy4kbmFtZSxjKTtyZXR1cm4gdGhpcy4kbWV0aChhKX0sJGNhbGxOb0FyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vQXJncyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoKX0sJGNhbGxPbmVBcmcoYSxjKXtTay5hYnN0ci5jaGVja09uZUFyZyh0aGlzLiRuYW1lLGEsYyk7cmV0dXJuIHRoaXMuJG1ldGgoYVswXSl9LCRjYWxsTmFtZWRBcmdzKGEsYyl7YT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyh0aGlzLiRuYW1lLHRoaXMuJGZsYWdzLk5hbWVkQXJncyxhLGMsdGhpcy4kZmxhZ3MuRGVmYXVsdHMpO3JldHVybiB0aGlzLiRtZXRoKC4uLmEpfSwkY2FsbE1pbkFyZ3MoYSxjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKHRoaXMuJG5hbWUsYyk7XG5Tay5hYnN0ci5jaGVja0FyZ3NMZW4odGhpcy4kbmFtZSxhLHRoaXMuJGZsYWdzLk1pbkFyZ3MsdGhpcy4kZmxhZ3MuTWF4QXJncyk7cmV0dXJuIHRoaXMuJG1ldGgoLi4uYSl9LCRkZWZhdWx0Q2FsbE1ldGhvZChhLGMpe3JldHVybiBudWxsIT09dGhpcy4kc2VsZj9Tay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuY2FsbCh0aGlzLFt0aGlzLiRzZWxmLC4uLmFdLGMpOlNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUudHAkY2FsbC5jYWxsKHRoaXMsYSxjKX0sJG1lbW9pc2VGbGFncygpe3JldHVybiBTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLiRtZW1vaXNlRmxhZ3MuY2FsbCh0aGlzKX0sJHJlc29sdmVBcmdzKCl7cmV0dXJuIFNrLmJ1aWx0aW4uZnVuYy5wcm90b3R5cGUuJHJlc29sdmVBcmdzLmNhbGwodGhpcyl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsJHIoKXtyZXR1cm4gbnVsbD09PVxudGhpcy4kc2VsZj9uZXcgU2suYnVpbHRpbi5zdHIoXCI8YnVpbHQtaW4gZnVuY3Rpb24gXCIrdGhpcy4kbmFtZStcIj5cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJ1aWx0LWluIG1ldGhvZCBcIit0aGlzLiRuYW1lK1wiIG9mIFwiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMuJHNlbGYpK1wiIG9iamVjdD5cIil9LHRwJGNhbGwoYSxjKXtyZXR1cm4gdGhpcy50cCRjYWxsKGEsYyl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT09YyYmXCJOb3RFcVwiIT09Y3x8IShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5za19tZXRob2QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPXRoaXMuJHNlbGY9PT1hLiRzZWxmJiZ0aGlzLm0kZGVmLiRtZXRoPT09YS5tJGRlZi4kbWV0aDtyZXR1cm5cIkVxXCI9PT1jP2E6IWF9fSxnZXRzZXRzOntfX21vZHVsZV9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJG1vZHVsZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSwkc2V0KGEpe3RoaXMuJG1vZHVsZT1cbmE9YXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLiRkb2M/bmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJGRvYyk6U2suYnVpbHRpbi5ub25lLm5vbmUkfX0sX19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfX0sX190ZXh0X3NpZ25hdHVyZV9fOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLiR0ZXh0c2lnKX19LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuJHNlbGZ8fFNrLnN5c01vZHVsZXMubXAkbG9va3VwKHRoaXMuJG1vZHVsZSl8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubm9uZT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm9uZVR5cGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSxzbG90czp7dHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0FyZ3MoXCJOb25lVHlwZVwiLFxuYSxjKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJOb25lXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkYm9vbCgpe3JldHVybiExfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLm5vbmUubm9uZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLm5vbmUucHJvdG90eXBlLHt2Ont2YWx1ZTpudWxsLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiTm90SW1wbGVtZW50ZWRcIil9LHRwJG5ldyhhLGMpe1NrLmFic3RyLmNoZWNrTm9BcmdzKFwiTm90SW1wbGVtZW50ZWRUeXBlXCIsXG5hLGMpO3JldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLk5vdEltcGxlbWVudGVkLnByb3RvdHlwZSx7djp7dmFsdWU6bnVsbCxlbnVtZXJhYmxlOiEwfX0pfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9L14oPzooLik/KFs8Pj1cXF5dKSk/KFtcXCtcXC1cXHNdKT8oIyk/KDApPyhcXGQrKT8oLCk/KD86XFwuKFxcZCspKT8oW2JjZGVFZkZnR25vc3hYJV0pPyQvO1NrLmZvcm1hdHRpbmc9e307bGV0IGM9ZnVuY3Rpb24oYSxiLGMsZSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBiKTtpZihhWzZdKXt2YXIgZD1wYXJzZUludChhWzZdLDEwKTtlPWFbMl18fChhWzVdP1wiPVwiOmU/XCI+XCI6XCI8XCIpO2xldCBmPWQtKGIubGVuZ3RoKyhjP2MubGVuZ3RoOjApKTtcbmlmKDA+PWYpcmV0dXJuIGI7ZD0oYVsxXXx8KGFbNV0/XCIwXCI6XCIgXCIpKS5yZXBlYXQoZik7c3dpdGNoKGUpe2Nhc2UgXCI9XCI6aWYoXCJzXCI9PT1hWzldKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCInPScgYWxpZ25tZW50IG5vdCBhbGxvd2VkIGluIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVyXCIpO3JldHVybiBjK2QrYjtjYXNlIFwiPlwiOnJldHVybiBkK2MrYjtjYXNlIFwiPFwiOnJldHVybiBjK2IrZDtjYXNlIFwiXlwiOnJldHVybiBhPU1hdGguZmxvb3IoZi8yKSxkLnN1YnN0cmluZygwLGEpK2MrYitkLnN1YnN0cmluZyhhKX19cmV0dXJuIGMrYn0sYj1mdW5jdGlvbihhLGIpe3JldHVybiBiP1wiLVwiOlwiK1wiPT09YVszXT9cIitcIjpcIiBcIj09PWFbM10/XCIgXCI6XCJcIn0sZT1mdW5jdGlvbihhLGUsZCl7U2suYXNzZXJ0cy5hc3NlcnQoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8ZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nKTtpZihhWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJQcmVjaXNpb24gbm90IGFsbG93ZWQgaW4gaW50ZWdlciBmb3JtYXRcIik7XG5sZXQgZj1lLnN0ciQoZCwhMSk7ZT1lLm5iJGlzbmVnYXRpdmUoKTtlPWIoYSxlKTthWzRdJiYoMTY9PT1kP2UrPVwiMHhcIjo4PT09ZD9lKz1cIjBvXCI6Mj09PWQmJihlKz1cIjBiXCIpKTtcIlhcIj09PWFbOV0mJihmPWYudG9VcHBlckNhc2UoKSk7XCJuXCI9PT1hWzldP2Y9KCtmKS50b0xvY2FsZVN0cmluZygpOmFbN10mJihkPWYudG9TdHJpbmcoKS5zcGxpdChcIi5cIiksZFswXT1kWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csXCIsXCIpLGY9ZC5qb2luKFwiLlwiKSk7cmV0dXJuIGMoYSxmLGUsITApfSxmPWZ1bmN0aW9uKGYsaCxkKXtpZighaClyZXR1cm4gZi5zdHIkKDEwLCEwKTtoPWgubWF0Y2goYSk7aWYoIWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkludmFsaWQgZm9ybWF0IHNwZWNpZmllclwiKTt2YXIgZz1oWzldO2d8fChnPWQ/XCJnXCI6XCJkXCIpO2lmKC0xPT0oZD9cImZGZUVnRyVcIjpcImJjZG94WG5mRmVFZ0clXCIpLmluZGV4T2YoZykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gZm9ybWF0IGNvZGUgJ1wiK1xuaFs5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7c3dpdGNoKGcpe2Nhc2UgXCJkXCI6Y2FzZSBcIm5cIjpyZXR1cm4gZShoLGYsMTApO2Nhc2UgXCJ4XCI6Y2FzZSBcIlhcIjpyZXR1cm4gZShoLGYsMTYpO2Nhc2UgXCJvXCI6cmV0dXJuIGUoaCxmLDgpO2Nhc2UgXCJiXCI6cmV0dXJuIGUoaCxmLDIpO2Nhc2UgXCJjXCI6aWYoaFszXSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiU2lnbiBub3QgYWxsb3dlZCB3aXRoIGludGVnZXIgZm9ybWF0IHNwZWNpZmllciAnYydcIik7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gbm90IGFsbG93ZWQgd2l0aCBpbnRlZ2VyIGZvcm1hdCBzcGVjaWZpZXIgJ2MnXCIpO2lmKGhbN10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5ICcsJyB3aXRoICdjJ1wiKTtpZihoWzhdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAnYydcIik7XG5yZXR1cm4gYyhoLFN0cmluZy5mcm9tQ29kZVBvaW50KFNrLmJ1aWx0aW4uYXNudW0kKGYpKSxcIlwiLCEwKTtjYXNlIFwiZlwiOmNhc2UgXCJGXCI6Y2FzZSBcImVcIjpjYXNlIFwiRVwiOmNhc2UgXCJnXCI6Y2FzZSBcIkdcIjp7aWYoaFs0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIGluIGZsb2F0IGZvcm1hdCBzcGVjaWZpZXJcIik7ZD1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGQmJihkPU51bWJlcihkKSk7aWYoSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIlwiLCEwKTtpZigtSW5maW5pdHk9PT1kKXJldHVybiBjKGgsXCJpbmZcIixcIi1cIiwhMCk7aWYoaXNOYU4oZCkpcmV0dXJuIGMoaCxcIm5hblwiLFwiXCIsITApO2Y9ITE7MD5kJiYoZD0tZCxmPSEwKTt2YXIgbD1bXCJ0b0V4cG9uZW50aWFsXCIsXCJ0b0ZpeGVkXCIsXCJ0b1ByZWNpc2lvblwiXVtcImVmZ1wiLmluZGV4T2YoZy50b0xvd2VyQ2FzZSgpKV07bGV0IGE9aFs4XT9cbnBhcnNlSW50KGhbOF0sMTApOjY7ZD1kW2xdKGEpOy0xIT09XCJFRkdcIi5pbmRleE9mKGcpJiYoZD1kLnRvVXBwZXJDYXNlKCkpO2lmKFwiZ1wiPT09Zy50b0xvd2VyQ2FzZSgpfHwhaFs5XSl7aWYobD1kLm1hdGNoKC9cXC4oXFxkKlsxLTldKT8oMCspJC8pKXtsZXQgWyxhLGJdPWw7ZD1kLnNsaWNlKDAsYT8tYi5sZW5ndGg6LShiLmxlbmd0aCsxKSl9LTEhPWQuaW5kZXhPZihcIi5cIil8fGhbOV18fChkKz1cIi4wXCIpfVwiZVwiPT09Zy50b0xvd2VyQ2FzZSgpJiYoZD1kLnJlcGxhY2UoL14oWy0rXT9bMC05XSpcXC4/WzAtOV0rW2VFXVstK10/KShbMC05XSk/JC8sXCIkMTAkMlwiKSk7aFs3XSYmKGc9ZC50b1N0cmluZygpLnNwbGl0KFwiLlwiKSxnWzBdPWdbMF0ucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZyxcIixcIiksZD1nLmpvaW4oXCIuXCIpKTtyZXR1cm4gYyhoLGQsYihoLGYpLCEwKX1jYXNlIFwiJVwiOmlmKGhbNF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCB3aXRoIGZvcm1hdCBzcGVjaWZpZXIgJyUnXCIpO1xuZj1Tay5idWlsdGluLmFzbnVtJChmKTtcInN0cmluZ1wiPT09dHlwZW9mIGYmJihmPU51bWJlcihmKSk7aWYoSW5maW5pdHk9PT1mKXJldHVybiBjKGgsXCJpbmYlXCIsXCJcIiwhMCk7aWYoLUluZmluaXR5PT09ZilyZXR1cm4gYyhoLFwiaW5mJVwiLFwiLVwiLCEwKTtpZihpc05hTihmKSlyZXR1cm4gYyhoLFwibmFuJVwiLFwiXCIsITApO2c9ITE7MD5mJiYoZj0tZixnPSEwKTtkPWhbOF0/cGFyc2VJbnQoaFs4XSwxMCk6NjtmPSgxMDAqZikudG9GaXhlZChkKStcIiVcIjtyZXR1cm4gYyhoLGYsYihoLGcpLCEwKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJVbmtub3duIGZvcm1hdCBjb2RlICdcIitoWzldK1wiJ1wiKTt9fTtTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXz1hPT5mdW5jdGlvbihiKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmb3JtYXQoKSBhcmd1bWVudCAyIG11c3QgYmUgc3RyLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShiKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihmKHRoaXMsYi4kanNzdHIoKSxhKSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0PWZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtjb25zdCBjPXt9O2ZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9MiljW2JbYV1dPWJbYSsxXTtmb3IobGV0IGIgaW4gYSljW2JdPWFbYl07bGV0IGU9MDthPXRoaXMudi5yZXBsYWNlKC97KCgoPzpcXGQrKXwoPzpcXHcrKSk/KCg/OlxcLihcXHcrKSl8KD86XFxbKCg/OlxcZCspfCg/OlxcdyspKVxcXSk/KSk/KD86IShbcnNdKSk/KD86OihbXn1dKikpP30vZyxmdW5jdGlvbihhLGIsZCxmLGcsaCxsLEIsRCxtKXtsZXQgaztpZih2b2lkIDAhPT1oJiZcIlwiIT09aClhPWNbZF0saz1hLmNvbnN0cnVjdG9yPT09QXJyYXk/YVtoXTovXlxcZCskLy50ZXN0KGgpP1NrLmFic3RyLm9iamVjdEdldEl0ZW0oYSxuZXcgU2suYnVpbHRpbi5pbnRfKHBhcnNlSW50KGgsMTApKSwhMSk6U2suYWJzdHIub2JqZWN0R2V0SXRlbShhLFxubmV3IFNrLmJ1aWx0aW4uc3RyKGgpLCExKSxlKys7ZWxzZSBpZih2b2lkIDAhPT1nJiZcIlwiIT09ZylrPVNrLmFic3RyLmdhdHRyKGNbZHx8ZSsrXSxuZXcgU2suYnVpbHRpbi5zdHIoZykpO2Vsc2UgaWYodm9pZCAwIT09ZCYmXCJcIiE9PWQpaz1jW2RdO2Vsc2UgaWYodm9pZCAwPT09Ynx8XCJcIj09PWIpaz1jW2VdLGUrKztlbHNlIGlmKGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGIgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0X3x8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHwvXlxcZCskLy50ZXN0KGIpKWs9Y1tiXSxlKys7aWYoXCJzXCI9PT1sKWs9bmV3IFNrLmJ1aWx0aW4uc3RyKGspO2Vsc2UgaWYoXCJyXCI9PT1sKWs9U2suYnVpbHRpbi5yZXByKGspO2Vsc2UgaWYoXCJcIiE9PWwmJnZvaWQgMCE9PWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgXCIrbCk7cmV0dXJuIFNrLmFic3RyLm9iamVjdEZvcm1hdChrLFxubmV3IFNrLmJ1aWx0aW4uc3RyKEIpKS4kanNzdHIoKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9O1NrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nPWZ1bmN0aW9uKGIpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZvcm1hdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7Yj1iLiRqc3N0cigpLm1hdGNoKGEpO2lmKGJbOV0mJlwic1wiIT09Yls5XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiVW5rbm93biBmb3JtYXQgY29kZSAnXCIrYls5XStcIicgZm9yIG9iamVjdCBvZiB0eXBlICdzdHInXCIpO2lmKGJbM10pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIlNpZ24gbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7aWYoYls0XSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQWx0ZXJuYXRlIGZvcm0gKCMpIG5vdCBhbGxvd2VkIHdpdGggc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJcIik7XG5pZihiWzddKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSAnLCcgd2l0aCAncydcIik7bGV0IGU9dGhpcy52O2JbOF0mJihlPWUuc3Vic3RyaW5nKDAsYls4XSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyhiLGUsXCJcIiwhMSkpfX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiO2NvbnN0IGM9W107Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspYj1hLmNoYXJBdChkKSxrLnRlc3QoYik/Yy5wdXNoKGIpOlwiXFxcXDAwMFwiPT09Yj9jLnB1c2goXCJcXFxcMDAwXCIpOmMucHVzaChcIlxcXFxcIitiKTtyZXR1cm4gYy5qb2luKFwiXCIpfWZ1bmN0aW9uIGMoYSxiLGMpe2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDphLmdldCR0Z3QoYik7aWYobnVsbCE9PWImJiFiLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO2E9YS52O3ZhciBkPTA7aWYobnVsbD09PWIpe3ZhciBlPS9bXFxzXFx4YTBdKy9nO1xuZD1hLmxlbmd0aDthPWEucmVwbGFjZSh1LFwiXCIpO2QtPWEubGVuZ3RofWVsc2UgZT1iLnJlcGxhY2UocCxcIlxcXFwkMVwiKSxlPW5ldyBSZWdFeHAoZSxcImdcIik7Y29uc3QgZj1bXTtsZXQgZz0wLGs9MCxoO2ZvcihjPTA+Yz9JbmZpbml0eTpjO251bGwhPShoPWUuZXhlYyhhKSkmJms8YyYmaC5pbmRleCE9PWUubGFzdEluZGV4OylmLnB1c2goZytkKSxmLnB1c2goaC5pbmRleCtkKSxnPWUubGFzdEluZGV4LGsrPTE7aWYobnVsbCE9PWJ8fGEubGVuZ3RoLWcpZi5wdXNoKGcrZCksZi5wdXNoKGEubGVuZ3RoK2QpO3JldHVybiBmfWZ1bmN0aW9uIGIoYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7aWYodm9pZCAwPT09ZHx8U2suYnVpbHRpbi5jaGVja05vbmUoZCkpZD1iO2Vsc2UgaWYoZCBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKWQ9YShkLnYpLGQ9bmV3IFJlZ0V4cChjKGQpLFwiZ1wiKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInN0cmlwIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShkLFwiXCIpKX19ZnVuY3Rpb24gZShhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCR0Z3QoYik7Y29uc3QgYz10aGlzLnY7bGV0IGQ7aWYoYSl7aWYoZD1jLmxhc3RJbmRleE9mKGIpLDA+ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLnN0cihcIlwiKSxuZXcgU2suYnVpbHRpbi5zdHIoXCJcIiksbmV3IFNrLmJ1aWx0aW4uc3RyKGMpXSl9ZWxzZSBpZihkPWMuaW5kZXhPZihiKSwwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYyksbmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpLG5ldyBTay5idWlsdGluLnN0cihcIlwiKV0pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uc3RyKGMuc3Vic3RyaW5nKDAsZCkpLG5ldyBTay5idWlsdGluLnN0cihiKSxuZXcgU2suYnVpbHRpbi5zdHIoYy5zdWJzdHJpbmcoZCtiLmxlbmd0aCkpXSl9fVxuZnVuY3Rpb24gZihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQpe2M9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGMsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZih2b2lkIDA9PT1kKWQ9XCIgXCI7ZWxzZSBpZihkIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHImJjE9PT1kLnNxJGxlbmd0aCgpKWQ9ZC52O2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSBzdHIgb2YgbGVuZ3RoIDFcIik7Y29uc3QgZT10aGlzLnNxJGxlbmd0aCgpO2xldCBmO2lmKGU+PWMpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYpO2lmKGIpcmV0dXJuIGY9ZC5yZXBlYXQoTWF0aC5mbG9vcigoYy1lKS8yKSksZj1mK3RoaXMuditmLChjLWUpJTImJihmKz1kKSxuZXcgU2suYnVpbHRpbi5zdHIoZik7Zj1kLnJlcGVhdChjLWUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYT9mK3RoaXMudjp0aGlzLnYrZil9fWZ1bmN0aW9uIGwoYSxcbmIsYyl7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydChhLGIsYykpO2lmKGEuJGhhc0FzdHJhbENvZGVQb2ludHMoKSl7Y29uc3QgZD1hLmNvZGVwb2ludHNbYl07Yj12b2lkIDA9PT1kP2IrYS52Lmxlbmd0aC1hLmNvZGVwb2ludHMubGVuZ3RoOmQ7Yz1hLmNvZGVwb2ludHNbY107Yz12b2lkIDA9PT1jP2Eudi5sZW5ndGg6Y31yZXR1cm57c3RhcnQ6YixlbmQ6Y319ZnVuY3Rpb24gaChhKXtyZXR1cm4gZnVuY3Rpb24oYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpOyh7c3RhcnQ6YyxlbmQ6ZH09bCh0aGlzLGMsZCkpO2lmKGQ8YylyZXR1cm4tMTtkLT1iLmxlbmd0aDtiPWE/dGhpcy52Lmxhc3RJbmRleE9mKGIsZCk6dGhpcy52LmluZGV4T2YoYixjKTtiPWI+PWMmJmI8PWQ/YjotMTtpZih0aGlzLmNvZGVwb2ludHMpe2Q9dGhpcy5zcSRsZW5ndGgoKTtjPS0xO2ZvcihsZXQgYT0wO2E8ZDthKyspYj09dGhpcy5jb2RlcG9pbnRzW2FdJiYoYz1hKX1lbHNlIGM9XG5iO3JldHVybiBjfX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciBhIHR1cGxlIG9mIHN0ciwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTsoe3N0YXJ0OmQsZW5kOmV9PWwodGhpcyxkLGUpKTtpZihkPmUpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc2xpY2UoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYyksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSl7aWYoIShmIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGZvciBcIithK1wiIG11c3Qgb25seSBjb250YWluIHN0ciwgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoZikpO2lmKGIoZCxmLnYpKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSR9cmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYihkLGMudikpfX12YXIgZz0vXlswLTkhI19dLyxuPU9iamVjdC5jcmVhdGUobnVsbCk7U2suYnVpbHRpbi5zdHI9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInN0clwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIsXCJiYWQgY2FsbCB0byBzdHIgLSB1c2UgJ25ldydcIik7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhKWlmKHZvaWQgMD09PWEpYT1cIlwiO2Vsc2UgaWYobnVsbD09PWEpYT1cIk5vbmVcIjtlbHNle2lmKHZvaWQgMCE9PWEudHAkc3RyKXJldHVybiBhLnRwJHN0cigpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSlhPU51bWJlci5pc0Zpbml0ZShhKT9TdHJpbmcoYSk6U3RyaW5nKGEpLnJlcGxhY2UoXCJJbmZpbml0eVwiLFxuXCJpbmZcIikucmVwbGFjZShcIk5hTlwiLFwibmFuXCIpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyB0byBzdHJcIik7fXZhciBiPW5bYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtuW2FdPXRoaXM7Yj12b2lkIDA9PT10W2FdP2E6YStcIl8kcnckXCI7dGhpcy4kbWFuZ2xlZD1iO3RoaXMuJHNhdmVkS2V5SGFzaD1hLnJlcGxhY2UoZyxcIiEkJlwiKTt0aGlzLnY9YX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkZG9jOlwic3RyKG9iamVjdD0nJykgLT4gc3RyXFxuc3RyKGJ5dGVzX29yX2J1ZmZlclssIGVuY29kaW5nWywgZXJyb3JzXV0pIC0+IHN0clxcblxcbkNyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGZyb20gdGhlIGdpdmVuIG9iamVjdC4gSWYgZW5jb2Rpbmcgb3JcXG5lcnJvcnMgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBvYmplY3QgbXVzdCBleHBvc2UgYSBkYXRhIGJ1ZmZlclxcbnRoYXQgd2lsbCBiZSBkZWNvZGVkIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgZXJyb3IgaGFuZGxlci5cXG5PdGhlcndpc2UsIHJldHVybnMgdGhlIHJlc3VsdCBvZiBvYmplY3QuX19zdHJfXygpIChpZiBkZWZpbmVkKVxcbm9yIHJlcHIob2JqZWN0KS5cXG5lbmNvZGluZyBkZWZhdWx0cyB0byBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkuXFxuZXJyb3JzIGRlZmF1bHRzIHRvICdzdHJpY3QnLlwiLFxudHAkbmV3KGEsYil7Yj1ifHxbXTtpZih0aGlzIT09U2suYnVpbHRpbi5zdHIucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGIpO2lmKDE+PWEubGVuZ3RoJiYhYi5sZW5ndGgpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhWzBdKTtpZihTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2NvbnN0IFtjLGQsZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJzdHJcIixbXCJvYmplY3RcIixcImVuY29kaW5nXCIsXCJlcnJvcnNcIl0sYSxiKTtpZih2b2lkIDA9PT1jfHx2b2lkIDA9PT1kJiZ2b2lkIDA9PT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYyk7U2suYnVpbHRpbi5ieXRlcy5jaGVjayRlbmNvZGVBcmdzKFwic3RyXCIsZCxlKTtpZighU2suYnVpbHRpbi5jaGVja0J5dGVzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImRlY29kaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCBcIitTay5hYnN0ci50eXBlTmFtZShjKStcIiBmb3VuZFwiKTtcbnJldHVybiBTay5idWlsdGluLmJ5dGVzLiRkZWNvZGUuY2FsbChjLGQsZSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3RyIHRha2VzIGF0IG1vc3Qgb25lIGFyZ3VtZW50IChcIisoYS5sZW5ndGgrYi5sZW5ndGgpK1wiIGdpdmVuKVwiKTt9LCRyKCl7bGV0IGE9XCInXCI7LTEhPT10aGlzLnYuaW5kZXhPZihcIidcIikmJi0xPT09dGhpcy52LmluZGV4T2YoJ1wiJykmJihhPSdcIicpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtsZXQgYz1hO2ZvcihsZXQgZj0wO2Y8YjtmKyspe3ZhciBkPXRoaXMudi5jaGFyQXQoZik7dmFyIGU9dGhpcy52LmNoYXJDb2RlQXQoZik7ZD09PWF8fFwiXFxcXFwiPT09ZD9jKz1cIlxcXFxcIitkOlwiXFx0XCI9PT1kP2MrPVwiXFxcXHRcIjpcIlxcblwiPT09ZD9jKz1cIlxcXFxuXCI6XCJcXHJcIj09PWQ/Yys9XCJcXFxcclwiOigyNTU8ZSYmNTUyOTY+ZXx8NTczNDQ8PWUpJiYhU2suX19mdXR1cmVfXy5weXRob24zP2MrPVwiXFxcXHVcIisoXCIwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1lJiZcbiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9dGhpcy52LmNvZGVQb2ludEF0KGYpLGYrKyxkPWQudG9TdHJpbmcoMTYpLGU9XCIwMDAwMDAwXCIrZC50b1N0cmluZygxNiksYz00PGQubGVuZ3RoP2MrKFwiXFxcXFVcIitlLnNsaWNlKC04KSk6YysoXCJcXFxcdVwiK2Uuc2xpY2UoLTQpKSk6MjU1PGUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yys9XCJcXFxcdWZmZmRcIjpcIiBcIj5kfHwxMjc8PWUmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjM/KGQ9ZC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSwyPmQubGVuZ3RoJiYoZD1cIjBcIitkKSxjKz1cIlxcXFx4XCIrZCk6Yys9ZH1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMrYSl9LHRwJHN0cigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5zdHI/dGhpczpuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52KX0sdHAkaXRlcigpe3JldHVybiBuZXcgQSh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO1xuc3dpdGNoKGIpe2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLnY8YS52O2Nhc2UgXCJMdEVcIjpyZXR1cm4gdGhpcy52PD1hLnY7Y2FzZSBcIkVxXCI6cmV0dXJuIHRoaXMudj09PWEudjtjYXNlIFwiTm90RXFcIjpyZXR1cm4gdGhpcy52IT09YS52O2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLnY+YS52O2Nhc2UgXCJHdEVcIjpyZXR1cm4gdGhpcy52Pj1hLnZ9fSxtcCRzdWJzY3JpcHQoYSl7bGV0IGI7aWYoU2subWlzY2V2YWwuaXNJbmRleChhKSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9dGhpcy5zcSRsZW5ndGgoKTswPmEmJihhKz1iKTtpZigwPmF8fGE+PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2VcIik7cmV0dXJuIHRoaXMuY29kZXBvaW50cz9uZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pKTpcbm5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuY2hhckF0KGEpKX1pZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7bGV0IGM9XCJcIjtiPXRoaXMuc3EkbGVuZ3RoKCk7dGhpcy5jb2RlcG9pbnRzP2Euc3NzaXRlciQoYixhPT57Yys9dGhpcy52LnN1YnN0cmluZyh0aGlzLmNvZGVwb2ludHNbYV0sdGhpcy5jb2RlcG9pbnRzW2ErMV0pfSk6YS5zc3NpdGVyJChiLGE9PntjKz10aGlzLnYuY2hhckF0KGEpfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihjKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMuJGhhc0FzdHJhbENvZGVQb2ludHMoKT90aGlzLmNvZGVwb2ludHMubGVuZ3RoOnRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnN0cikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0c1wiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudithLnYpfSxzcSRyZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGEqdGhpcy52Lmxlbmd0aD5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2xldCBiPVwiXCI7Zm9yKGxldCBjPTA7YzxhO2MrKyliKz10aGlzLnY7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0sc3EkY29udGFpbnMoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdHIpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7cmV0dXJuLTEhPT10aGlzLnYuaW5kZXhPZihhLnYpfSx0cCRhc19udW1iZXI6ITAsbmIkcmVtYWluZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2NvbnN0IGM9dGhpcy5zayRidWlsdGluQmFzZTthLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi50dXBsZXx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5fHwoYT1uZXcgU2suYnVpbHRpbi50dXBsZShbYV0pKTt2YXIgZD0wO3ZhciBlPXRoaXMuJGpzc3RyKCkucmVwbGFjZSgvJShcXChbYS16QS1aMC05XStcXCkpPyhbIzAgK1xcLV0rKT8oXFwqfFswLTldKyk/KFxcLihcXCp8WzAtOV0rKSk/W2hsTF0/KFtkaW91eFhlRWZGZ0djcnNiJV0pL2csZnVuY3Rpb24oZSxmLGcsayxoLGwscCl7dmFyIG4sQixBLHYsTDtrPVNrLmJ1aWx0aW4uYXNudW0kKGspO2g9U2suYnVpbHRpbi5hc251bSQoaCk7dm9pZCAwIT09ZiYmXCJcIiE9PWZ8fFwiJVwiPT1wfHwobj1cbmQrKyk7XCJcIj09PWgmJihoPXZvaWQgMCk7dmFyIHQ9Qj1BPXY9TD0hMTtnJiYoLTEhPT1nLmluZGV4T2YoXCItXCIpP3Y9ITA6LTEhPT1nLmluZGV4T2YoXCIwXCIpJiYoTD0hMCksLTEhPT1nLmluZGV4T2YoXCIrXCIpP0I9ITA6LTEhPT1nLmluZGV4T2YoXCIgXCIpJiYoQT0hMCksdD0tMSE9PWcuaW5kZXhPZihcIiNcIikpO2gmJihoPXBhcnNlSW50KGguc3Vic3RyKDEpLDEwKSk7Zz1mdW5jdGlvbihhLGIpe3ZhciBjO2I9U2suYnVpbHRpbi5hc251bSQoYik7dmFyIGQ9ITE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXswPmEmJihhPS1hLGQ9ITApO3ZhciBlPWEudG9TdHJpbmcoYil9ZWxzZSBhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/KGU9YS5zdHIkKGIsITEpLDI8ZS5sZW5ndGgmJlwiLjBcIj09PWUuc3Vic3RyKC0yKSYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC0yKSksZD1hLm5iJGlzbmVnYXRpdmUoKSk6YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xz8oZT1hLnN0ciQoYiwhMSksZD1cbmEubmIkaXNuZWdhdGl2ZSgpKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmcmJihlPWEuc3RyJChiLCExKSxkPWEubmIkaXNuZWdhdGl2ZSgpKTtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1lLFwidW5oYW5kbGVkIG51bWJlciBmb3JtYXRcIik7YT0hMTtpZihoKWZvcihjPWUubGVuZ3RoO2M8aDsrK2MpZT1cIjBcIitlLGE9ITA7Yz1cIlwiO2Q/Yz1cIi1cIjpCP2M9XCIrXCIrYzpBJiYoYz1cIiBcIitjKTt0JiYoMTY9PT1iP2MrPVwiMHhcIjo4IT09Ynx8YXx8XCIwXCI9PT1lfHwoYys9XCIwXCIpKTtyZXR1cm5bYyxlXX07ZT1mdW5jdGlvbihhKXt2YXIgYj1hWzBdO2E9YVsxXTtpZihrKXtrPXBhcnNlSW50KGssMTApO3ZhciBjPWEubGVuZ3RoK2IubGVuZ3RoO2lmKEwpZm9yKDtjPGs7KytjKWE9XCIwXCIrYTtlbHNlIGlmKHYpe2Zvcig7YzxrOysrYylhKz1cIiBcIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJihhKz1iLGI9XCJcIil9ZWxzZSBmb3IoO2M8azsrK2MpYj1cIiBcIitifXJldHVybiBiK2F9O2lmKGEuY29uc3RydWN0b3I9PT1cblNrLmJ1aWx0aW4udHVwbGUpZj1hLnZbbl07ZWxzZSBpZih2b2lkIDAhPT1hLm1wJHN1YnNjcmlwdCYmdm9pZCAwIT09ZilmPWYuc3Vic3RyaW5nKDEsZi5sZW5ndGgtMSksZj1hLm1wJHN1YnNjcmlwdChuZXcgYyhmKSk7ZWxzZSBpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5kaWN0fHxhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5saXN0KWY9YTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEudHAkbmFtZStcIiBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdtcCRzdWJzY3JpcHQnXCIpO2lmKFwiZFwiPT09cHx8XCJpXCI9PT1wKXt2YXIgdT1nKGYsMTApO2lmKHZvaWQgMD09PXVbMV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJVwiK3ArXCIgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGYpKTtwPXVbMV07dVsxXT0tMSE9PXAuaW5kZXhPZihcIi5cIik/cGFyc2VJbnQocCwxMCkudG9TdHJpbmcoKTpcbnA7cmV0dXJuIGUodSl9aWYoXCJvXCI9PT1wKXJldHVybiBlKGcoZiw4KSk7aWYoXCJ4XCI9PT1wKXJldHVybiBlKGcoZiwxNikpO2lmKFwiWFwiPT09cClyZXR1cm4gZShnKGYsMTYpKS50b1VwcGVyQ2FzZSgpO2lmKFwiZlwiPT09cHx8XCJGXCI9PT1wfHxcImVcIj09PXB8fFwiRVwiPT09cHx8XCJnXCI9PT1wfHxcIkdcIj09PXApe3U9U2suYnVpbHRpbi5hc251bSQoZik7XCJzdHJpbmdcIj09PXR5cGVvZiB1JiYodT1OdW1iZXIodSkpO2lmKEluZmluaXR5PT09dSlyZXR1cm5cImluZlwiO2lmKC1JbmZpbml0eT09PXUpcmV0dXJuXCItaW5mXCI7aWYoaXNOYU4odSkpcmV0dXJuXCJuYW5cIjtuPVtcInRvRXhwb25lbnRpYWxcIixcInRvRml4ZWRcIixcInRvUHJlY2lzaW9uXCJdW1wiZWZnXCIuaW5kZXhPZihwLnRvTG93ZXJDYXNlKCkpXTtpZih2b2lkIDA9PT1ofHxcIlwiPT09aClpZihcImVcIj09PXB8fFwiRVwiPT09cCloPTY7ZWxzZSBpZihcImZcIj09PXB8fFwiRlwiPT09cCloPVNrLl9fZnV0dXJlX18ucHl0aG9uMz82Ojc7bj11W25dKGgpO1NrLmJ1aWx0aW4uY2hlY2tGbG9hdChmKSYmXG4wPT09dSYmLUluZmluaXR5PT09MS91JiYobj1cIi1cIituKTtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJig3PD1uLmxlbmd0aCYmXCIwLjAwMDBcIj09bi5zbGljZSgwLDYpJiYoYj1wYXJzZUZsb2F0KG4pLG49Yi50b0V4cG9uZW50aWFsKCkpLFwiLVwiPT1uLmNoYXJBdChuLmxlbmd0aC0yKSYmKG49bi5zbGljZSgwLG4ubGVuZ3RoLTEpK1wiMFwiK24uY2hhckF0KG4ubGVuZ3RoLTEpKSk7LTEhPT1cIkVGR1wiLmluZGV4T2YocCkmJihuPW4udG9VcHBlckNhc2UoKSk7cmV0dXJuIGUoW1wiXCIsbl0pfWlmKFwiY1wiPT09cCl7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF98fGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmZsb2F0XylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnYpO2lmKGYgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShmLnN0ciQoMTAsXG4hMSlbMF0pO2lmKGYuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnN0cilyZXR1cm4gZi52LnN1YnN0cigwLDEpO3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7fWlmKFwiclwiPT09cClyZXR1cm4gcD1Tay5idWlsdGluLnJlcHIoZiksaD9wLnYuc3Vic3RyKDAsaCk6cC52O2lmKFwic1wiPT09cCYmYz09PVNrLmJ1aWx0aW4uc3RyKXtwPW5ldyBTay5idWlsdGluLnN0cihmKTtwPXAuJGpzc3RyKCk7aWYoaClyZXR1cm4gcC5zdWJzdHIoMCxoKTtrJiYocD1lKFtcIiBcIixwXSkpO3JldHVybiBwfWlmKFwiYlwiPT09cHx8XCJzXCI9PT1wKXtpZihjPT09U2suYnVpbHRpbi5zdHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJ2InXCIpO2lmKCEoZiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpJiZ2b2lkIDA9PT0odT1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJGJ5dGVzKSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJWIgcmVxdWlyZXMgYSBieXRlcy1saWtlIG9iamVjdCwgb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBfX2J5dGVzX18sIG5vdCAnXCIrXG5Tay5hYnN0ci50eXBlTmFtZShmKStcIidcIik7dm9pZCAwIT09dSYmKGY9bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoZikpO3A9Zi4kanNzdHIoKTtpZihoKXJldHVybiBwLnN1YnN0cigwLGgpO2smJihwPWUoW1wiIFwiLHBdKSk7cmV0dXJuIHB9aWYoXCIlXCI9PT1wKXJldHVyblwiJVwifSk7cmV0dXJuIG5ldyBjKGUpfX0scHJvdG86e3RvU3RyaW5nKCl7cmV0dXJuIHRoaXMudn0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uc3RyLnByb3RvdHlwZS50cCRuZXcoYSxiKTtjLiRtYW5nbGVkPWEuJG1hbmdsZWQ7Yy4kc2F2ZWRLZXlIYXNoPWEuJHNhdmVkS2V5SGFzaDtjLnY9YS52O3JldHVybiBjfSwkanNzdHIoKXtyZXR1cm4gdGhpcy52fSwkaGFzQXN0cmFsQ29kZVBvaW50cygpe2lmKG51bGw9PT10aGlzLmNvZGVwb2ludHMpcmV0dXJuITE7aWYodm9pZCAwIT09dGhpcy5jb2RlcG9pbnRzKXJldHVybiEwO2Zvcih2YXIgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspe2xldCBiPVxudGhpcy52LmNoYXJDb2RlQXQoYSk7aWYoNTUyOTY8PWImJjU3MzQ0PmIpe3RoaXMuY29kZXBvaW50cz1bXTtmb3IoYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspdGhpcy5jb2RlcG9pbnRzLnB1c2goYSksYj10aGlzLnYuY2hhckNvZGVBdChhKSw1NTI5Njw9YiYmNTYzMjA+YiYmYSsrO3JldHVybiEwfX10aGlzLmNvZGVwb2ludHM9bnVsbDtyZXR1cm4hMX0sc2skYXNhcnJheSgpe2NvbnN0IGE9W107aWYodGhpcy4kaGFzQXN0cmFsQ29kZVBvaW50cygpKXt2YXIgYj10aGlzLmNvZGVwb2ludHM7Zm9yKGxldCBjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYuc3Vic3RyaW5nKGJbY10sYltjKzFdKSkpfWVsc2UgZm9yKGI9MDtiPHRoaXMudi5sZW5ndGg7YisrKWEucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52W2JdKSk7cmV0dXJuIGF9LGZpbmQkbGVmdDpoKCExKSxmaW5kJHJpZ2h0OmgoITApLGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0cilyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgc3RyIGluc3RhbmNlIGlzIHJlcXVpcmVkIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO319LG1ldGhvZHM6e2VuY29kZTp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe2VuY29kaW5nOmEsZXJyb3JzOmJ9PVNrLmJ1aWx0aW4uYnl0ZXMuY2hlY2skZW5jb2RlQXJncyhcImVuY29kZVwiLGEsYikpO2E9U2suYnVpbHRpbi5ieXRlcy5zdHIkZW5jb2RlKHRoaXMsYSxiKTtyZXR1cm4gU2suX19mdXR1cmVfXy5weXRob24zP2E6bmV3IFNrLmJ1aWx0aW4uc3RyKGEuJGpzc3RyKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJlbmNvZGluZ1wiLFwiZXJyb3JzXCJdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdzdHJpY3QnKVwiLCRkb2M6XCJFbmNvZGUgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2RpbmcgaW4gd2hpY2ggdG8gZW5jb2RlIHRoZSBzdHJpbmcuXFxuICBlcnJvcnNcXG4gICAgVGhlIGVycm9yIGhhbmRsaW5nIHNjaGVtZSB0byB1c2UgZm9yIGVuY29kaW5nIGVycm9ycy5cXG4gICAgVGhlIGRlZmF1bHQgaXMgJ3N0cmljdCcgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXFxuICAgIFVuaWNvZGVFbmNvZGVFcnJvci4gIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgJ2lnbm9yZScsICdyZXBsYWNlJyBhbmRcXG4gICAgJ3htbGNoYXJyZWZyZXBsYWNlJyBhcyB3ZWxsIGFzIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgd2l0aFxcbiAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IgdGhhdCBjYW4gaGFuZGxlIFVuaWNvZGVFbmNvZGVFcnJvcnMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYixjLGQpe2I9dGhpcy5nZXQkdGd0KGIpO2M9dGhpcy5nZXQkdGd0KGMpO2Q9dm9pZCAwPT09ZD8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2I9bmV3IFJlZ0V4cChhKGIpLFwiZ1wiKTtpZigwPmQpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYucmVwbGFjZShiLGMpKTtsZXQgZT0wO2I9dGhpcy52LnJlcGxhY2UoYixhPT5lKys8ZD9jOmEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYil9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5zcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSxiKTtiPVtdO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cmluZyhhW2NdLGFbKytjXSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wic2VwXCIsXCJtYXhzcGxpdFwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLC0xXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcIiwkZG9jOlwiUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgc2VwIGFzIHRoZSBkZWxpbWl0ZXIgc3RyaW5nLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBzdHJpbmcuXFxuICAgIE5vbmUgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBzcGxpdCBhY2NvcmRpbmcgdG8gYW55IHdoaXRlc3BhY2UsXFxuICAgIGFuZCBkaXNjYXJkIGVtcHR5IHN0cmluZ3MgZnJvbSB0aGUgcmVzdWx0LlxcbiAgbWF4c3BsaXRcXG4gICAgTWF4aW11bSBudW1iZXIgb2Ygc3BsaXRzIHRvIGRvLlxcbiAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIG5vIGxpbWl0LlwifSxcbnJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXtiPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChiLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT1jKHRoaXMsYSwtMSk7dmFyIGQ9MD5iPzA6MiooYS5sZW5ndGgvMi1iKTtiPVtdO2ZvcigwPj1kP2Q9MDpiLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zbGljZSgwLGFbZC0xXSkpKTtkPGEubGVuZ3RoO2QrKyliLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5zdWJzdHJpbmcoYVtkXSxhWysrZF0pKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LCRmbGFnczp7TmFtZWRBcmdzOltcInNlcFwiLFwibWF4c3BsaXRcIl0sRGVmYXVsdHM6W1NrLmJ1aWx0aW4ubm9uZS5ub25lJCwtMV19LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyIHN0cmluZy5cXG5cXG4gIHNlcFxcbiAgICBUaGUgZGVsaW1pdGVyIGFjY29yZGluZyB3aGljaCB0byBzcGxpdCB0aGUgc3RyaW5nLlxcbiAgICBOb25lICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgc3BsaXQgYWNjb3JkaW5nIHRvIGFueSB3aGl0ZXNwYWNlLFxcbiAgICBhbmQgZGlzY2FyZCBlbXB0eSBzdHJpbmdzIGZyb20gdGhlIHJlc3VsdC5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHMgYXJlIGRvbmUgc3RhcnRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCB3b3JraW5nIHRvIHRoZSBmcm9udC5cIn0sXG5qb2luOnskbWV0aChhKXtjb25zdCBiPVtdO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzZXF1ZW5jZSBpdGVtIFwiK2IubGVuZ3RoK1wiOiBleHBlY3RlZCBzdHIsIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO2IucHVzaChhLnYpfSksKCk9Pm5ldyBTay5idWlsdGluLnN0cihiLmpvaW4odGhpcy52KSkpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJDb25jYXRlbmF0ZSBhbnkgbnVtYmVyIG9mIHN0cmluZ3MuXFxuXFxuVGhlIHN0cmluZyB3aG9zZSBtZXRob2QgaXMgY2FsbGVkIGlzIGluc2VydGVkIGluIGJldHdlZW4gZWFjaCBnaXZlbiBzdHJpbmcuXFxuVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIG5ldyBzdHJpbmcuXFxuXFxuRXhhbXBsZTogJy4nLmpvaW4oWydhYicsICdwcScsICdycyddKSAtPiAnYWIucHEucnMnXCJ9LFxuY2FwaXRhbGl6ZTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0aGlzLnYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLlxcblxcbk1vcmUgc3BlY2lmaWNhbGx5LCBtYWtlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaGF2ZSB1cHBlciBjYXNlIGFuZCB0aGUgcmVzdCBsb3dlclxcbmNhc2UuXCJ9LHRpdGxlOnskbWV0aDpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy52LnJlcGxhY2UoL1thLXpdW2Etel0qL2dpLGE9PmFbMF0udG9VcHBlckNhc2UoKSthLnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoIHdvcmQgaXMgdGl0bGVjYXNlZC5cXG5cXG5Nb3JlIHNwZWNpZmljYWxseSwgd29yZHMgc3RhcnQgd2l0aCB1cHBlcmNhc2VkIGNoYXJhY3RlcnMgYW5kIGFsbCByZW1haW5pbmdcXG5jYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXIgY2FzZS5cIn0sXG5jZW50ZXI6eyRtZXRoOmYoITEsITApLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJHNlbGYsIHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNlbnRlcmVkIHN0cmluZyBvZiBsZW5ndGggd2lkdGguXFxuXFxuUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1sKHRoaXMsYixjKSk7aWYoYzxiKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKDApO2E9YS5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZyxcIlxcXFwkJlwiKTthPW5ldyBSZWdFeHAoYSxcImdcIik7cmV0dXJuKGI9dGhpcy52LnNsaWNlKGIsYykubWF0Y2goYSkpP25ldyBTay5idWlsdGluLmludF8oYi5sZW5ndGgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7TWluQXJnczoxLFxuTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXFxuc3RyaW5nIFNbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZVxcbmludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlwifSxleHBhbmR0YWJzOnskbWV0aDpmdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrSW50KGEpKWE9U2suYnVpbHRpbi5hc251bSQoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBnb3QgdHlwZVwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTtjb25zdCBiPUFycmF5KGErMSkuam9pbihcIiBcIiksYz10aGlzLnYucmVwbGFjZSgvKFteXFxyXFxuXFx0XSopXFx0L2csKGMsZCk9PmQrYi5zbGljZShkLmxlbmd0aCVhKSk7XG5yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIHRhYnNpemU9OClcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cXG5cXG5JZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC5cIn0sZmluZDp7JG1ldGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRsZWZ0KGEsYixjKSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIFMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcXG5zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gU1tzdGFydDplbmRdLiAgT3B0aW9uYWxcXG5hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXFxuXFxuUmV0dXJuIC0xIG9uIGZhaWx1cmUuXCJ9LFxucGFydGl0aW9uOnskbWV0aDplKCExKSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZy4gIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBzdHJpbmdcXG5hbmQgdHdvIGVtcHR5IHN0cmluZ3MuXCJ9LGluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzdHJpbmcgbm90IGZvdW5kXCIpO1xucmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYSl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBTIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsIFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxsanVzdDp7JG1ldGg6ZighMSwhMSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIGZpbGxjaGFyPScgJywgLylcIiwkZG9jOlwiUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b0xvd2VyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cIn0sbHN0cmlwOnskbWV0aDpiKC9eXFxzKy9nLGE9PlwiXltcIithK1wiXStcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXFxuXFxuSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLlwifSxyZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0scmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkcmlnaHQoYSxiLGMpO2lmKC0xPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic3Vic3RyaW5nIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gUyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBTW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLlwifSxcbnJqdXN0OnskbWV0aDpmKCEwLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRzZWxmLCB3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC5cXG5cXG5QYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0scnN0cmlwOnskbWV0aDpiKC9cXHMrJC9nLGE9PlwiW1wiK2ErXCJdKyRcIiksJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkc2VsZiwgY2hhcnM9Tm9uZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0scnBhcnRpdGlvbjp7JG1ldGg6ZSghMCksJGZsYWdzOntPbmVBcmc6ITB9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHNlcCwgLylcIiwkZG9jOlwiUGFydGl0aW9uIHRoZSBzdHJpbmcgaW50byB0aHJlZSBwYXJ0cyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yLlxcblxcblRoaXMgd2lsbCBzZWFyY2ggZm9yIHRoZSBzZXBhcmF0b3IgaW4gdGhlIHN0cmluZywgc3RhcnRpbmcgYXQgdGhlIGVuZC4gSWZcXG50aGUgc2VwYXJhdG9yIGlzIGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGVcXG5zZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgaXQuXFxuXFxuSWYgdGhlIHNlcGFyYXRvciBpcyBub3QgZm91bmQsIHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3NcXG5hbmQgdGhlIG9yaWdpbmFsIHN0cmluZy5cIn0sc3BsaXRsaW5lczp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5pc1RydWUoYSk7Y29uc3QgYj10aGlzLnYsYz1bXSxkPWIubGVuZ3RoO3ZhciBlPVxuMDtmb3IobGV0IGc9MDtnPGQ7ZysrKXt2YXIgZj1iLmNoYXJBdChnKTtpZihcIlxcblwiPT09Yi5jaGFyQXQoZysxKSYmXCJcXHJcIj09PWYpZj1nKzIsZT1iLnNsaWNlKGUsZiksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSksZT1mO2Vsc2UgaWYoXCJcXG5cIj09PWYmJlwiXFxyXCIhPT1iLmNoYXJBdChnLTEpfHxcIlxcclwiPT09ZilmPWcrMSxlPWIuc2xpY2UoZSxmKSxhfHwoZT1lLnJlcGxhY2UoLyhcXHJ8XFxuKS9nLFwiXCIpKSxjLnB1c2gobmV3IFNrLmJ1aWx0aW4uc3RyKGUpKSxlPWZ9ZTxkJiYoZT1iLnNsaWNlKGUsZCksYXx8KGU9ZS5yZXBsYWNlKC8oXFxyfFxcbikvZyxcIlwiKSksYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihlKSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJrZWVwZW5kc1wiXSxEZWZhdWx0czpbITFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywga2VlcGVuZHM9RmFsc2UpXCIsJGRvYzpcIlJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdHJpcDp7JG1ldGg6YigvXlxccyt8XFxzKyQvZyxhPT5cIl5bXCIrYStcIl0rfFtcIithK1wiXSskXCIpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGNoYXJzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlLlxcblxcbklmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC5cIn0sc3dhcGNhc2U6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYucmVwbGFjZSgvW2Etel0vZ2ksYT0+e2NvbnN0IGI9YS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09YT9hLnRvVXBwZXJDYXNlKCk6Yn0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiQ29udmVydCB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byBsb3dlcmNhc2UgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIHRvIHVwcGVyY2FzZS5cIn0sXG51cHBlcjp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudi50b1VwcGVyQ2FzZSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIHVwcGVyY2FzZS5cIn0sc3RhcnRzd2l0aDp7JG1ldGg6ZChcInN0YXJ0c3dpdGhcIiwoYSxiKT0+MD09PWEuaW5kZXhPZihiKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJTLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdHJpbmdzIHRvIHRyeS5cIn0sXG5lbmRzd2l0aDp7JG1ldGg6ZChcImVuZHN3aXRoXCIsKGEsYik9Pi0xIT09YS5pbmRleE9mKGIsYS5sZW5ndGgtYi5sZW5ndGgpKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlMuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXFxuV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBTIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxcbldpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uXFxuc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuXCJ9LGlzYXNjaWk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15bXFx4MDAtXFx4N0ZdKiQvLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIixcbiRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBBU0NJSSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri5cXG5FbXB0eSBzdHJpbmcgaXMgQVNDSUkgdG9vLlwifSxpc2xvd2VyOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJi9bYS16XS8udGVzdCh0aGlzLnYpJiYhL1tBLVpdLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBsb3dlcmNhc2Ugc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbG93ZXJjYXNlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZSBhbmRcXG50aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LFxuaXN1cHBlcjp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1thLXpdLy50ZXN0KHRoaXMudikmJi9bQS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIHVwcGVyY2FzZSBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyB1cHBlcmNhc2UgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlIGFuZFxcbnRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMudjtsZXQgYj0hMSxjPSExLGQ7Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDtlKyspaWYoZD1hLmNoYXJBdChlKSwhL1thLXpdLy50ZXN0KGQpJiYvW0EtWl0vLnRlc3QoZCkpe2lmKGMpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7XG5iPWM9ITB9ZWxzZSBpZigvW2Etel0vLnRlc3QoZCkmJiEvW0EtWl0vLnRlc3QoZCkpe2lmKCFjKXJldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkO2I9ITB9ZWxzZSBjPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZS1jYXNlZCBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5JbiBhIHRpdGxlLWNhc2VkIHN0cmluZywgdXBwZXItIGFuZCB0aXRsZS1jYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcXG5mb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXCJ9LGlzc3BhY2U6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXHMrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB3aGl0ZXNwYWNlIHN0cmluZywgRmFsc2Ugb3RoZXJ3aXNlLlxcblxcbkEgc3RyaW5nIGlzIHdoaXRlc3BhY2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgd2hpdGVzcGFjZSBhbmQgdGhlcmVcXG5pcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuXCJ9LGlzZGlnaXQ6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woL15cXGQrJC8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgZGlnaXQgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYSBkaWdpdCBzdHJpbmcgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc251bWVyaWM6eyRtZXRoOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2wodGhpcy52Lmxlbmd0aCYmIS9bXjAtOV0vLnRlc3QodGhpcy52KSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIG51bWVyaWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgbnVtZXJpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGFuZCB0aGVyZSBpcyBhdFxcbmxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0saXNhbHBoYTp7JG1ldGg6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYm9vbCh0aGlzLnYubGVuZ3RoJiYhL1teYS16QS1aXS8udGVzdCh0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGFuIGFscGhhYmV0aWMgc3RyaW5nLCBGYWxzZSBvdGhlcndpc2UuXFxuXFxuQSBzdHJpbmcgaXMgYWxwaGFiZXRpYyBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZCB0aGVyZVxcbmlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy5cIn0sXG5pc2FsbnVtOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudi5sZW5ndGgmJiEvW15hLXpBLVowLTldLy50ZXN0KHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBzdHJpbmcgaXMgYW4gYWxwaGEtbnVtZXJpYyBzdHJpbmcsIEZhbHNlIG90aGVyd2lzZS5cXG5cXG5BIHN0cmluZyBpcyBhbHBoYS1udW1lcmljIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhLW51bWVyaWMgYW5kXFxudGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLlwifSx6ZmlsbDp7JG1ldGg6ZnVuY3Rpb24oYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2xldCBiPVwiXCI7YS09dGhpcy52Lmxlbmd0aDtjb25zdCBjPVwiK1wiPT09dGhpcy52WzBdfHxcIi1cIj09PXRoaXMudlswXT8xOjA7XG5mb3IobGV0IGM9MDtjPGE7YysrKWIrPVwiMFwiO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnN1YnN0cigwLGMpK2IrdGhpcy52LnN1YnN0cihjKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgd2lkdGgsIC8pXCIsJGRvYzpcIlBhZCBhIG51bWVyaWMgc3RyaW5nIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gd2lkdGguXFxuXFxuVGhlIHN0cmluZyBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9LGZvcm1hdDp7JG1ldGg6U2suZm9ybWF0dGluZy5mb3JtYXQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUy5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKSAtPiBzdHJcXG5cXG5SZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiBTLCB1c2luZyBzdWJzdGl0dXRpb25zIGZyb20gYXJncyBhbmQga3dhcmdzLlxcblRoZSBzdWJzdGl0dXRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGJyYWNlcyAoJ3snIGFuZCAnfScpLlwifSxcbl9fZm9ybWF0X186eyRtZXRoOlNrLmZvcm1hdHRpbmcuZm9ybWF0U3RyaW5nLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpcIlJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgZGVzY3JpYmVkIGJ5IGZvcm1hdF9zcGVjLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUobmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMudikpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOm51bGx9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uc3RyXCIsU2suYnVpbHRpbi5zdHIpO3ZhciBrPS9eW0EtWmEtejAtOV0rJC8scD0vKFsuKis/PXxcXFxcXFwvKClcXFtcXF1cXHtcXH1eJF0pL2csdT0vXltcXHNcXHhhMF0rLztTay5idWlsdGluLnN0ci4kcHkyZGVjb2RlPW5ldyBTay5idWlsdGluLm1ldGhvZF9kZXNjcmlwdG9yKFNrLmJ1aWx0aW4uc3RyLHskbmFtZTpcImRlY29kZVwiLFxuJG1ldGgoYSxiKXtjb25zdCBjPW5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7cmV0dXJuIFNrLmJ1aWx0aW4uYnl0ZXMuJGRlY29kZS5jYWxsKGMsYSxiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX19KTt2YXIgQT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJzdHJfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDthLiRoYXNBc3RyYWxDb2RlUG9pbnRzKCk/KHRoaXMuJHNlcT1hLmNvZGVwb2ludHMsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGI9dGhpcy4kc2VxW3RoaXMuJGluZGV4XTtpZih2b2lkIDAhPT1iKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYS52LnN1YnN0cmluZyhiLHRoaXMuJHNlcVsrK3RoaXMuJGluZGV4XSkpfSk6KHRoaXMuJHNlcT1hLnYsdGhpcy50cCRpdGVybmV4dD0oKT0+e2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4KytdO2lmKHZvaWQgMCE9PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX0pfSxcbml0ZXJuZXh0KCl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksdD17YWJzdHJhY3Q6ITAsYXM6ITAsYm9vbGVhbjohMCxicmVhazohMCxieXRlOiEwLGNhc2U6ITAsY2F0Y2g6ITAsY2hhcjohMCxjbGFzczohMCxjb250aW51ZTohMCxjb25zdDohMCxkZWJ1Z2dlcjohMCxkZWZhdWx0OiEwLGRlbGV0ZTohMCxkbzohMCxkb3VibGU6ITAsZWxzZTohMCxlbnVtOiEwLGV4cG9ydDohMCxleHRlbmRzOiEwLGZhbHNlOiEwLGZpbmFsOiEwLGZpbmFsbHk6ITAsZmxvYXQ6ITAsZm9yOiEwLGZ1bmN0aW9uOiEwLGdvdG86ITAsaWY6ITAsaW1wbGVtZW50czohMCxpbXBvcnQ6ITAsaW46ITAsaW5zdGFuY2VvZjohMCxpbnQ6ITAsaW50ZXJmYWNlOiEwLGlzOiEwLGxvbmc6ITAsbmFtZXNwYWNlOiEwLFxubmF0aXZlOiEwLG5ldzohMCxudWxsOiEwLHBhY2thZ2U6ITAscHJpdmF0ZTohMCxwcm90ZWN0ZWQ6ITAscHVibGljOiEwLHJldHVybjohMCxzaG9ydDohMCxzdGF0aWM6ITAsc3VwZXI6ITAsc3dpdGNoOiEwLHN5bmNocm9uaXplZDohMCx0aGlzOiEwLHRocm93OiEwLHRocm93czohMCx0cmFuc2llbnQ6ITAsdHJ1ZTohMCx0cnk6ITAsdHlwZW9mOiEwLHVzZTohMCx2YXI6ITAsdm9pZDohMCx2b2xhdGlsZTohMCx3aGlsZTohMCx3aXRoOiEwLGNvbnN0cnVjdG9yOiEwLF9fZGVmaW5lR2V0dGVyX186ITAsX19kZWZpbmVTZXR0ZXJfXzohMCxhcHBseTohMCxhcmd1bWVudHM6ITAsY2FsbDohMCxjYWxsZXI6ITAsZXZhbDohMCxoYXNPd25Qcm9wZXJ0eTohMCxpc1Byb3RvdHlwZU9mOiEwLF9fbG9va3VwR2V0dGVyX186ITAsX19sb29rdXBTZXR0ZXJfXzohMCxfX25vU3VjaE1ldGhvZF9fOiEwLHByb3BlcnR5SXNFbnVtZXJhYmxlOiEwLHByb3RvdHlwZTohMCx0b1NvdXJjZTohMCx0b0xvY2FsZVN0cmluZzohMCxcbnRvU3RyaW5nOiEwLHVud2F0Y2g6ITAsdmFsdWVPZjohMCx3YXRjaDohMCxsZW5ndGg6ITAsbmFtZTohMH07U2suYnVpbHRpbi5zdHIucmVzZXJ2ZWRXb3Jkc189dH0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZ1bmM9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImZ1bmN0aW9uXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmZ1bmMsXCJidWlsdGluIGZ1bmMgc2hvdWxkIGJlIGNhbGxlZCBhcyBhIGNsYXNzIHdpdGggYG5ld2BcIik7dGhpcy5mdW5jX2NvZGU9YTt0aGlzLmZ1bmNfZ2xvYmFscz1jfHxudWxsO3RoaXMuJG5hbWU9YS5jb19uYW1lJiZhLmNvX25hbWUudnx8YS5uYW1lfHxcIjxuYXRpdmUgSlM+XCI7dGhpcy4kZD1Tay5idWlsdGluLmRpY3Q/bmV3IFNrLmJ1aWx0aW4uZGljdDp2b2lkIDA7dGhpcy4kZG9jPWEuJGRvYzt0aGlzLiRtb2R1bGU9U2suZ2xvYmFscyYmU2suZ2xvYmFscy5fX25hbWVfX3x8XG5Tay5idWlsdGluLm5vbmUubm9uZSQ7dGhpcy4kcXVhbG5hbWU9YS5jb19xdWFsbmFtZSYmYS5jb19xdWFsbmFtZS52fHx0aGlzLiRuYW1lO2lmKHZvaWQgMCE9PWUpZm9yKGxldCBhIGluIGUpYlthXT1lW2FdO3RoaXMuZnVuY19jbG9zdXJlPWI7dGhpcy4kbWVtb2lzZUZsYWdzKCk7dGhpcy5tZW1vaXNlZD1hLmNvX2Zhc3RjYWxsfHxudWxsO3RoaXMudHAkY2FsbD1hLmNvX2Zhc3RjYWxsP2EuYmluZCh0aGlzKTpTay5idWlsdGluLmZ1bmMucHJvdG90eXBlLnRwJGNhbGwuYmluZCh0aGlzKX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRlc2NyX2dldChhLGMpe3JldHVybiBudWxsPT09YT90aGlzOm5ldyBTay5idWlsdGluLm1ldGhvZCh0aGlzLGEpfSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8ZnVuY3Rpb24gXCIrdGhpcy4kcXVhbG5hbWUrXCI+XCIpfSx0cCRjYWxsKGEsYyl7dGhpcy5tZW1vaXNlZHx8KHRoaXMuJG1lbW9pc2VGbGFncygpLFxudGhpcy5tZW1vaXNlZD0hMCk7aWYodm9pZCAwPT09dGhpcy5jb19hcmdjb3VudCYmdm9pZCAwPT09dGhpcy5jb192YXJuYW1lcyYmIXRoaXMuY29fa3dhcmdzJiYhdGhpcy5mdW5jX2Nsb3N1cmUpe2lmKGMmJjAhPT1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzXCIpO3JldHVybiB0aGlzLmZ1bmNfY29kZS5hcHBseSh0aGlzLmZ1bmNfZ2xvYmFscyxhKX1hPXRoaXMuJHJlc29sdmVBcmdzKGEsYyk7dGhpcy5mdW5jX2Nsb3N1cmUmJmEucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGEpfX0sZ2V0c2V0czp7X19uYW1lX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKHRoaXMuJG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdFwiKTtcbnRoaXMuJG5hbWU9YS4kanNzdHIoKX19LF9fcXVhbG5hbWVfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kcXVhbG5hbWUpfSwkc2V0KGEpe2lmKCFTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3RcIik7dGhpcy4kcXVhbG5hbWU9YS4kanNzdHIoKX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdCxfX2RlZmF1bHRzX186eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUodGhpcy4kZGVmYXVsdHMpfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy4kZG9jKX19fSxwcm90bzp7JG1lbW9pc2VGbGFncygpe3RoaXMuY29fdmFybmFtZXM9dGhpcy5mdW5jX2NvZGUuY29fdmFybmFtZXM7dGhpcy5jb19hcmdjb3VudD10aGlzLmZ1bmNfY29kZS5jb19hcmdjb3VudDt2b2lkIDA9PT1cbnRoaXMuY29fYXJnY291bnQmJnRoaXMuY29fdmFybmFtZXMmJih0aGlzLmNvX2FyZ2NvdW50PXRoaXMuY29fYXJnY291bnQ9dGhpcy5jb192YXJuYW1lcy5sZW5ndGgpO3RoaXMuY29fa3dvbmx5YXJnY291bnQ9dGhpcy5mdW5jX2NvZGUuY29fa3dvbmx5YXJnY291bnR8fDA7dGhpcy5jb192YXJhcmdzPXRoaXMuZnVuY19jb2RlLmNvX3ZhcmFyZ3M7dGhpcy5jb19rd2FyZ3M9dGhpcy5mdW5jX2NvZGUuY29fa3dhcmdzO3RoaXMuJGRlZmF1bHRzPXRoaXMuZnVuY19jb2RlLiRkZWZhdWx0c3x8W107dGhpcy4ka3dkZWZzPXRoaXMuZnVuY19jb2RlLiRrd2RlZnN8fFtdfSwkcmVzb2x2ZUFyZ3M6ZnVuY3Rpb24oYSxjKXt2YXIgYj10aGlzLmNvX2FyZ2NvdW50O3ZvaWQgMD09PWImJihiPXRoaXMuY29fdmFybmFtZXM/dGhpcy5jb192YXJuYW1lcy5sZW5ndGg6YS5sZW5ndGgpO3ZhciBlPXRoaXMuY29fdmFybmFtZXN8fFtdLGY9dGhpcy5jb19rd29ubHlhcmdjb3VudHx8MDtsZXQgbD1iK1xuZjtpZighKDAhPT1mfHx0aGlzLmNvX2t3YXJnc3x8YyYmMCE9PWMubGVuZ3RofHx0aGlzLmNvX3ZhcmFyZ3MpKXtpZihhLmxlbmd0aD09YilyZXR1cm4gYTtpZigwPT09YS5sZW5ndGgmJnRoaXMuJGRlZmF1bHRzJiZ0aGlzLiRkZWZhdWx0cy5sZW5ndGg9PT1iKXtmb3IoZT0wO2UhPXRoaXMuJGRlZmF1bHRzLmxlbmd0aDtlKyspYVtlXT10aGlzLiRkZWZhdWx0c1tlXTtyZXR1cm4gYX19bGV0IGg7dGhpcy5jb19rd2FyZ3MmJihoPVtdKTt2YXIgZD1hLmxlbmd0aDtsZXQgZz1hLmxlbmd0aDw9Yj9hOmEuc2xpY2UoMCxiKTtpZih0aGlzLmNvX3ZhcmFyZ3MpYT1hLmxlbmd0aD5nLmxlbmd0aD9hLnNsaWNlKGcubGVuZ3RoKTpbXSxnW2xdPW5ldyBTay5idWlsdGluLnR1cGxlKGEpO2Vsc2UgaWYoZD5iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgdGFrZXMgXCIrYitcIiBwb3NpdGlvbmFsIGFyZ3VtZW50XCIrKDE9PWI/XCJcIjpcInNcIikrXCIgYnV0IFwiK2QrKDE9PVxuZD9cIiB3YXMgXCI6XCIgd2VyZSBcIikrXCIgZ2l2ZW5cIik7aWYoYyl7aWYodGhpcy5mdW5jX2NvZGUubm9fa3cpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKHRoaXMuJG5hbWUrXCIoKSB0YWtlcyBubyBrZXl3b3JkIGFyZ3VtZW50c1wiKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9Mil7ZD1jW2FdO3ZhciBuPWNbYSsxXSxrPWUuaW5kZXhPZihkKTtpZigwPD1rKXtpZih2b2lkIDAhPT1nW2tdKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3IgYXJndW1lbnQgJ1wiK2QrXCInXCIpO2dba109bn1lbHNlIGlmKGgpaC5wdXNoKG5ldyBTay5idWlsdGluLnN0cihkKSxuKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnXCIrZCtcIidcIik7fX1jPXRoaXMuJGRlZmF1bHRzfHxbXTthPTA7ZD1bXTtuPSExO2ZvcihrPWItYy5sZW5ndGg7YTxcbms7YSsrKXZvaWQgMD09PWdbYV0mJihkLnB1c2goZVthXSksdm9pZCAwPT09ZVthXSYmKG49ITApKTtpZigwIT1kLmxlbmd0aCYmKHRoaXMuY29fYXJnY291bnR8fHRoaXMuY29fdmFybmFtZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcih0aGlzLiRuYW1lK1wiKCkgbWlzc2luZyBcIitkLmxlbmd0aCtcIiByZXF1aXJlZCBhcmd1bWVudFwiKygxPT1kLmxlbmd0aD9cIlwiOlwic1wiKSsobj9cIlwiOlwiOiBcIitkLmpvaW4oXCIsIFwiKSkpO2Zvcig7YTxiO2ErKyl2b2lkIDA9PT1nW2FdJiYoZ1thXT1jW2Eta10pO2lmKDA8Zil7Zj1bXTtjPXRoaXMuJGt3ZGVmcztmb3IoYT1iO2E8bDthKyspdm9pZCAwPT09Z1thXSYmKHZvaWQgMCE9PWNbYS1iXT9nW2FdPWNbYS1iXTpmLnB1c2goZVthXSkpO2lmKDAhPT1mLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IodGhpcy4kbmFtZStcIigpIG1pc3NpbmcgXCIrZi5sZW5ndGgrXCIgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudFwiKygxPT1cbmYubGVuZ3RoP1wiXCI6XCJzXCIpK1wiOiBcIitmLmpvaW4oXCIsIFwiKSk7fWlmKHRoaXMuZnVuY19jbG9zdXJlJiZlKWZvcihiPWcubGVuZ3RoO2I8ZS5sZW5ndGg7YisrKWcucHVzaCh2b2lkIDApO2gmJmcudW5zaGlmdChoKTtyZXR1cm4gZ319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5hc251bSQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWF8fG51bGw9PT1hfHxcIm51bWJlclwiPT09dHlwZW9mIGE/YTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfP1wibnVtYmVyXCI9PT10eXBlb2YgYS52P2EudjphLnYudG9TdHJpbmcoKTphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF8/YS52OmE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bnVsbDphfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJFwiLFNrLmJ1aWx0aW4uYXNudW0kKTtTay5idWlsdGluLmFzc2skPWZ1bmN0aW9uKGEpe3JldHVybiAwPT09YSUxP25ldyBTay5idWlsdGluLmludF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEpfTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uYXNzayRcIixTay5idWlsdGluLmFzc2skKTtTay5idWlsdGluLmFzbnVtJG5vZmxvYXQ9ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpcmV0dXJuIGE7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWE9YS50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XylhPWEudi50b1N0cmluZygpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKWE9YS52LnRvU3RyaW5nKCk7ZWxzZXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXJldHVybiBudWxsO3JldHVybn1pZigwPmEuaW5kZXhPZihcIi5cIikmJjA+YS5pbmRleE9mKFwiZVwiKSYmMD5hLmluZGV4T2YoXCJFXCIpKXJldHVybiBhO3ZhciBiPTA7aWYoMDw9YS5pbmRleE9mKFwiZVwiKSl7dmFyIGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKTtiPWEuc3Vic3RyKGEuaW5kZXhPZihcImVcIikrMSl9ZWxzZSAwPD1hLmluZGV4T2YoXCJFXCIpP1xuKGM9YS5zdWJzdHIoMCxhLmluZGV4T2YoXCJlXCIpKSxiPWEuc3Vic3RyKGEuaW5kZXhPZihcIkVcIikrMSkpOmM9YTtiPXBhcnNlSW50KGIsMTApO2E9Yy5pbmRleE9mKFwiLlwiKTtpZigwPmEpe2lmKDA8PWIpe2Zvcig7MDxiLS07KWMrPVwiMFwiO3JldHVybiBjfXJldHVybiBjLmxlbmd0aD4tYj9jLnN1YnN0cigwLGMubGVuZ3RoK2IpOjB9Yz0wPT09YT9jLnN1YnN0cigxKTphPGMubGVuZ3RoP2Muc3Vic3RyKDAsYSkrYy5zdWJzdHIoYSsxKTpjLnN1YnN0cigwLGEpO2ZvcihhKz1iO2E+Yy5sZW5ndGg7KWMrPVwiMFwiO3JldHVybiBjPTA+PWE/MDpjLnN1YnN0cigwLGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmFzbnVtJG5vZmxvYXRcIixTay5idWlsdGluLmFzbnVtJG5vZmxvYXQpO1NrLmJ1aWx0aW4ucm91bmQ9ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7aWYoIVNrLl9fZnV0dXJlX18uZHVuZGVyX3JvdW5kKXtpZighU2suYnVpbHRpbi5jaGVja051bWJlcihhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO1xuaWYoYS5yb3VuZCQpcmV0dXJuIGEucm91bmQkKGMpO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFNrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ19fZmxvYXRfXydcIik7fWlmKHZvaWQgMCE9PWMmJiFTay5idWlsdGluLmNoZWNrTm9uZShjKSYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO2E9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRyb3VuZCk7aWYodm9pZCAwIT09YSlyZXR1cm4gdm9pZCAwIT09Yz9Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbY10pOlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhIGZsb2F0IGlzIHJlcXVpcmVkXCIpO307U2suYnVpbHRpbi5sZW49XG5mdW5jdGlvbihhKXtpZihhLnNxJGxlbmd0aClhPWEuc3EkbGVuZ3RoKCEwKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9iamVjdCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgaGFzIG5vIGxlbigpXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihhLGE9Pm5ldyBTay5idWlsdGluLmludF8oYSkpfTtTay5idWlsdGluLm1pbj1mdW5jdGlvbihhLGMpe2xldCBiO2NvbnN0IGU9YS5sZW5ndGg7aWYoIWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibWluIGV4cGVjdGVkIDEgYXJndW1lbnQsIGdvdCAwXCIpO2NvbnN0IFtoLGRdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwibWluXCIsW1wiZGVmYXVsdFwiLFwia2V5XCJdLFtdLGMsW251bGwsU2suYnVpbHRpbi5ub25lLm5vbmUkXSk7aWYoMTxlJiZudWxsIT09aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJDYW5ub3Qgc3BlY2lmeSBhIGRlZmF1bHQgZm9yIG1pbigpIHdpdGggbXVsdGlwbGUgcG9zaXRpb25hbCBhcmd1bWVudHNcIik7XG5iPTE9PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkx0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkx0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWF4PWZ1bmN0aW9uKGEsYyl7bGV0IGI7Y29uc3QgZT1hLmxlbmd0aDtpZighZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtYXggZXhwZWN0ZWQgMSBhcmd1bWVudCwgZ290IDBcIik7Y29uc3QgW2gsZF09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJtaW5cIixbXCJkZWZhdWx0XCIsXCJrZXlcIl0sW10sYyxbbnVsbCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtpZigxPGUmJm51bGwhPT1oKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIkNhbm5vdCBzcGVjaWZ5IGEgZGVmYXVsdCBmb3IgbWF4KCkgd2l0aCBtdWx0aXBsZSBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKTtcbmI9MT09PWU/U2suYWJzdHIuaXRlcihhWzBdKTpTay5hYnN0ci5pdGVyKG5ldyBTay5idWlsdGluLnR1cGxlKGEpKTtpZighU2suYnVpbHRpbi5jaGVja05vbmUoZCkmJiFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoZCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGQpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO2xldCBnO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLnRwJGl0ZXJuZXh0KCEwKSxhPT57Zz1hO2lmKHZvaWQgMCE9PWcpcmV0dXJuIFNrLmJ1aWx0aW4uY2hlY2tOb25lKGQpP1NrLm1pc2NldmFsLml0ZXJGb3IoYixhPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsZyxcIkd0XCIpJiYoZz1hKX0pOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFtnXSksYT0+U2subWlzY2V2YWwuaXRlckZvcihiLGI9PlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShkLFxuW2JdKSxjPT57U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsYSxcIkd0XCIpJiYoZz1iLGE9Yyl9KSkpfSwoKT0+e2lmKHZvaWQgMD09PWcpe2lmKG51bGw9PT1oKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJtaW4oKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2VcIik7Zz1ofXJldHVybiBnfSl9O1NrLmJ1aWx0aW4ubWluLmNvX2Zhc3RjYWxsPVNrLmJ1aWx0aW4ubWF4LmNvX2Zhc3RjYWxsPTE7U2suYnVpbHRpbi5hbnk9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxmdW5jdGlvbihhKXtpZihTay5taXNjZXZhbC5pc1RydWUoYSkpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayhTay5idWlsdGluLmJvb2wudHJ1ZSQpfSksYT0+YXx8U2suYnVpbHRpbi5ib29sLmZhbHNlJCl9O1NrLmJ1aWx0aW4uYWxsPWZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksXG5mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNUcnVlKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxhPT5hfHxTay5idWlsdGluLmJvb2wudHJ1ZSQpfTtTay5idWlsdGluLnN1bT1mdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIoKXtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihkLGE9PntpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5pbnRfKWc9Zy5uYiRhZGQoYSk7ZWxzZXtpZihhLmNvbnN0cnVjdG9yPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGc9Zy5uYiRmbG9hdCgpLm5iJGFkZChhKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJmbG9hdFwiKTtnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKTtyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKFwic2xvd1wiKX19KX1mdW5jdGlvbiBlKCl7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoZCxhPT57aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRffHxcbmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLmludF8pZz1nLm5iJGFkZChhKTtlbHNlIHJldHVybiBnPVNrLmFic3RyLm51bWJlckJpbk9wKGcsYSxcIkFkZFwiKSxuZXcgU2subWlzY2V2YWwuQnJlYWsoXCJzbG93XCIpfSl9ZnVuY3Rpb24gaCgpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKGQsYT0+e2c9U2suYWJzdHIubnVtYmVyQmluT3AoZyxhLFwiQWRkXCIpfSl9Y29uc3QgZD1Tay5hYnN0ci5pdGVyKGEpO2lmKHZvaWQgMD09PWMpdmFyIGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtlbHNle2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF1cIik7Zz1jfWE9dm9pZCAwPT09Y3x8Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50Xz9iKCk6Yy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uZmxvYXRfP1wiZmxvYXRcIjpcInNsb3dcIjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxcbmE9PlwiZmxvYXRcIj09PWE/ZSgpOmEsYT0+e2lmKFwic2xvd1wiPT09YSlyZXR1cm4gaCgpfSwoKT0+Zyl9O1NrLmJ1aWx0aW4uemlwPWZ1bmN0aW9uKCl7dmFyIGEsYztpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChbXSk7dmFyIGY9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWlmKFNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShhcmd1bWVudHNbY10pKWYucHVzaChTay5hYnN0ci5pdGVyKGFyZ3VtZW50c1tjXSkpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXJndW1lbnQgXCIrYytcIiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uXCIpO3ZhciBsPVtdO2ZvcihhPSExOyFhOyl7dmFyIGg9W107Zm9yKGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1mW2NdLnRwJGl0ZXJuZXh0KCk7aWYodm9pZCAwPT09ZCl7YT0hMDticmVha31oLnB1c2goZCl9YXx8bC5wdXNoKG5ldyBTay5idWlsdGluLnR1cGxlKGgpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChsKX07XG5Tay5idWlsdGluLmFicz1mdW5jdGlvbihhKXtpZihhLm5iJGFicylyZXR1cm4gYS5uYiRhYnMoKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7fTtTay5idWlsdGluLmZhYnM9ZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmJ1aWx0aW4uYWJzKGEpfTtTay5idWlsdGluLm9yZD1mdW5jdGlvbihhKXtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtpZigxIT09YS52Lmxlbmd0aCYmMSE9PWEuc3EkbGVuZ3RoKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsIGJ1dCBzdHJpbmcgb2YgbGVuZ3RoIFwiK2Eudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52LmNvZGVQb2ludEF0KDApKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpe2lmKDEhPT1hLnNxJGxlbmd0aCgpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm9yZCgpIGV4cGVjdGVkIGEgY2hhcmFjdGVyLCBidXQgc3RyaW5nIG9mIGxlbmd0aCBcIitcbmEudi5sZW5ndGgrXCIgZm91bmRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYS52WzBdKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvcmQoKSBleHBlY3RlZCBhIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiIGZvdW5kXCIpO307U2suYnVpbHRpbi5jaHI9ZnVuY3Rpb24oYSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJbnQoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTthPVNrLmJ1aWx0aW4uYXNudW0kKGEpO2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMyl7aWYoMD5hfHwxMTE0MTEyPD1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKVwiKTt9ZWxzZSBpZigwPmF8fDI1Njw9YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoU3RyaW5nLmZyb21Db2RlUG9pbnQoYSkpfTtcblNrLmJ1aWx0aW4udW5pY2hyPWZ1bmN0aW9uKGEpe2lmKCFTay5idWlsdGluLmNoZWNrSW50KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImFuIGludGVnZXIgaXMgcmVxdWlyZWRcIik7YT1Tay5idWlsdGluLmFzbnVtJChhKTt0cnl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTdHJpbmcuZnJvbUNvZGVQb2ludChhKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFJhbmdlRXJyb3IpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihlLm1lc3NhZ2UpO3Rocm93IGU7fX07U2suYnVpbHRpbi5pbnQyc3RyXz1mdW5jdGlvbihhLGMsZil7bGV0IGI7YS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uaW50X3x8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50X3x8KGE9YS5uYiRpbmRleCgpKTtiPWEudjtsZXQgZT1iLnRvU3RyaW5nKGMpO2U9YS5uYiRpc25lZ2F0aXZlKCk/XCItXCIrZitlLnNsaWNlKDEpOmYrZTsyIT09YyYmIVNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXG4oYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubG5nfHxKU0JJLl9faXNCaWdJbnQoYikpJiYoZSs9XCJMXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZSl9O1NrLmJ1aWx0aW4uaGV4PWZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImhleCgpIGFyZ3VtZW50IGNhbid0IGJlIGNvbnZlcnRlZCB0byBoZXhcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50MnN0cl8oYSwxNixcIjB4XCIpfTtTay5idWlsdGluLm9jdD1mdW5jdGlvbihhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJvY3QoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4XCIpO3JldHVybiBTay5fX2Z1dHVyZV9fLm9jdGFsX251bWJlcl9saXRlcmFsP1NrLmJ1aWx0aW4uaW50MnN0cl8oYSw4LFwiMG9cIik6U2suYnVpbHRpbi5pbnQyc3RyXyhhLDgsXCIwXCIpfTtTay5idWlsdGluLmJpbj1cbmZ1bmN0aW9uKGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGNhbid0IGJlIGludGVycHJldGVkIGFzIGFuIGluZGV4XCIpO3JldHVybiBTay5idWlsdGluLmludDJzdHJfKGEsMixcIjBiXCIpfTtTay5idWlsdGluLmRpcj1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4kZGlyKSxTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYSxbXSksYT0+U2suYnVpbHRpbi5zb3J0ZWQoYSkpO3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJza3VscHQgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGlyIHdpdGggbm8gYXJnc1wiKTt9O1NrLmJ1aWx0aW4ucmVwcj1mdW5jdGlvbihhKXtyZXR1cm4gYS4kcigpfTtTay5idWlsdGluLmFzY2lpPVxuZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEuJHIoKSxhPT57bGV0IGIsYztmb3IoYz0wO2M8YS52Lmxlbmd0aDtjKyspaWYoMTI3PD1hLnYuY2hhckNvZGVBdChjKSl7Yj1hLnYuc3Vic3RyKDAsYyk7YnJlYWt9aWYoIWIpcmV0dXJuIGE7Zm9yKDtjPGEudi5sZW5ndGg7YysrKXt2YXIgZT1hLnYuY2hhckF0KGMpLGQ9YS52LmNoYXJDb2RlQXQoYyk7MTI3PGQmJjI1NT49ZD8oZT1kLnRvU3RyaW5nKDE2KSwyPmUubGVuZ3RoJiYoZT1cIjBcIitlKSxiKz1cIlxcXFx4XCIrZSk6MTI3PGQmJjU1Mjk2PmR8fDU3MzQ0PD1kP2IrPVwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpOjU1Mjk2PD1kPyhlPWEudi5jb2RlUG9pbnRBdChjKSxjKyssZT1lLnRvU3RyaW5nKDE2KSxkPVwiMDAwMDAwMFwiK2UudG9TdHJpbmcoMTYpLGI9NDxlLmxlbmd0aD9iKyhcIlxcXFxVXCIrZC5zbGljZSgtOCkpOmIrKFwiXFxcXHVcIitkLnNsaWNlKC00KSkpOmIrPWV9cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihiKX0pfTtcblNrLmJ1aWx0aW4ub3Blbj1mdW5jdGlvbihhLGMsZil7dm9pZCAwPT09YyYmKGM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiclwiKSk7aWYoL1xcKy8udGVzdChjLnYpKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIHJlYWQvd3JpdGUgbW9kZVwiO2lmKChcIndcIj09PWMudnx8XCJ3YlwiPT09Yy52fHxcImFcIj09PWMudnx8XCJhYlwiPT09Yy52KSYmIVNrLm5vbnJlYWRvcGVuKXRocm93XCJ0b2RvOyBoYXZlbid0IGltcGxlbWVudGVkIG5vbi1yZWFkIG9wZW5zXCI7cmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGYpfTtTay5idWlsdGluLmlzaW5zdGFuY2U9ZnVuY3Rpb24oYSxjKXtpZighKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKXx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzaW5zdGFuY2UoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3MsIHR5cGUsIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzXCIpO3ZhciBiPWEub2IkdHlwZTtcbmlmKGI9PT1jKXJldHVybiBTay5idWlsdGluLmJvb2wudHJ1ZSQ7aWYoIShjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpe2lmKGIuJGlzU3ViVHlwZShjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO2E9YS50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7cmV0dXJuIGEhPWImJlNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSYmYS4kaXNTdWJUeXBlKGMpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfWZvcihiPTA7YjxjLnYubGVuZ3RoOysrYilpZihTay5taXNjZXZhbC5pc1RydWUoU2suYnVpbHRpbi5pc2luc3RhbmNlKGEsYy52W2JdKSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5oYXNoPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmFic3RyLm9iamVjdEhhc2goYSkpfTtTay5idWlsdGluLmdldGF0dHI9ZnVuY3Rpb24oYSxcbmMsZil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmdcIik7Y29uc3QgYj1Tay5taXNjZXZhbC50cnlDYXRjaCgoKT0+YS50cCRnZXRhdHRyKGMsITApLGE9PntpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKSl0aHJvdyBhO30pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihiLGI9PntpZih2b2lkIDA9PT1iKXtpZih2b2lkIDAhPT1mKXJldHVybiBmO3Rocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKGEuc2skYXR0ckVycm9yKCkrXCIgaGFzIG5vIGF0dHJpYnV0ZSBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKGMpKTt9cmV0dXJuIGJ9KX07U2suYnVpbHRpbi5zZXRhdHRyPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZ1wiKTtcbnJldHVybiBTay5taXNjZXZhbC5jaGFpbihhLnRwJHNldGF0dHIoYyxmLCEwKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX07U2suYnVpbHRpbi5yYXdfaW5wdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9YT9hOlwiXCI7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxmdW5jdGlvbihhKXtyZXR1cm4gU2suaW5wdXRmdW5UYWtlc1Byb21wdD9Tay5idWlsdGluLmZpbGUuJHJlYWRsaW5lKGEuJGQuc3RkaW4sbnVsbCxiKTpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3Rkb3V0LndyaXRlLFthLiRkLnN0ZG91dCxuZXcgU2suYnVpbHRpbi5zdHIoYildKX0sZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEuJGQuc3RkaW4ucmVhZGxpbmUsW2EuJGQuc3RkaW5dKX0pfSl9O1NrLmJ1aWx0aW4uaW5wdXQ9XG5Tay5idWlsdGluLnJhd19pbnB1dDtTay5idWlsdGluLmpzZXZhbD1mdW5jdGlvbihhKXthPVNrLmdsb2JhbC5ldmFsKFNrLmZmaS5yZW1hcFRvSnMoYSkpO3JldHVybiBTay5mZmkucmVtYXBUb1B5KGEpfTtTay5idWlsdGluLmpzbWlsbGlzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKFwianNtaWxsaXMgaXMgZGVwcmVjYXRlZFwiKTtyZXR1cm4obmV3IERhdGUpLnZhbHVlT2YoKX07U2suYnVpbHRpbi5ldmFsXz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJldmFsIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLm1hcD1mdW5jdGlvbihhLGMpe3ZhciBiPVtdLGUsaDtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwibWFwXCIsYXJndW1lbnRzLmxlbmd0aCwyKTtpZigyPGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBkPVtdO3ZhciBnPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpLnNsaWNlKDEpO2ZvcihoPVxuMDtoPGcubGVuZ3RoO2grKyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShnW2hdKSl7dmFyIG49cGFyc2VJbnQoaCwxMCkrMjt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJhcmd1bWVudCBcIituK1wiIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb25cIik7fWdbaF09U2suYWJzdHIuaXRlcihnW2hdKX1mb3IoOzspe3ZhciBrPVtdO2ZvcihoPWU9MDtoPGcubGVuZ3RoO2grKyluPWdbaF0udHAkaXRlcm5leHQoKSx2b2lkIDA9PT1uPyhrLnB1c2goU2suYnVpbHRpbi5ub25lLm5vbmUkKSxlKyspOmsucHVzaChuKTtpZihlIT09Zy5sZW5ndGgpZC5wdXNoKGspO2Vsc2UgYnJlYWt9Yz1uZXcgU2suYnVpbHRpbi5saXN0KGQpfWlmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYyksXG5mdW5jdGlvbihjKXtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKWMgaW5zdGFuY2VvZiBBcnJheSYmKGM9bmV3IFNrLmJ1aWx0aW4udHVwbGUoYykpLGIucHVzaChjKTtlbHNlIHJldHVybiBjIGluc3RhbmNlb2YgQXJyYXl8fChjPVtjXSksU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyksZnVuY3Rpb24oYSl7Yi5wdXNoKGEpfSl9KSxmdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSl9O1NrLmJ1aWx0aW4ucmVkdWNlPWZ1bmN0aW9uKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShjKStcIicgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZVwiKTtjPVNrLmFic3RyLml0ZXIoYyk7aWYodm9pZCAwPT09ZiYmKGY9Yy50cCRpdGVybmV4dCgpLHZvaWQgMD09PWYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZVwiKTtcbnZhciBiPWY7Zm9yKGY9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWY7Zj1jLnRwJGl0ZXJuZXh0KCkpYj1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYixmXSk7cmV0dXJuIGJ9O1NrLmJ1aWx0aW4uc29ydGVkPWZ1bmN0aW9uKGEsYyxmLGwpe2E9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSwhMCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2E9bmV3IFNrLmJ1aWx0aW4ubGlzdChhKTthLmxpc3Qkc29ydChjLGYsbCk7cmV0dXJuIGF9KX07U2suYnVpbHRpbi5maWx0ZXI9ZnVuY3Rpb24oYSxjKXt2YXIgYjtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFwiZmlsdGVyXCIsYXJndW1lbnRzLmxlbmd0aCwyLDIpO2lmKCFTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuW119O1xudmFyIGg9ZnVuY3Rpb24oYSxiKXthLnB1c2goYik7cmV0dXJuIGF9O3ZhciBkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGEpfTtjLm9iJHR5cGU9PT1Tay5idWlsdGluLnN0cj8oZT1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJcIil9LGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zcSRjb25jYXQoYil9LGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9KTpjLm9iJHR5cGU9PT1Tay5idWlsdGluLnR1cGxlJiYoZD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoYSl9KTt2YXIgZz1lKCk7dmFyIG49U2suYWJzdHIuaXRlcihjKTtmb3IoYj1uLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPW4udHAkaXRlcm5leHQoKSllPWE9PT1Tay5idWlsdGluLm5vbmUubm9uZSQ/bmV3IFNrLmJ1aWx0aW4uYm9vbChiKTpTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYSxbYl0pLFNrLm1pc2NldmFsLmlzVHJ1ZShlKSYmKGc9aChnLGIpKTtcbnJldHVybiBkKGcpfTtTay5idWlsdGluLmhhc2F0dHI9ZnVuY3Rpb24oYSxjKXtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nXCIpO2NvbnN0IGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PmEudHAkZ2V0YXR0cihjLCEwKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcikpdGhyb3cgYTt9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYixhPT52b2lkIDA9PT1hP1NrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6U2suYnVpbHRpbi5ib29sLnRydWUkKX07U2suYnVpbHRpbi5wb3c9ZnVuY3Rpb24oYSxjLGYpe2lmKHZvaWQgMD09PWZ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpKXJldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJQb3dcIik7aWYoIShTay5idWlsdGluLmNoZWNrSW50KGEpJiZTay5idWlsdGluLmNoZWNrSW50KGMpJiZcblNrLmJ1aWx0aW4uY2hlY2tJbnQoZikpKXtpZihTay5idWlsdGluLmNoZWNrRmxvYXQoYSl8fFNrLmJ1aWx0aW4uY2hlY2tDb21wbGV4KGEpKXJldHVybiBhLm5iJHBvd2VyKGMsZik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqKiBvciBwb3coKTogJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJywgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGYpK1wiJ1wiKTt9cmV0dXJuIGEubmIkcG93ZXIoYyxmKX07U2suYnVpbHRpbi5xdWl0PWZ1bmN0aW9uKGEpe2E9KG5ldyBTay5idWlsdGluLnN0cihhKSkudjt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeXN0ZW1FeGl0KGEpO307U2suYnVpbHRpbi5pc3N1YmNsYXNzPWZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzXCIpO1xudmFyIGI9U2suYnVpbHRpbi5jaGVja0NsYXNzKGMpO2lmKCEoYnx8YyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImlzc3ViY2xhc3MoKSBhcmcgMiBtdXN0IGJlIGEgY2xhc3Mgb3IgdHVwbGUgb2YgY2xhc3Nlc1wiKTtpZihiKXJldHVybiBhLiRpc1N1YlR5cGUoYyk/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Zm9yKGI9MDtiPGMudi5sZW5ndGg7KytiKWlmKFNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzc3ViY2xhc3MoYSxjLnZbYl0pKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkO3JldHVybiBTay5idWlsdGluLmJvb2wuZmFsc2UkfTtTay5idWlsdGluLmdsb2JhbHM9ZnVuY3Rpb24oKXt2YXIgYSxjPW5ldyBTay5idWlsdGluLmRpY3QoW10pO2ZvcihhIGluIFNrLmdsb2JhbHMpe3ZhciBmPVNrLnVuZml4UmVzZXJ2ZWQoYSk7Yy5tcCRhc3Nfc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihmKSxcblNrLmdsb2JhbHNbYV0pfXJldHVybiBjfTtTay5idWlsdGluLmRpdm1vZD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5hYnN0ci5udW1iZXJCaW5PcChhLGMsXCJEaXZNb2RcIil9O1NrLmJ1aWx0aW4uZm9ybWF0PWZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5zdHIuJGVtcHR5c3RyKTtyZXR1cm4gU2suYWJzdHIub2JqZWN0Rm9ybWF0KGEsYyl9O2NvbnN0IGE9bmV3IE1hcDtsZXQgYz0wO1NrLmJ1aWx0aW4uaWQ9ZnVuY3Rpb24oYil7Y29uc3QgZT1hLmdldChiKTtpZih2b2lkIDAhPT1lKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGUpO2Euc2V0KGIsYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYysrKX07U2suYnVpbHRpbi5ieXRlYXJyYXk9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiYnl0ZWFycmF5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmNhbGxhYmxlPWZ1bmN0aW9uKGEpe3JldHVybiBTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYSk/XG5Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH07U2suYnVpbHRpbi5kZWxhdHRyPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIFNrLmJ1aWx0aW4uc2V0YXR0cihhLGMsdm9pZCAwKX07U2suYnVpbHRpbi5leGVjZmlsZT1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJleGVjZmlsZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5oZWxwPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImhlbHAgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uaXRlcj1mdW5jdGlvbihhLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Tay5hYnN0ci5pdGVyKGEpOlNrLmFic3RyLml0ZXIobmV3IFNrLmJ1aWx0aW4uY2FsbGFibGVfaXRlcl8oYSxjKSl9O1NrLmJ1aWx0aW4ubG9jYWxzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImxvY2FscyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO1xufTtTay5idWlsdGluLm1lbW9yeXZpZXc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwibWVtb3J5dmlldyBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5uZXh0Xz1mdW5jdGlvbihhLGMpe2lmKCFhLnRwJGl0ZXJuZXh0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvclwiKTthPWEudHAkaXRlcm5leHQoKTtpZih2b2lkIDA9PT1hKXtpZihjKXJldHVybiBjO3Rocm93IG5ldyBTay5idWlsdGluLlN0b3BJdGVyYXRpb247fXJldHVybiBhfTtTay5idWlsdGluLnJlbG9hZD1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJyZWxvYWQgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4udmFycz1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJ2YXJzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7XG59O1NrLmJ1aWx0aW4uYXBwbHlfPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImFwcGx5IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fTtTay5idWlsdGluLmJ1ZmZlcj1mdW5jdGlvbigpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJidWZmZXIgaXMgbm90IHlldCBpbXBsZW1lbnRlZFwiKTt9O1NrLmJ1aWx0aW4uY29lcmNlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcImNvZXJjZSBpcyBub3QgeWV0IGltcGxlbWVudGVkXCIpO307U2suYnVpbHRpbi5pbnRlcm49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiaW50ZXJuIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcIik7fX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkJhc2VFeGNlcHRpb25cIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLFwiYmFkIGNhbGwgdG8gZXhjZXB0aW9uIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7bGV0IGM9YVswXTtcInN0cmluZ1wiPT09dHlwZW9mIGMmJihjPW5ldyBTay5idWlsdGluLnN0cihjKSk7dGhpcy5hcmdzPW5ldyBTay5idWlsdGluLnR1cGxlKGM/W2NdOltdKTt0aGlzLnRyYWNlYmFjaz1bXTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3Q7Mzw9YS5sZW5ndGgmJnRoaXMudHJhY2ViYWNrLnB1c2goe2xpbmVubzphWzJdLGZpbGVuYW1lOmFbMV18fFwiPHVua25vd24+XCJ9KX0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGRvYzpcIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9uc1wiLHRwJG5ldyhhLGMpe3RoaXMuaHAkdHlwZT8oYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcixTay5idWlsdGluLkJhc2VFeGNlcHRpb24uY2FsbChjKSk6XG5jPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2MuYXJncz1uZXcgU2suYnVpbHRpbi50dXBsZShhLnNsaWNlKCkpO3JldHVybiBjfSx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhTay5hYnN0ci50eXBlTmFtZSh0aGlzKSxjKX0sJHIoKXtsZXQgYT10aGlzLnRwJG5hbWU7YSs9XCIoXCIrdGhpcy5hcmdzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpLmpvaW4oXCIsIFwiKStcIilcIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGEpfSx0cCRzdHIoKXtyZXR1cm4gMT49dGhpcy5hcmdzLnYubGVuZ3RoP25ldyBTay5idWlsdGluLnN0cih0aGlzLmFyZ3MudlswXSk6dGhpcy5hcmdzLiRyKCl9fSxnZXRzZXRzOnthcmdzOnskZ2V0KCl7cmV0dXJuIHRoaXMuYXJnc319LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH0scHJvdG86e3RvU3RyaW5nKCl7bGV0IGE9dGhpcy50cCRuYW1lO2ErPVwiOiBcIit0aGlzLnRwJHN0cigpLnY7cmV0dXJuIGE9MCE9PXRoaXMudHJhY2ViYWNrLmxlbmd0aD9cbmErKFwiIG9uIGxpbmUgXCIrdGhpcy50cmFjZWJhY2tbMF0ubGluZW5vKTphK1wiIGF0IDx1bmtub3duPlwifX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIixTay5idWlsdGluLkJhc2VFeGNlcHRpb24pO1NrLmJ1aWx0aW4uRXhjZXB0aW9uPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJFeGNlcHRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5CYXNlRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5FeGNlcHRpb25cIixTay5idWlsdGluLkV4Y2VwdGlvbik7U2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiQXNzZXJ0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvclwiLFNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIkF0dHJpYnV0ZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLkltcG9ydEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbXBvcnRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5JbmRlbnRhdGlvbkVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJbmRlbnRhdGlvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsXG5hKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uSW5kZXhFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiSW5kZXhFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5Mb29rdXBFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTG9va3VwRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmJ1aWx0aW4uS2V5RXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIktleUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uTG9va3VwRXJyb3IuYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkxvb2t1cEVycm9yfSk7U2suYnVpbHRpbi5OYW1lRXJyb3I9XG5Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTmFtZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJVbmJvdW5kTG9jYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJPdmVyZmxvd0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlN5bnRheEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJTeW50YXhFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlJ1bnRpbWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiUnVudGltZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJ1bnRpbWVFcnJvclwiLFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKTtTay5idWlsdGluLlN1c3BlbnNpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3VzcGVuc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN1c3BlbnNpb25FcnJvclwiLFxuU2suYnVpbHRpbi5TdXNwZW5zaW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXhpdD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiU3lzdGVtRXhpdFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkJhc2VFeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkJhc2VFeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUV4aXRcIixTay5idWlsdGluLlN5c3RlbUV4aXQpO1NrLmJ1aWx0aW4uVHlwZUVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUeXBlRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uVHlwZUVycm9yXCIsU2suYnVpbHRpbi5UeXBlRXJyb3IpO1NrLmJ1aWx0aW4uVmFsdWVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVmFsdWVFcnJvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlZhbHVlRXJyb3JcIixTay5idWlsdGluLlZhbHVlRXJyb3IpO1NrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlplcm9EaXZpc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5idWlsdGluLlRpbWVMaW1pdEVycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJUaW1lTGltaXRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvclwiLFxuU2suYnVpbHRpbi5UaW1lTGltaXRFcnJvcik7U2suYnVpbHRpbi5JT0Vycm9yPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJJT0Vycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLklPRXJyb3JcIixTay5idWlsdGluLklPRXJyb3IpO1NrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiTm90SW1wbGVtZW50ZWRFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yXCIsU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKTtTay5idWlsdGluLk5lZ2F0aXZlUG93ZXJFcnJvcj1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJOZWdhdGl2ZVBvd2VyRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uTmVnYXRpdmVQb3dlckVycm9yXCIsU2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IpO1NrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiRXh0ZXJuYWxFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXt0aGlzLm5hdGl2ZUVycm9yPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcodGhpcy5uYXRpdmVFcnJvcikmJihhWzBdPXRoaXMubmF0aXZlRXJyb3IudG9TdHJpbmcoKSxhWzBdLnN0YXJ0c1dpdGgoXCJSYW5nZUVycm9yOiBNYXhpbXVtIGNhbGxcIikpKXJldHVybiBhWzBdPVwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIixcbm5ldyBTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yKC4uLmEpO1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLkV4dGVybmFsRXJyb3JcIixTay5idWlsdGluLkV4dGVybmFsRXJyb3IpO1NrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlJlY3Vyc2lvbkVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uUnVudGltZUVycm9yLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlJlY3Vyc2lvbkVycm9yXCIsU2suYnVpbHRpbi5SZWN1cnNpb25FcnJvcik7U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiT3BlcmF0aW9uRXJyb3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxcbmEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5PcGVyYXRpb25FcnJvclwiLFNrLmJ1aWx0aW4uT3BlcmF0aW9uRXJyb3IpO1NrLmJ1aWx0aW4uU3lzdGVtRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN5c3RlbUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlN5c3RlbUVycm9yXCIsU2suYnVpbHRpbi5TeXN0ZW1FcnJvcik7U2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3I9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlVuaWNvZGVEZWNvZGVFcnJvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbiguLi5hKXtTay5idWlsdGluLkV4Y2VwdGlvbi5hcHBseSh0aGlzLGEpfSxiYXNlOlNrLmJ1aWx0aW4uRXhjZXB0aW9ufSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3JcIixcblNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKTtTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcj1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiVW5pY29kZUVuY29kZUVycm9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKC4uLmEpe1NrLmJ1aWx0aW4uRXhjZXB0aW9uLmFwcGx5KHRoaXMsYSl9LGJhc2U6U2suYnVpbHRpbi5FeGNlcHRpb259KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvclwiLFNrLmJ1aWx0aW4uVW5pY29kZUVuY29kZUVycm9yKTtTay5idWlsdGluLlN0b3BJdGVyYXRpb249U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcIlN0b3BJdGVyYXRpb25cIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oLi4uYSl7U2suYnVpbHRpbi5FeGNlcHRpb24uYXBwbHkodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLkV4Y2VwdGlvbn0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvblwiLFNrLmJ1aWx0aW4uU3RvcEl0ZXJhdGlvbik7XG5Tay5idWlsdGluLmdldEV4Y0luZm89ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKFthLm9iJHR5cGV8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxhLFNrLmJ1aWx0aW4ubm9uZS5ub25lJF0pfX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLm1ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kLFwiYmFkIGNhbGwgdG8gbWV0aG9kIGNvbnN0cnVjdG9yLCB1c2UgJ25ldydcIik7dGhpcy5pbV9mdW5jPWE7dGhpcy5pbV9zZWxmPWM7dGhpcy5pbV9jYWxsPWEudHAkY2FsbH0sc2xvdHM6eyRyKCl7bGV0IGE9dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHF1YWxuYW1lKXx8dGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJG5hbWUpO2E9YSYmYS52fHxcIj9cIjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGJvdW5kIG1ldGhvZCBcIitcbmErXCIgb2YgXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLmltX3NlbGYpK1wiPlwiKX0sdHAkaGFzaCgpe2NvbnN0IGE9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX3NlbGYpLGM9U2suYWJzdHIub2JqZWN0SGFzaCh0aGlzLmltX2Z1bmMpO3JldHVybiBhK2N9LHRwJGNhbGwoYSxjKXt2YXIgYj10aGlzLmltX2NhbGw7aWYodm9pZCAwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInXCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5pbV9mdW5jKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTthPVt0aGlzLmltX3NlbGYsLi4uYV07cmV0dXJuIGIuY2FsbCh0aGlzLmltX2Z1bmMsYSxjKX0sdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcIm1ldGhvZFwiLGEsMiwyKTtjPWFbMF07YT1hWzFdO2lmKCFTay5idWlsdGluLmNoZWNrQ2FsbGFibGUoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZVwiKTtcbmlmKFNrLmJ1aWx0aW4uY2hlY2tOb25lKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlbGYgbXVzdCBub3QgYmUgTm9uZVwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubWV0aG9kKGMsYSl9LHRwJHJpY2hjb21wYXJlKGEsYyl7aWYoXCJFcVwiIT1jJiZcIk5vdEVxXCIhPWN8fCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubWV0aG9kKSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7bGV0IGI7dHJ5e2I9U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKHRoaXMuaW1fc2VsZixhLmltX3NlbGYsXCJFcVwiLCExKSYmdGhpcy5pbV9mdW5jPT1hLmltX2Z1bmN9Y2F0Y2goZSl7Yj0hMX1yZXR1cm5cIkVxXCI9PWM/YjohYn0sdHAkZGVzY3JfZ2V0KGEsYyl7cmV0dXJuIHRoaXN9LHRwJGdldGF0dHIoYSxjKXtjb25zdCBiPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwodGhpcyxhKTtyZXR1cm4gdm9pZCAwIT09Yj9iOnRoaXMuaW1fZnVuYy50cCRnZXRhdHRyKGEsXG5jKX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fZnVuY319LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMuaW1fc2VsZn19LF9fZG9jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5pbV9mdW5jLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGRvYyl9fX0sZmxhZ3M6e3NrJHN1aXRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhKXtpZihudWxsIT09YSYmdm9pZCAwIT09YSl7aWYoYS5uYiRpbmRleClyZXR1cm4gYS5uYiRpbmRleCgpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYSYmTnVtYmVyLmlzSW50ZWdlcihhKSlyZXR1cm4gYX19ZnVuY3Rpb24gYyhiLGMpe2NvbnN0IGU9YShiKTtpZih2b2lkIDAhPT1lKXJldHVybiBlO2M9KGN8fFwiJ3t0cCRuYW1lfScgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyXCIpLnJlcGxhY2UoXCJ7dHAkbmFtZX1cIixTay5hYnN0ci50eXBlTmFtZShiKSk7XG50aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYyk7fVNrLm1pc2NldmFsPXt9O1NrLm1pc2NldmFsLlN1c3BlbnNpb249ZnVuY3Rpb24oYSxjLGYpe3RoaXMuJGlzU3VzcGVuc2lvbj0hMDt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiYodGhpcy5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYShjLnJlc3VtZSgpKX0pO3RoaXMuY2hpbGQ9Yzt0aGlzLm9wdGlvbmFsPXZvaWQgMCE9PWMmJmMub3B0aW9uYWw7dGhpcy5kYXRhPXZvaWQgMD09PWYmJnZvaWQgMCE9PWM/Yy5kYXRhOmZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLlN1c3BlbnNpb25cIixTay5taXNjZXZhbC5TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3c9ZnVuY3Rpb24oYSxjKXtmb3IoO2EgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uOyl7aWYoIWEub3B0aW9uYWwpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKGN8fFwiQ2Fubm90IGNhbGwgYSBmdW5jdGlvbiB0aGF0IGJsb2NrcyBvciBzdXNwZW5kcyBoZXJlXCIpO1xuYT1hLnJlc3VtZSgpfXJldHVybiBhfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3dcIixTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3cpO1NrLm1pc2NldmFsLmlzSW5kZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5uYiRpbmRleHx8XCJudW1iZXJcIj09PXR5cGVvZiBhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNJbmRleFwiLFNrLm1pc2NldmFsLmlzSW5kZXgpO1NrLm1pc2NldmFsLmFzSW5kZXg9YTtTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQ9ZnVuY3Rpb24oYSxlLGYpe2Y9YyhhLGYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgZilyZXR1cm4gZjtpZihudWxsPT1lKXJldHVybiBKU0JJLmxlc3NUaGFuKGYsSlNCSS5fX1pFUk8pPy1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUjpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbnRocm93IG5ldyBlKFwiY2Fubm90IGZpdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlclwiKTt9O1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93PWM7U2subWlzY2V2YWwuYXBwbHlTbGljZT1mdW5jdGlvbihhLGMsZixsKXtyZXR1cm4gU2suYWJzdHIub2JqZWN0R2V0SXRlbShhLG5ldyBTay5idWlsdGluLnNsaWNlKGMsZixudWxsKSxsKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlTbGljZVwiLFNrLm1pc2NldmFsLmFwcGx5U2xpY2UpO1NrLm1pc2NldmFsLmFzc2lnblNsaWNlPWZ1bmN0aW9uKGEsYyxmLGwsaCl7Yz1uZXcgU2suYnVpbHRpbi5zbGljZShjLGYpO3JldHVybiBudWxsPT09bD9Tay5hYnN0ci5vYmplY3REZWxJdGVtKGEsYyk6U2suYWJzdHIub2JqZWN0U2V0SXRlbShhLGMsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXNzaWduU2xpY2VcIixTay5taXNjZXZhbC5hc3NpZ25TbGljZSk7XG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHM9ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMSE9YS5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9YVswXTtjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQ/Yz1jLnRwJGl0ZXIoKS4kb2JqOmMgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QmJihjPVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUua2V5cy5mdW5jX2NvZGUoYykpO2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3R8fGMgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlKXJldHVybiBjLnY7aWYoU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGMpKXthPVtdO2M9U2suYWJzdHIuaXRlcihjKTtmb3IoYj1jLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWMudHAkaXRlcm5leHQoKSlhLnB1c2goYik7cmV0dXJuIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGMpK1wiJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXJyYXlGcm9tQXJndW1lbnRzXCIsXG5Tay5taXNjZXZhbC5hcnJheUZyb21Bcmd1bWVudHMpO1NrLm1pc2NldmFsLml0ZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy50cCRpdGVybmV4dD1jP2E6ZnVuY3Rpb24oYil7bGV0IGM9YSgpO3JldHVybiBifHwhYy4kaXNTdXNwZW5zaW9uP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfX0saXRlcm5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoYSl9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2subWlzY2V2YWwuc3dhcHBlZE9wXz17RXE6XCJFcVwiLE5vdEVxOlwiTm90RXFcIixMdDpcIkd0XCIsTHRFOlwiR3RFXCIsR3Q6XCJMdFwiLEd0RTpcIkx0RVwifTtTay5taXNjZXZhbC5vcFN5bWJvbHM9e0VxOlwiPT1cIixOb3RFcTpcIiE9XCIsTHQ6XCI8XCIsTHRFOlwiPD1cIixHdDpcIj5cIixHdEU6XCI+PVwiLElzOlwiaXNcIixJc05vdDpcImlzIG5vdFwiLFxuSW5fOlwiaW5cIixOb3RJbjpcIm5vdCBpblwifTtTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2w9ZnVuY3Rpb24oYSxjLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQoYS5zayRvYmplY3QmJmMuc2skb2JqZWN0LFwiSlMgb2JqZWN0IHBhc3NlZCB0byByaWNoQ29tcGFyZUJvb2xcIik7dmFyIGI7dmFyIGQ9YS5vYiR0eXBlO3ZhciBlPWMub2IkdHlwZSxuPWUhPT1kJiZ2b2lkIDA9PT1lLnNrJGJhc2VDbGFzcyYmZS4kaXNTdWJUeXBlKGQpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmQhPT1lJiYoXCJHdEVcIj09PWZ8fFwiR3RcIj09PWZ8fFwiTHRFXCI9PT1mfHxcIkx0XCI9PT1mKSl7dmFyIGs9W1NrLmJ1aWx0aW4uZmxvYXRfLFNrLmJ1aWx0aW4uaW50XyxTay5idWlsdGluLmxuZyxTay5idWlsdGluLmJvb2xdLHA9W1NrLmJ1aWx0aW4uZGljdCxTay5idWlsdGluLmVudW1lcmF0ZSxTay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbi5saXN0LFNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGluLnN0cixTay5idWlsdGluLnR1cGxlLFxuU2suYnVpbHRpbi56aXBfXTtjb25zdCBiPWsuaW5kZXhPZihkKSxnPXAuaW5kZXhPZihkKTtrPWsuaW5kZXhPZihlKTtwPXAuaW5kZXhPZihlKTtpZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXN3aXRjaChmKXtjYXNlIFwiTHRcIjpyZXR1cm4hMDtjYXNlIFwiTHRFXCI6cmV0dXJuITA7Y2FzZSBcIkd0XCI6cmV0dXJuITE7Y2FzZSBcIkd0RVwiOnJldHVybiExfWlmKGM9PT1Tay5idWlsdGluLm5vbmUubm9uZSQpc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtjYXNlIFwiR3RFXCI6cmV0dXJuITB9aWYoLTEhPT1iJiYtMSE9PXApc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiEwO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMDtjYXNlIFwiR3RcIjpyZXR1cm4hMTtjYXNlIFwiR3RFXCI6cmV0dXJuITF9aWYoLTEhPT1nJiYtMSE9PWspc3dpdGNoKGYpe2Nhc2UgXCJMdFwiOnJldHVybiExO2Nhc2UgXCJMdEVcIjpyZXR1cm4hMTtjYXNlIFwiR3RcIjpyZXR1cm4hMDtcbmNhc2UgXCJHdEVcIjpyZXR1cm4hMH1pZigtMSE9PWcmJi0xIT09cClzd2l0Y2goZil7Y2FzZSBcIkx0XCI6cmV0dXJuIGc8cDtjYXNlIFwiTHRFXCI6cmV0dXJuIGc8PXA7Y2FzZSBcIkd0XCI6cmV0dXJuIGc+cDtjYXNlIFwiR3RFXCI6cmV0dXJuIGc+PXB9fWlmKFwiSXNcIj09PWYpe2lmKGQ9PT1lKXtpZihhPT09YylyZXR1cm4hMDtpZihkPT09U2suYnVpbHRpbi5mbG9hdF8pcmV0dXJuIGEudj09PWMudjtpZihkPT09U2suYnVpbHRpbi5pbnRfKXJldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYS52JiZcIm51bWJlclwiPT09dHlwZW9mIGEudj9hLnY9PT1jLnY6SlNCSS5lcXVhbChKU0JJLkJpZ0ludChhLnYpLEpTQkkuQmlnSW50KGMudikpfXJldHVybiExfWlmKFwiSXNOb3RcIj09PWYpcmV0dXJuIGQhPT1lPyEwOmQ9PT1Tay5idWlsdGluLmZsb2F0Xz9hLnYhPT1jLnY6ZD09PVNrLmJ1aWx0aW4uaW50Xz9cIm51bWJlclwiPT09dHlwZW9mIGEudiYmXCJudW1iZXJcIj09PXR5cGVvZiBhLnY/YS52IT09Yy52OkpTQkkubm90RXF1YWwoSlNCSS5CaWdJbnQoYS52KSxcbkpTQkkuQmlnSW50KGMudikpOmEhPT1jO2lmKFwiSW5cIj09PWYpcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYyxhLGwpLFNrLm1pc2NldmFsLmlzVHJ1ZSk7aWYoXCJOb3RJblwiPT09ZilyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYWJzdHIuc2VxdWVuY2VDb250YWlucyhjLGEsbCksZnVuY3Rpb24oYSl7cmV0dXJuIVNrLm1pc2NldmFsLmlzVHJ1ZShhKX0pO2U9e0VxOlwib2IkZXFcIixOb3RFcTpcIm9iJG5lXCIsR3Q6XCJvYiRndFwiLEd0RTpcIm9iJGdlXCIsTHQ6XCJvYiRsdFwiLEx0RTpcIm9iJGxlXCJ9O2Q9ZVtmXTtpZihuJiYobD1lW1NrLm1pc2NldmFsLnN3YXBwZWRPcF9bZl1dLGNbbF0hPT1hW2xdJiYoYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXx8KGI9YVtkXShjKSkhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJHx8IW4mJihsPWVbU2subWlzY2V2YWwuc3dhcHBlZE9wX1tmXV0sXG4oYj1jW2xdKGEpKSE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKSlyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGIpO2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpe2lmKG49U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRjbXApKXRyeXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShuLFtjXSk7aWYoU2suYnVpbHRpbi5jaGVja051bWJlcihiKSl7Yj1Tay5idWlsdGluLmFzbnVtJChiKTtpZihcIkVxXCI9PT1mKXJldHVybiAwPT09YjtpZihcIk5vdEVxXCI9PT1mKXJldHVybiAwIT09YjtpZihcIkx0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJHdFwiPT09ZilyZXR1cm4gMDxiO2lmKFwiTHRFXCI9PT1mKXJldHVybiAwPj1iO2lmKFwiR3RFXCI9PT1mKXJldHVybiAwPD1ifWlmKGIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTt9aWYobj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGMsU2suYnVpbHRpbi5zdHIuJGNtcCkpdHJ5e2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KG4sW2FdKTtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGIpKXtiPVNrLmJ1aWx0aW4uYXNudW0kKGIpO2lmKFwiRXFcIj09PWYpcmV0dXJuIDA9PT1iO2lmKFwiTm90RXFcIj09PWYpcmV0dXJuIDAhPT1iO2lmKFwiTHRcIj09PWYpcmV0dXJuIDA8YjtpZihcIkd0XCI9PT1mKXJldHVybiAwPmI7aWYoXCJMdEVcIj09PWYpcmV0dXJuIDA8PWI7aWYoXCJHdEVcIj09PWYpcmV0dXJuIDA+PWJ9aWYoYiE9PVNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBhcmlzb24gZGlkIG5vdCByZXR1cm4gYW4gaW50XCIpO31jYXRjaCh1KXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludFwiKTtcbn1pZihhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiZjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZihcIkVxXCI9PT1mKXJldHVybiBhLnY9PT1jLnY7aWYoXCJOb3RFcVwiPT09ZilyZXR1cm4gYS52IT09Yy52O2lmKFwiR3RcIj09PWYpcmV0dXJuIGEudj5jLnY7aWYoXCJHdEVcIj09PWYpcmV0dXJuIGEudj49Yy52O2lmKFwiTHRcIj09PWYpcmV0dXJuIGEudjxjLnY7aWYoXCJMdEVcIj09PWYpcmV0dXJuIGEudjw9Yy52fX1pZihcIkVxXCI9PT1mKXJldHVybiBhPT09YztpZihcIk5vdEVxXCI9PT1mKXJldHVybiBhIT09YzthPVNrLmFic3RyLnR5cGVOYW1lKGEpO2M9U2suYWJzdHIudHlwZU5hbWUoYyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLm1pc2NldmFsLm9wU3ltYm9sc1tmXStcIicgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnXCIrYStcIicgYW5kICdcIitjK1wiJ1wiKTt9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbFwiLFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbCk7XG5Tay5taXNjZXZhbC5vYmplY3RSZXByPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ0cnlpbmcgdG8gcmVwciB1bmRlZmluZWRcIik7aWYobnVsbCE9PWEmJmEuJHIpcmV0dXJuIGEuJHIoKS52O3RyeXtyZXR1cm4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS52fWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLlR5cGVFcnJvcilyZXR1cm5cIjx1bmtub3duPlwiO3Rocm93IGU7fX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwub2JqZWN0UmVwclwiLFNrLm1pc2NldmFsLm9iamVjdFJlcHIpO1NrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHk9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgXCJMdEVcIjpjYXNlIFwiRXFcIjpjYXNlIFwiR3RFXCI6cmV0dXJuITB9cmV0dXJuITF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLm9wQWxsb3dzRXF1YWxpdHlcIixTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KTtTay5taXNjZXZhbC5pc1RydWU9ZnVuY3Rpb24oYSl7cmV0dXJuITA9PT1cbmF8fGE9PT1Tay5idWlsdGluLmJvb2wudHJ1ZSQ/ITA6ITE9PT1hfHxhPT09U2suYnVpbHRpbi5ib29sLmZhbHNlJHx8bnVsbD09PWF8fHZvaWQgMD09PWE/ITE6YS5uYiRib29sP2EubmIkYm9vbCgpOmEuc3EkbGVuZ3RoPzAhPT1hLnNxJGxlbmd0aCgpOiEhYX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuaXNUcnVlXCIsU2subWlzY2V2YWwuaXNUcnVlKTtTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSExO1NrLm1pc2NldmFsLnByaW50Xz1mdW5jdGlvbihhKXtTay5taXNjZXZhbC5zb2Z0c3BhY2VfJiYoXCJcXG5cIiE9PWEmJlNrLm91dHB1dChcIiBcIiksU2subWlzY2V2YWwuc29mdHNwYWNlXz0hMSk7dmFyIGI9bmV3IFNrLmJ1aWx0aW4uc3RyKGEpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5pbXBvcnRNb2R1bGUoXCJzeXNcIiwhMSwhMCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5KGEuJGQuc3Rkb3V0LndyaXRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLFthLiRkLnN0ZG91dCxcbmJdKX0sZnVuY3Rpb24oKXt2YXIgYTsoYT0wPT09Yi52Lmxlbmd0aCl8fChhPWIudltiLnYubGVuZ3RoLTFdLGE9IShcIlxcblwiPT09YXx8XCJcXHRcIj09PWF8fFwiXFxyXCI9PT1hKSk7aWYoYXx8XCIgXCI9PT1iLnZbYi52Lmxlbmd0aC0xXSlTay5taXNjZXZhbC5zb2Z0c3BhY2VfPSEwfSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByaW50X1wiLFNrLm1pc2NldmFsLnByaW50Xyk7U2subWlzY2V2YWwubG9hZG5hbWU9ZnVuY3Rpb24oYSxjKXtjPWNbYV07aWYodm9pZCAwIT09YylyZXR1cm4gYztjPVNrLmJ1aWx0aW5zW2FdO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uTmFtZUVycm9yKFwibmFtZSAnXCIrU2sudW5maXhSZXNlcnZlZChhKStcIicgaXMgbm90IGRlZmluZWRcIik7fTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5sb2FkbmFtZVwiLFNrLm1pc2NldmFsLmxvYWRuYW1lKTtTay5taXNjZXZhbC5jYWxsPWZ1bmN0aW9uKGEsYyxmLGwsaCl7aD1cbkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHkoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbFwiLFNrLm1pc2NldmFsLmNhbGwpO1NrLm1pc2NldmFsLmNhbGxBc3luYz1mdW5jdGlvbihhLGMsZixsLGgsZCl7ZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsNSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5QXN5bmMoYSxjLGYsbCxoLGQpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsQXN5bmNcIixTay5taXNjZXZhbC5jYWxsQXN5bmMpO1NrLm1pc2NldmFsLmNhbGxPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXtoPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyw0KTtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYSxjLGYsbCxoKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZFwiLFxuU2subWlzY2V2YWwuY2FsbE9yU3VzcGVuZCk7U2subWlzY2V2YWwuY2FsbHNpbT1mdW5jdGlvbihhLGMpe2M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltXCIsU2subWlzY2V2YWwuY2FsbHNpbSk7U2subWlzY2V2YWwuY2FsbHNpbUFycmF5PWZ1bmN0aW9uKGEsYyxmKXtjPWN8fFtdO3JldHVybiBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGEsYyxmKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1BcnJheVwiLFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSk7U2subWlzY2V2YWwuY2FsbHNpbUFzeW5jPWZ1bmN0aW9uKGEsYyxmKXtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyxcbjIpO3JldHVybiBTay5taXNjZXZhbC5hcHBseUFzeW5jKGEsYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCxmKX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jXCIsU2subWlzY2V2YWwuY2FsbHNpbUFzeW5jKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kPWZ1bmN0aW9uKGEsYyl7Yz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFNrLm1pc2NldmFsLmFwcGx5T3JTdXNwZW5kKGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAsYyl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKTtTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXk9ZnVuY3Rpb24oYSxjLGYpe2M9Y3x8W107cmV0dXJuIHZvaWQgMCE9PWEmJmEudHAkY2FsbD9hLnRwJGNhbGwoYyxmKTpTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLHZvaWQgMCx2b2lkIDAsZixcbmMpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXlcIixTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkpO1NrLm1pc2NldmFsLmFwcGx5PWZ1bmN0aW9uKGEsYyxmLGwsaCl7YT1Tay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChhLGMsZixsLGgpO3JldHVybiBhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuU3VzcGVuc2lvbj9Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYSk6YX07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlcIixTay5taXNjZXZhbC5hcHBseSk7U2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2U9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYixlKXt0cnl7KGZ1bmN0aW9uIGcoYSl7dHJ5e2Zvcih2YXIgZD1mdW5jdGlvbigpe3RyeXtnKGEucmVzdW1lKCkpfWNhdGNoKHQpe2UodCl9fSxmPWZ1bmN0aW9uKGIpe3RyeXthLmRhdGEucmVzdWx0PWIsXG5kKCl9Y2F0Y2godil7ZSh2KX19LHA9ZnVuY3Rpb24oYil7dHJ5e2EuZGF0YS5lcnJvcj1iLGQoKX1jYXRjaCh2KXtlKHYpfX07YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb247KXt2YXIgbD1jJiYoY1thLmRhdGEudHlwZV18fGNbXCIqXCJdKTtpZihsKXt2YXIgQT1sKGEpO2lmKEEpe0EudGhlbihnLGUpO3JldHVybn19aWYoXCJTay5wcm9taXNlXCI9PWEuZGF0YS50eXBlKXthLmRhdGEucHJvbWlzZS50aGVuKGYscCk7cmV0dXJufWlmKFwiU2sueWllbGRcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKFwiU2suZGVsYXlcIj09YS5kYXRhLnR5cGUpe1NrLmdsb2JhbC5zZXRJbW1lZGlhdGUoZCk7cmV0dXJufWlmKGEub3B0aW9uYWwpYT1hLnJlc3VtZSgpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3VzcGVuc2lvbkVycm9yKFwiVW5oYW5kbGVkIG5vbi1vcHRpb25hbCBzdXNwZW5zaW9uIG9mIHR5cGUgJ1wiK2EuZGF0YS50eXBlK1wiJ1wiKTtcbn1iKGEpfWNhdGNoKHQpe2UodCl9fSkoYSgpKX1jYXRjaChoKXtlKGgpfX0pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5hc3luY1RvUHJvbWlzZVwiLFNrLm1pc2NldmFsLmFzeW5jVG9Qcm9taXNlKTtTay5taXNjZXZhbC5hcHBseUFzeW5jPWZ1bmN0aW9uKGEsYyxmLGwsaCxkKXtyZXR1cm4gU2subWlzY2V2YWwuYXN5bmNUb1Byb21pc2UoZnVuY3Rpb24oKXtyZXR1cm4gU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQoYyxmLGwsaCxkKX0sYSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLmFwcGx5QXN5bmNcIixTay5taXNjZXZhbC5hcHBseUFzeW5jKTtTay5taXNjZXZhbC5jaGFpbj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgYj0xLGU9YSxoLGQ7Oyl7aWYoYj09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZTtpZihlJiZlLiRpc1N1c3BlbnNpb24pYnJlYWs7ZT1hcmd1bWVudHNbYl0oZSk7YisrfWQ9QXJyYXkoYXJndW1lbnRzLmxlbmd0aC1iKTtmb3IoaD0wO2g8YXJndW1lbnRzLmxlbmd0aC1cbmI7aCsrKWRbaF09YXJndW1lbnRzW2IraF07aD0wO3JldHVybiBmdW5jdGlvbiBrKGEpe2Zvcig7aDxkLmxlbmd0aDspe2lmKGEgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uKXJldHVybiBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbihrLGEpO2E9ZFtoXShhKTtoKyt9cmV0dXJuIGF9KGUpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5jaGFpblwiLFNrLm1pc2NldmFsLmNoYWluKTtTay5taXNjZXZhbC50cnlDYXRjaD1mdW5jdGlvbihhLGMpe3RyeXt2YXIgYj1hKCl9Y2F0Y2gobCl7cmV0dXJuIGMobCl9cmV0dXJuIGIgaW5zdGFuY2VvZiBTay5taXNjZXZhbC5TdXNwZW5zaW9uPyhhPW5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKHZvaWQgMCxiKSxhLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC50cnlDYXRjaChiLnJlc3VtZSxjKX0sYSk6Yn07U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwudHJ5Q2F0Y2hcIixTay5taXNjZXZhbC50cnlDYXRjaCk7XG5Tay5taXNjZXZhbC5pdGVyRm9yPWZ1bmN0aW9uKGEsYyxmKXt2YXIgYj1mLGU9ZnVuY3Rpb24oYyl7Yj1jO3JldHVybiBjIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWs/YzphLnRwJGl0ZXJuZXh0KCEwKX07cmV0dXJuIGZ1bmN0aW9uIG4oYSl7Zm9yKDt2b2lkIDAhPT1hOyl7aWYoYSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKG4sYSk7aWYoYT09PVNrLm1pc2NldmFsLkJyZWFrfHxhIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspcmV0dXJuIGEuYnJWYWx1ZTthPVNrLm1pc2NldmFsLmNoYWluKGMoYSxiKSxlKX1yZXR1cm4gYn0oYS50cCRpdGVybmV4dCghMCkpfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5pdGVyRm9yXCIsU2subWlzY2V2YWwuaXRlckZvcik7U2subWlzY2V2YWwuaXRlckFycmF5PWZ1bmN0aW9uKGEsYyxmKXtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpLFxuXCJpdGVyQXJncyByZXF1aXJlcyBhbiBhcnJheVwiKTtsZXQgYj0wO3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKHt0cCRpdGVybmV4dDooKT0+YVtiKytdfSxjLGYpfTtTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZT1mdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PWEpcmV0dXJuW107aWYodm9pZCAwPT09YS5ocCR0eXBlJiZ2b2lkIDAhPT1hLnNrJGFzYXJyYXkpcmV0dXJuIGEuc2skYXNhcnJheSgpO2NvbnN0IGI9W107YT1Tay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2IucHVzaChhKX0pLCgpPT5iKTtyZXR1cm4gYz9hOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhhKX07U2subWlzY2V2YWwuQnJlYWs9ZnVuY3Rpb24oYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2subWlzY2V2YWwuQnJlYWspKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoYSk7dGhpcy5iclZhbHVlPWF9O1NrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLkJyZWFrXCIsXG5Tay5taXNjZXZhbC5CcmVhayk7U2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmQ9ZnVuY3Rpb24oYSxjLGYsbCxoKXt2YXIgYjtpZihudWxsPT1hfHxhPT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShhKStcIicgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZVwiKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmdm9pZCAwPT09YS50cCRjYWxsJiYoYT1uZXcgU2suYnVpbHRpbi5mdW5jKGEpKTt2YXIgZT1hLnRwJGNhbGw7aWYodm9pZCAwIT09ZSl7aWYoZilmb3IoZj1mLnRwJGl0ZXIoKSxiPWYudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1iO2I9Zi50cCRpdGVybmV4dCgpKWgucHVzaChiKTtpZihjKWZvcihmPVNrLmFic3RyLml0ZXIoYyksYj1mLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YjtiPWYudHAkaXRlcm5leHQoKSl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiRnVuY3Rpb24ga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzXCIpO1xubC5wdXNoKGIudik7bC5wdXNoKFNrLmFic3RyLm9iamVjdEdldEl0ZW0oYyxiLCExKSl9cmV0dXJuIGUuY2FsbChhLGgsbCxjKX1lPWEuX19jYWxsX187aWYodm9pZCAwIT09ZSlyZXR1cm4gaC51bnNoaWZ0KGEpLFNrLm1pc2NldmFsLmFwcGx5KGUsYyxmLGwsaCk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlXCIpO307U2suZXhwb3J0U3ltYm9sKFwiU2subWlzY2V2YWwuYXBwbHlPclN1c3BlbmRcIixTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZCk7U2subWlzY2V2YWwucHJvbWlzZVRvU3VzcGVuc2lvbj1mdW5jdGlvbihhKXt2YXIgYj1uZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbjtiLnJlc3VtZT1mdW5jdGlvbigpe2lmKGIuZGF0YS5lcnJvcil0aHJvdyBiLmRhdGEuZXJyb3I7cmV0dXJuIGIuZGF0YS5yZXN1bHR9O2IuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBifTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLm1pc2NldmFsLnByb21pc2VUb1N1c3BlbnNpb25cIixTay5taXNjZXZhbC5wcm9taXNlVG9TdXNwZW5zaW9uKTtTay5taXNjZXZhbC5idWlsZENsYXNzPWZ1bmN0aW9uKGEsYyxmLGwsaCl7dmFyIGI9U2suYnVpbHRpbi50eXBlLGU9e307YyhhLGUsdm9pZCAwPT09aD97fTpoKTthLl9fbmFtZV9fJiYoZS5fX21vZHVsZV9fPWEuX19uYW1lX18pO2E9bmV3IFNrLmJ1aWx0aW4uc3RyKGYpO2w9bmV3IFNrLmJ1aWx0aW4udHVwbGUobCk7Yz1bXTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihuKSksYy5wdXNoKGVbbl0pKTtjPW5ldyBTay5idWlsdGluLmRpY3QoYyk7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShiLFthLGwsY10pfTtTay5leHBvcnRTeW1ib2woXCJTay5taXNjZXZhbC5idWlsZENsYXNzXCIsU2subWlzY2V2YWwuYnVpbGRDbGFzcyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXz1cblNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImNhbGxhYmxlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYyl7aWYoIVNrLmJ1aWx0aW4uY2hlY2tDYWxsYWJsZShhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpdGVyKHYsIHcpOiB2IG11c3QgYmUgY2FsbGFibGVcIik7dGhpcy4kY2FsbGFibGU9YTt0aGlzLiRzZW50aW5lbD1jO3RoaXMuJGZsYWc9ITF9LGl0ZXJuZXh0KGEpe2lmKCEwIT09dGhpcy4kZmxhZyl7aWYoYSlyZXR1cm4gYT1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kY2FsbGFibGUsW10pLFNrLm1pc2NldmFsLmNoYWluKGEsYT0+e2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLHRoaXMuJHNlbnRpbmVsLFwiRXFcIiwhMCkpdGhpcy4kZmxhZz0hMDtlbHNlIHJldHVybiBhfSk7YT1Tay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy4kY2FsbGFibGUsW10pO2lmKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChhLFxudGhpcy4kc2VudGluZWwsXCJFcVwiLCExKSl0aGlzLiRmbGFnPSEwO2Vsc2UgcmV0dXJuIGF9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2VxX2l0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIml0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWF9LGl0ZXJuZXh0KGEpe2xldCBjO2M9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PnRoaXMuJHNlcS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpbmRleCsrKSxhKSxhPT57aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5JbmRleEVycm9yfHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5TdG9wSXRlcmF0aW9uKSl0aHJvdyBhO30pO3JldHVybiBhP2M6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGMpfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186eyRmbGFnczp7Tm9BcmdzOiEwfSxcbiRtZXRoKCl7aWYodGhpcy4kc2VxLnNxJGxlbmd0aClyZXR1cm4gdGhpcy4kc2VxLnNxJGxlbmd0aCgpLXRoaXMuJGluZGV4O3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJsZW4gaXMgbm90IGltcGxlbWVudGVkIGZvciBcIitTay5hYnN0ci50eXBlTmFtZSh0aGlzLiRzZXEpKTt9fX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmNhbGxhYmxlX2l0ZXJfXCIsU2suYnVpbHRpbi5jYWxsYWJsZV9pdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5saXN0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsaXN0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWE/YT1bXTpBcnJheS5pc0FycmF5KGEpfHwoYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSk7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdCxcImJhZCBjYWxsIHRvIGxpc3QsIHVzZSAnbmV3JyB3aXRoIGFuIEFycmF5IG9mIHB5dGhvbiBvYmplY3RzXCIpO1xudGhpcy52PWE7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCx0cCRkb2M6XCJCdWlsdC1pbiBtdXRhYmxlIHNlcXVlbmNlLlxcblxcbklmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSBsaXN0LlxcblRoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGl0ZXJhYmxlIGlmIHNwZWNpZmllZC5cIix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJsaXN0XCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwibGlzdFwiLGEsMCwxKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYVswXSwhMCksYT0+e3RoaXMudj1hfSl9LCRyKCl7aWYodGhpcy5pbiRyZXByKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbLi4uXVwiKTtcbnRoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMudi5tYXAoYT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJbXCIrYS5qb2luKFwiLCBcIikrXCJdXCIpfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxpc3QpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIGxpc3QgdG8gbGlzdFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYuY29uY2F0KGEudikpfSxzcSRjb250YWlucyhhKXtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZihjPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGMsXG5hLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9LHNxJHJlcGVhdChhKXtpZighU2subWlzY2V2YWwuaXNJbmRleChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtdWx0aXBseSBzZXF1ZW5jZSBieSBub24taW50IG9mIHR5cGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJ1wiKTthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoYSp0aGlzLnYubGVuZ3RoPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYil9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXJldHVybiBhPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvciksXG5hPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGluZGV4IG91dCBvZiByYW5nZVwiKSx0aGlzLnZbYV07aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIHNsaWNlcywgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpKTt9LG1wJGFzc19zdWJzY3JpcHQoYSxjKXt2b2lkIDA9PT1jP3RoaXMuZGVsJHN1YnNjcmlwdChhKTp0aGlzLmFzcyRzdWJzY3JpcHQoYSxjKX0sc3EkaW5wbGFjZV9jb25jYXQoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLHRoaXMpOlNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT57dGhpcy52LnB1c2goYSl9KSxcbigpPT50aGlzKX0sc3EkaW5wbGFjZV9yZXBlYXQoYSl7aWYoIVNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCBvZiB0eXBlICdcIitTay5hYnN0ci50eXBlTmFtZShhKStcIidcIik7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2NvbnN0IGI9dGhpcy52Lmxlbmd0aDtpZigwPj1hKXRoaXMudi5sZW5ndGg9MDtlbHNlIGlmKGEqYj5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUil0aHJvdyBuZXcgU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yO2ZvcihsZXQgYz0xO2M8YTtjKyspZm9yKGxldCBhPTA7YTxiO2ErKyl0aGlzLnYucHVzaCh0aGlzLnZbYV0pO3JldHVybiB0aGlzfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgYyh0aGlzKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUgbGlzdC5cIn0sY2xlYXI6eyRtZXRoKCl7dGhpcy52Lmxlbmd0aD0wO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIGxpc3QuXCJ9LGNvcHk6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy52LnNsaWNlKDApKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGxpc3QuXCJ9LGFwcGVuZDp7JG1ldGgoYSl7dGhpcy52LnB1c2goYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBvYmplY3QsIC8pXCIsJGRvYzpcIkFwcGVuZCBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cIn0saW5zZXJ0OnskbWV0aChhLFxuYyl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpOyh7c3RhcnQ6YX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxhKSk7dGhpcy52LnNwbGljZShhLDAsYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwgaW5kZXgsIG9iamVjdCwgLylcIiwkZG9jOlwiSW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXguXCJ9LGV4dGVuZDp7JG1ldGgoYSl7cmV0dXJuIGE9PT10aGlzPyh0aGlzLnYucHVzaCguLi50aGlzLnYpLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCk6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9Pnt0aGlzLnYucHVzaChhKX0pLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIGl0ZXJhYmxlLCAvKVwiLCRkb2M6XCJFeHRlbmQgbGlzdCBieSBhcHBlbmRpbmcgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmFibGUuXCJ9LFxucG9wOnskbWV0aChhKXthPXZvaWQgMD09PWE/dGhpcy52Lmxlbmd0aC0xOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwicG9wIGluZGV4IG91dCBvZiByYW5nZVwiKTtjb25zdCBiPXRoaXMudlthXTt0aGlzLnYuc3BsaWNlKGEsMSk7cmV0dXJuIGJ9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGluZGV4PS0xLCAvKVwiLCRkb2M6XCJSZW1vdmUgYW5kIHJldHVybiBpdGVtIGF0IGluZGV4IChkZWZhdWx0IGxhc3QpLlxcblxcblJhaXNlcyBJbmRleEVycm9yIGlmIGxpc3QgaXMgZW1wdHkgb3IgaW5kZXggaXMgb3V0IG9mIHJhbmdlLlwifSxyZW1vdmU6eyRtZXRoKGEpe2E9dGhpcy5saXN0JGluZGV4T2YoYSk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdFwiKTt0aGlzLnYuc3BsaWNlKGEsXG4xKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZW1vdmUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB2YWx1ZS5cXG5cXG5SYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuXCJ9LHNvcnQ6eyRtZXRoKGEsYyl7aWYoYS5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic29ydCgpIHRha2VzIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpO2NvbnN0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImtleVwiLFwicmV2ZXJzZVwiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXSk7cmV0dXJuIHRoaXMubGlzdCRzb3J0KHZvaWQgMCxiLGUpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpXCIsXG4kZG9jOlwiU3RhYmxlIHNvcnQgKklOIFBMQUNFKi5cIn0saW5kZXg6eyRtZXRoKGEsYyxmKXtpZih2b2lkIDAhPT1jJiYhU2subWlzY2V2YWwuaXNJbmRleChjKXx8dm9pZCAwIT09ZiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoZikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKTtjPXRoaXMubGlzdCRpbmRleE9mKGEsYyxmKTtpZigtMT09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiIGlzIG5vdCBpbiBsaXN0XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRzZWxmLCB2YWx1ZSwgc3RhcnQ9MCwgc3RvcD1zeXMubWF4c2l6ZSwgLylcIiwkZG9jOlwiUmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC5cIn0sXG5jb3VudDp7JG1ldGgoYSl7bGV0IGI9MDtjb25zdCBjPXRoaXMudi5sZW5ndGg7Zm9yKGxldCBlPTA7ZTxjO2UrKylpZih0aGlzLnZbZV09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2VdLGEsXCJFcVwiKSliKz0xO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCAvKVwiLCRkb2M6XCJSZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlLlwifSxyZXZlcnNlOnskbWV0aCgpe3RoaXMubGlzdCRyZXZlcnNlKCk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXZlcnNlICpJTiBQTEFDRSouXCJ9fSxwcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9LGxpc3Qkc29ydDpmdW5jdGlvbihhLGMsZil7Y29uc3QgYj1udWxsIT1jJiZjIT09U2suYnVpbHRpbi5ub25lLm5vbmUkO1xudmFyIGU9bnVsbCE9YSYmYSE9PVNrLmJ1aWx0aW4ubm9uZS5ub25lJDtsZXQgZDtpZih2b2lkIDA9PT1mKWQ9ITE7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrSW50KGYpKWQ9U2subWlzY2V2YWwuaXNUcnVlKGYpO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYW4gaW50ZWdlciBpcyByZXF1aXJlZFwiKTtmPW5ldyBTay5idWlsdGluLnRpbVNvcnQodGhpcyk7dGhpcy52PVtdO2NvbnN0IGc9bmV3IFNrLmJ1aWx0aW4uaW50XygwKTtpZihiKXtmLmx0PWU/ZnVuY3Rpb24oYixjKXtiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtiWzBdLGNbMF1dKTtyZXR1cm4gU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsZyxcIkx0XCIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYVswXSxiWzBdLFwiTHRcIil9O2ZvcihsZXQgYT0wO2E8Zi5saXN0bGVuZ3RoO2ErKyl7ZT1mLmxpc3QudlthXTtjb25zdCBiPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShjLFxuW2VdKTtmLmxpc3QudlthXT1bYixlXX19ZWxzZSBlJiYoZi5sdD1mdW5jdGlvbihiLGMpe2I9U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGEsW2IsY10pO3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYixnLFwiTHRcIil9KTtkJiZmLmxpc3QubGlzdCRyZXZlcnNlKCk7Zi5zb3J0KCk7ZCYmZi5saXN0Lmxpc3QkcmV2ZXJzZSgpO2lmKGIpZm9yKGM9MDtjPGYubGlzdGxlbmd0aDtjKyspZT1mLmxpc3QudltjXVsxXSxmLmxpc3QudltjXT1lO2M9MDx0aGlzLnNxJGxlbmd0aCgpO3RoaXMudj1mLmxpc3QudjtpZihjKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJsaXN0IG1vZGlmaWVkIGR1cmluZyBzb3J0XCIpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LGxpc3QkaW5SYW5nZShhLGMpezA+YSYmKGErPXRoaXMudi5sZW5ndGgpO2lmKDA8PWEmJmE8dGhpcy52Lmxlbmd0aClyZXR1cm4gYTt0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKGMpO1xufSxsaXN0JGluZGV4T2YoYSxjLGYpe2Zvcih7c3RhcnQ6YyxlbmQ6Zn09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGYpO2M8ZiYmYzx0aGlzLnYubGVuZ3RoO2MrKylpZih0aGlzLnZbY109PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy52W2NdLGEsXCJFcVwiKSlyZXR1cm4gYztyZXR1cm4tMX0sbGlzdCRyZXZlcnNlKCl7dGhpcy52LnJldmVyc2UoKX0sYXNzJHN1YnNjcmlwdChhLGMpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5hc3MkaW5kZXgoYSxjKTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnNsaWNlKXtjb25zdCB7c3RhcnQ6YixzdG9wOmUsc3RlcDpofT1hLnNsaWNlJGluZGljZXModGhpcy52Lmxlbmd0aCk7MT09PWg/dGhpcy5hc3Mkc2xpY2UoYixlLGMpOnRoaXMuYXNzJGV4dF9zbGljZShhLGMpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKSk7fSxhc3MkaW5kZXgoYSxjKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7YT10aGlzLmxpc3QkaW5SYW5nZShhLFwibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLnZbYV09Y30sYXNzJHNsaWNlKGEsYyxmKXtpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGFzc2lnbiBhbiBpdGVyYWJsZVwiKTtmPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGYpO3RoaXMudi5zcGxpY2UoYSxjLWEsLi4uZil9LGFzcyRleHRfc2xpY2UoYSxjKXtjb25zdCBiPVtdO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57Yi5wdXNoKGEpfSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tJdGVyYWJsZShjKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGFzc2lnbiBpdGVyYWJsZSB0byBleHRlbmRlZCBzbGljZVwiKTtcbmE9U2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYyk7aWYoYi5sZW5ndGghPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2l6ZSBcIithLmxlbmd0aCtcIiB0byBleHRlbmRlZCBzbGljZSBvZiBzaXplIFwiK2IubGVuZ3RoKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMudi5zcGxpY2UoYltjXSwxLGFbY10pfSxkZWwkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpdGhpcy5kZWwkaW5kZXgoYSk7ZWxzZSBpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zbGljZSl7Y29uc3Qge3N0YXJ0OmIsc3RvcDpjLHN0ZXA6bH09YS5zbGljZSRpbmRpY2VzKHRoaXMudi5sZW5ndGgpOzE9PT1sP3RoaXMuZGVsJHNsaWNlKGIsYyk6dGhpcy5kZWwkZXh0X3NsaWNlKGEsMDxsPzE6MCl9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90IFwiK1xuU2suYWJzdHIudHlwZU5hbWUoYSkpO30sZGVsJGluZGV4KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5JbmRleEVycm9yKTthPXRoaXMubGlzdCRpblJhbmdlKGEsXCJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3RoaXMudi5zcGxpY2UoYSwxKX0sZGVsJHNsaWNlKGEsYyl7dGhpcy52LnNwbGljZShhLGMtYSl9LGRlbCRleHRfc2xpY2UoYSxjKXtsZXQgYj0wO2Euc3NzaXRlciQodGhpcy52Lmxlbmd0aCxhPT57dGhpcy52LnNwbGljZShhLWIsMSk7Yis9Y30pfX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmxpc3RcIixTay5idWlsdGluLmxpc3QpO1NrLmJ1aWx0aW4ubGlzdC5weTIkbWV0aG9kcz17c29ydDp7JG5hbWU6XCJzb3J0XCIsJG1ldGgoYSxjKXtjb25zdCBbYixlLGhdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwic29ydFwiLFtcImNtcFwiLFwia2V5XCIsXCJyZXZlcnNlXCJdLGEsYyxbU2suYnVpbHRpbi5ub25lLm5vbmUkLFxuU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSRdKTtyZXR1cm4gdGhpcy5saXN0JHNvcnQoYixlLGgpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgY21wPU5vbmUsIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJTdGFibGUgc29ydCAqSU4gUExBQ0UqLlwifX07dmFyIGE9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwibGlzdF9pdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD0wO3RoaXMuJHNlcT1hLnZ9LGl0ZXJuZXh0OlNrLmdlbmVyaWMuaXRlck5leHRXaXRoQXJyYXksbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSksYz1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJsaXN0X3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpbmRleD1cbmEudi5sZW5ndGgtMTt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9dGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dO2lmKHZvaWQgMD09PWEpdGhpcy50cCRpdGVybmV4dD0oKT0+e307ZWxzZSByZXR1cm4gYX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlclJldmVyc2VMZW5ndGhIaW50TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEsYSl7ZnVuY3Rpb24gYyhhKXt2YXIgYj1hLnJlcGxhY2UoRixcIlwiKS5yZXBsYWNlKE0sXCJfXCIpLnRvTG93ZXJDYXNlKCk7Yj1FW2JdO3JldHVybiB2b2lkIDA9PT1iP2E6Yn1mdW5jdGlvbiBiKGEsYixjKXtpZih2b2lkIDA9PT1iKWI9XCJ1dGYtOFwiO2Vsc2UgaWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhiKSliPWIuJGpzc3RyKCk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoYStcIigpIGFyZ3VtZW50IFwiKyhcImJ5dGVzc3RyXCIuaW5jbHVkZXMoYSk/XG4yOjEpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShiKSk7aWYodm9pZCAwPT09YyljPVwic3RyaWN0XCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGMpKWM9Yy4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihhK1wiKCkgYXJndW1lbnQgXCIrKFwiYnl0ZXNzdHJcIi5pbmNsdWRlcyhhKT8zOjIpK1wiIG11c3QgYmUgc3RyIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShjKSk7cmV0dXJue2VuY29kaW5nOmIsZXJyb3JzOmN9fWZ1bmN0aW9uIGUoYSxiLGQpe2E9YS4kanNzdHIoKTtiPWMoYik7aWYoXCJzdHJpY3RcIiE9PWQmJlwiaWdub3JlXCIhPT1kJiZcInJlcGxhY2VcIiE9PWQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIidcIitkK1wiJyBlcnJvciBoYW5kbGluZyBub3QgaW1wbGVtZW50ZWQgaW4gU2t1bHB0XCIpO2lmKFwiYXNjaWlcIj09PWIpe2I9W107Zm9yKGUgaW4gYSl7Y29uc3QgYz1hLmNoYXJDb2RlQXQoZSk7XG5pZigxMjc8Yyl7aWYoXCJzdHJpY3RcIj09PWQpdGhyb3cgZD1mKGMpLG5ldyBTay5idWlsdGluLlVuaWNvZGVFbmNvZGVFcnJvcihcIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciAnXCIrZCtcIicgaW4gcG9zaXRpb24gXCIrZStcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJmIucHVzaCg2Myl9ZWxzZSBiLnB1c2goYyl9dmFyIGU9bmV3IFVpbnQ4QXJyYXkoYil9ZWxzZSBpZihcInV0Zi04XCI9PT1iKWU9Vi5lbmNvZGUoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5Mb29rdXBFcnJvcihcInVua25vd24gZW5jb2Rpbmc6IFwiK2IpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhlKX1mdW5jdGlvbiBmKGEpe3ZhciBiPTI2NT49YT9cIlxcXFx4XCI6XCJcXFxcdVwiO2E9YS50b1N0cmluZygxNik7Mz09PWEubGVuZ3RoJiYoYT1hLnNsaWNlKDEsMykpO3JldHVybiBhPTE9PT1hLmxlbmd0aD9iK1wiMFwiK2E6YithfWZ1bmN0aW9uIGwoYSxkKXsoe2VuY29kaW5nOmEsXG5lcnJvcnM6ZH09YihcImRlY29kZVwiLGEsZCkpO2E9YyhhKTtpZihcInN0cmljdFwiIT09ZCYmXCJpZ25vcmVcIiE9PWQmJlwicmVwbGFjZVwiIT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yKFwiJ1wiK2QrXCInIGVycm9yIGhhbmRsaW5nIG5vdCBpbXBsZW1lbnRlZCBpbiBTa3VscHRcIik7aWYoXCJhc2NpaVwiPT09YSl7YT10aGlzLnY7dmFyIGU9XCJcIjtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrKyl7Y29uc3QgYz1hW2JdO2lmKDEyNzxjKXtpZihcInN0cmljdFwiPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4XCIrYy50b1N0cmluZygxNikrXCIgaW4gcG9zaXRpb24gXCIrYitcIjogb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KVwiKTtcInJlcGxhY2VcIj09PWQmJihlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTMzKSl9ZWxzZSBlKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMpfWE9ZX1lbHNlIGlmKFwidXRmLThcIj09PVxuYSlhOmlmKGE9dGhpcy52LGU9ZCxkPXkuZGVjb2RlKGEpLFwicmVwbGFjZVwiPT09ZSlhPWQ7ZWxzZXtpZihcInN0cmljdFwiPT09ZSl7ZT1kLmluZGV4T2YoXCJcXHVmZmZkXCIpO2lmKC0xPT09ZSl7YT1kO2JyZWFrIGF9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVW5pY29kZURlY29kZUVycm9yKFwiJ3V0Zi04JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweFwiK2FbZV0udG9TdHJpbmcoMTYpK1wiIGluIHBvc2l0aW9uIFwiK2UrXCI6IGludmFsaWQgc3RhcnQgYnl0ZVwiKTt9YT1kLnJlcGxhY2UoL1xcdWZmZmQvZyxcIlwiKX1lbHNlIHRocm93IG5ldyBTay5idWlsdGluLkxvb2t1cEVycm9yKFwidW5rbm93biBlbmNvZGluZzogXCIrYSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCxlKXtpZighKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzfHxjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXG5cIiBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYykpOyh7c3RhcnQ6ZCxlbmQ6ZX09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxkLGUpKTtpZihlPGQpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7ZD10aGlzLnYuc3ViYXJyYXkoZCxlKTtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSl7Zm9yKGxldCBhPVNrLmFic3RyLml0ZXIoYyksZT1hLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZTtlPWEudHAkaXRlcm5leHQoKSlpZihlPXRoaXMuZ2V0JHJhdyhlKSxiKGQsZSkpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC50cnVlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJH1yZXR1cm4gYihkLGMudik/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtiPXRoaXMuZ2V0JHRndChiKTtcbih7c3RhcnQ6YyxlbmQ6ZH09U2suYnVpbHRpbi5zbGljZS5zdGFydEVuZCR3cnQodGhpcyxjLGQpKTtyZXR1cm4gZDxjPy0xOlwibnVtYmVyXCI9PT10eXBlb2YgYj8oYj1hP3RoaXMudi5sYXN0SW5kZXhPZihiLGQtMSk6dGhpcy52LmluZGV4T2YoYixjKSxiPj1jJiZiPGQ/YjotMSk6YT90aGlzLmZpbmQkc3VicmlnaHQoYixjLGQpOnRoaXMuZmluZCRzdWJsZWZ0KGIsYyxkKX19ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj10aGlzLmdldCRyYXcoYik7bGV0IGM7aWYoYSl7aWYoYz10aGlzLmZpbmQkc3VicmlnaHQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmJ5dGVzLG5ldyBTay5idWlsdGluLmJ5dGVzLHRoaXNdKX1lbHNlIGlmKGM9dGhpcy5maW5kJHN1YmxlZnQoYiwwLHRoaXMudi5sZW5ndGgpLDA+YylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXMsbmV3IFNrLmJ1aWx0aW4uYnl0ZXMsXG5uZXcgU2suYnVpbHRpbi5ieXRlc10pO3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KDAsYykpLG5ldyBTay5idWlsdGluLmJ5dGVzKGIpLG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShjK2IubGVuZ3RoKSldKX19ZnVuY3Rpb24gbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD12b2lkIDA9PT1jfHxjPT09U2suYnVpbHRpbi5ub25lLm5vbmUkP25ldyBVaW50OEFycmF5KFs5LDEwLDExLDEyLDEzLDMyLDEzM10pOnRoaXMuZ2V0JHJhdyhjKTtjPTA7dmFyIGU9dGhpcy52Lmxlbmd0aDtpZihhKWZvcig7YzxlJiZkLmluY2x1ZGVzKHRoaXMudltjXSk7KWMrKztpZihiKWZvcig7ZT5jJiZkLmluY2x1ZGVzKHRoaXMudltlLTFdKTspZS0tO2Q9bmV3IFVpbnQ4QXJyYXkoZS1jKTtmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKWRbZV09dGhpcy52W2UrY107cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGQpfX1cbmZ1bmN0aW9uIGsoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkLGUpe2lmKHZvaWQgMD09PWUpZT0zMjtlbHNlIGlmKGUgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzJiYxPT1lLnYubGVuZ3RoKWU9ZS52WzBdO2Vsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGErXCIoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBieXRlIHN0cmluZyBvZiBsZW5ndGggMSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGUpKTtjb25zdCBmPXRoaXMudi5sZW5ndGg7ZD1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoZCxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2lmKGQ8PWYpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgZz1uZXcgVWludDhBcnJheShkKTtsZXQgayxoO2M/KGs9TWF0aC5mbG9vcigoZC1mKS8yKSxoPShkLWYpJTI/aysxOmspOmI/KGs9ZC1mLGg9MCk6KGs9MCxoPWQtZik7Zy5maWxsKGUsMCxrKTtmb3IobGV0IGE9MDthPGY7YSsrKWdbYStrXT10aGlzLnZbYV07XG5nLmZpbGwoZSxkLWgpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhnKX19ZnVuY3Rpb24gcChhKXtyZXR1cm4gOTw9YSYmMTM+PWF8fDMyPT09YX1mdW5jdGlvbiB1KGEpe3JldHVybiA5Nzw9YSYmMTIyPj1hfWZ1bmN0aW9uIEEoYSl7cmV0dXJuIDY1PD1hJiY5MD49YX1mdW5jdGlvbiB0KGEpe3JldHVybiA0ODw9YSYmNTc+PWF9ZnVuY3Rpb24gdihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy52Lmxlbmd0aD9iP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkOnRoaXMudi5ldmVyeShiPT5hKGIpKT9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gQihhLGIpe3JldHVybiBmdW5jdGlvbigpe2xldCBjPSExO2ZvcihsZXQgZD0wO2Q8dGhpcy52Lmxlbmd0aDtkKyspe2lmKGIodGhpcy52W2RdKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDshYyYmYSh0aGlzLnZbZF0pJiZcbihjPSEwKX1yZXR1cm4gYz9Tay5idWlsdGluLmJvb2wudHJ1ZSQ6U2suYnVpbHRpbi5ib29sLmZhbHNlJH19ZnVuY3Rpb24gRChhKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgpO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspYltjXT1hKHRoaXMudltjXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfX1hKDMwKTtjb25zdCBFPXt1dGY6XCJ1dGYtOFwiLHV0Zjg6XCJ1dGYtOFwiLHV0Zl84OlwidXRmLThcIixhc2NpaTpcImFzY2lpXCJ9O3ZhciBGPS9cXHMrL2csTT0vW18tXSsvZztjb25zdCBWPW5ldyBUZXh0RW5jb2Rlcix5PW5ldyBUZXh0RGVjb2RlcjtTay5idWlsdGluLmJ5dGVzPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJieXRlc1wiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYnl0ZXMgaXMgYSBjb25zdHJ1Y3RvciB1c2UgJ25ldydcIik7XG5pZih2b2lkIDA9PT1hKXRoaXMudj1uZXcgVWludDhBcnJheTtlbHNlIGlmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRoaXMudj1hO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShhKSlTay5hc3NlcnRzLmFzc2VydChhLmV2ZXJ5KGE9PjA8PWEmJjI1NT49YSksXCJiYWQgaW50ZXJuYWwgY2FsbCB0byBieXRlcyB3aXRoIGFycmF5XCIpLHRoaXMudj1uZXcgVWludDhBcnJheShhKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl7bGV0IGI7Y29uc3QgYz1uZXcgVWludDhBcnJheShhLmxlbmd0aCksZD1hLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKXtiPWEuY2hhckNvZGVBdChlKTtpZigyNTU8Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5Vbmljb2RlRGVjb2RlRXJyb3IoXCJpbnZhbGlkIHN0cmluZyBhdCBpbmRleCBcIitlK1wiIChwb3NzaWJseSBjb250YWlucyBhIHVuaWNvZGUgY2hhcmFjdGVyKVwiKTtjW2VdPWJ9dGhpcy52PWN9ZWxzZSBpZihcIm51bWJlclwiPT09dHlwZW9mIGEpdGhpcy52PVxubmV3IFVpbnQ4QXJyYXkoYSk7ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJiYWQgYXJndW1lbnQgdG8gYnl0ZXMgY29uc3RydWN0b3JcIik7fSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkZG9jOlwiYnl0ZXMoaXRlcmFibGVfb2ZfaW50cykgLT4gYnl0ZXNcXG5ieXRlcyhzdHJpbmcsIGVuY29kaW5nWywgZXJyb3JzXSkgLT4gYnl0ZXNcXG5ieXRlcyhieXRlc19vcl9idWZmZXIpIC0+IGltbXV0YWJsZSBjb3B5IG9mIGJ5dGVzX29yX2J1ZmZlclxcbmJ5dGVzKGludCkgLT4gYnl0ZXMgb2JqZWN0IG9mIHNpemUgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlciBpbml0aWFsaXplZCB3aXRoIG51bGwgYnl0ZXNcXG5ieXRlcygpIC0+IGVtcHR5IGJ5dGVzIG9iamVjdFxcblxcbkNvbnN0cnVjdCBhbiBpbW11dGFibGUgYXJyYXkgb2YgYnl0ZXMgZnJvbTpcXG4gIC0gYW4gaXRlcmFibGUgeWllbGRpbmcgaW50ZWdlcnMgaW4gcmFuZ2UoMjU2KVxcbiAgLSBhIHRleHQgc3RyaW5nIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZ1xcbiAgLSBhbnkgb2JqZWN0IGltcGxlbWVudGluZyB0aGUgYnVmZmVyIEFQSS5cXG4gIC0gYW4gaW50ZWdlclwiLFxudHAkbmV3KGEsYyl7aWYodGhpcyE9PVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlKXJldHVybiB0aGlzLiRzdWJ0eXBlX25ldyhhLGMpO2M9Y3x8W107aWYoMT49YS5sZW5ndGgmJjA9PT0rYy5sZW5ndGgpYT1hWzBdO2Vsc2V7W2EsZCxjXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImJ5dGVzXCIsW251bGwsXCJweVNvdXJjZVwiLFwiZXJyb3JzXCJdLGEsYyk7KHtlbmNvZGluZzpkLGVycm9yczpjfT1iKFwiYnl0ZXNcIixkLGMpKTtpZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJlbmNvZGluZyBvciBlcnJvcnMgd2l0aG91dCBhIHN0cmluZyBhcmd1bWVudFwiKTtyZXR1cm4gZShhLGQsYyl9aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXM7aWYodm9pZCAwIT09KGM9U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFNrLmJ1aWx0aW4uc3RyLiRieXRlcykpKXt2YXIgZD1Tay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoYyxcbltdKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCxhPT57aWYoIVNrLmJ1aWx0aW4uY2hlY2tCeXRlcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJfX2J5dGVzX18gcmV0dXJuZWQgbm9uLWJ5dGVzICh0eXBlIFwiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiKVwiKTtyZXR1cm4gYX0pfWlmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2Q9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigwPmQpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcIm5lZ2F0aXZlIGNvdW50XCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhkKX1pZihTay5idWlsdGluLmNoZWNrQnl0ZXMoYSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGEudik7aWYoU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJzdHJpbmcgYXJndW1lbnQgd2l0aG91dCBhbiBlbmNvZGluZ1wiKTtpZihTay5idWlsdGluLmNoZWNrSXRlcmFibGUoYSkpe2xldCBiPVxuW107ZD1Tay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpO2lmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtiLnB1c2goYSl9KTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oZCwoKT0+bmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYikpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0ICdcIitTay5hYnN0ci50eXBlTmFtZShkKStcIicgb2JqZWN0IGludG8gYnl0ZXNcIik7fSwkcigpe2xldCBhLGI9XCInXCI7Y29uc3QgYz0tMSE9PXRoaXMudi5pbmRleE9mKDM0KTtsZXQgZD1cIlwiO2ZvcihsZXQgZT0wO2U8dGhpcy52Lmxlbmd0aDtlKyspaWYoYT10aGlzLnZbZV0sOT5hfHwxMDxhJiYxMz5hfHwxMzxhJiYzMj5hfHwxMjY8YSlkKz1mKGEpO2Vsc2UgaWYoOT09PWF8fDEwPT09YXx8MTM9PT1hfHwzOT09PVxuYXx8OTI9PT1hKXN3aXRjaChhKXtjYXNlIDk6ZCs9XCJcXFxcdFwiO2JyZWFrO2Nhc2UgMTA6ZCs9XCJcXFxcblwiO2JyZWFrO2Nhc2UgMTM6ZCs9XCJcXFxcclwiO2JyZWFrO2Nhc2UgMzk6Yz9kKz1cIlxcXFwnXCI6KGQrPVwiJ1wiLGI9J1wiJyk7YnJlYWs7Y2FzZSA5MjpkKz1cIlxcXFxcXFxcXCJ9ZWxzZSBkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJiXCIrYitkK2IpfSx0cCRzdHIoKXtyZXR1cm4gdGhpcy4kcigpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBHKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKHRoaXM9PT1hJiZTay5taXNjZXZhbC5vcEFsbG93c0VxdWFsaXR5KGIpKXJldHVybiEwO2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBjPXRoaXMudjthPWEudjtpZihjLmxlbmd0aCE9PWEubGVuZ3RoJiYoXCJFcVwiPT09Ynx8XCJOb3RFcVwiPT09YikpcmV0dXJuXCJFcVwiPT09XG5iPyExOiEwO2xldCBkO2NvbnN0IGU9TWF0aC5taW4oYy5sZW5ndGgsYS5sZW5ndGgpO2ZvcihkPTA7ZDxlJiZjW2RdPT09YVtkXTtkKyspO3N3aXRjaChiKXtjYXNlIFwiTHRcIjpyZXR1cm4gZD09PWUmJmMubGVuZ3RoPGEubGVuZ3RofHxjW2RdPGFbZF07Y2FzZSBcIkx0RVwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg8PWEubGVuZ3RofHxjW2RdPD1hW2RdO2Nhc2UgXCJFcVwiOnJldHVybiBkPT09ZTtjYXNlIFwiTm90RXFcIjpyZXR1cm4gZDxlO2Nhc2UgXCJHdFwiOnJldHVybiBkPT09ZSYmYy5sZW5ndGg+YS5sZW5ndGh8fGNbZF0+YVtkXTtjYXNlIFwiR3RFXCI6cmV0dXJuIGQ9PT1lJiZjLmxlbmd0aD49YS5sZW5ndGh8fGNbZF0+PWFbZF19fSx0cCRoYXNoKCl7cmV0dXJuKG5ldyBTay5idWlsdGluLnN0cih0aGlzLiRqc3N0cigpKSkudHAkaGFzaCgpfSx0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXtsZXQgYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxcblNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7aWYodm9pZCAwIT09Yil7MD5iJiYoYj10aGlzLnYubGVuZ3RoK2IpO2lmKDA+Ynx8Yj49dGhpcy52Lmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbmRleEVycm9yKFwiaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMudltiXSl9fWVsc2UgaWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W107YS5zc3NpdGVyJCh0aGlzLnYubGVuZ3RoLGE9PntiLnB1c2godGhpcy52W2FdKX0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShiKSl9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiYnl0ZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO30sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LHNxJGNvbmNhdChhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJ5dGVzKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb25jYXQgXCIrXG5Tay5hYnN0ci50eXBlTmFtZShhKStcIiB0byBieXRlc1wiKTtjb25zdCBiPW5ldyBVaW50OEFycmF5KHRoaXMudi5sZW5ndGgrYS52Lmxlbmd0aCk7bGV0IGM7Zm9yKGM9MDtjPHRoaXMudi5sZW5ndGg7YysrKWJbY109dGhpcy52W2NdO2ZvcihsZXQgZD0wO2Q8YS52Lmxlbmd0aDtkKyssYysrKWJbY109YS52W2RdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhiKX0sc3EkcmVwZWF0KGEpe2lmKCFTay5taXNjZXZhbC5pc0luZGV4KGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5IG5vbi1pbnQgb2YgdHlwZSAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtjb25zdCBiPWEqdGhpcy52Lmxlbmd0aDtpZihiPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3I7aWYoMD49XG5hKXJldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlczthPW5ldyBVaW50OEFycmF5KGIpO2xldCBjPTA7Zm9yKDtjPGI7KWZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspYVtjKytdPXRoaXMudltiXTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMoYSl9LHNxJGNvbnRhaW5zKGEpe3JldHVybi0xIT09dGhpcy5maW5kJGxlZnQoYSl9LHRwJGFzX251bWJlcjohMCxuYiRyZW1haW5kZXI6U2suYnVpbHRpbi5zdHIucHJvdG90eXBlLm5iJHJlbWFpbmRlcn0scHJvdG86eyRqc3N0cigpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMudltiXSk7cmV0dXJuIGF9LGdldCR0Z3QoYSl7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpcmV0dXJuIGEudjthPVNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJhcmd1bWVudCBzaG91bGQgYmUgaW50ZWdlciBvciBieXRlcy1saWtlIG9iamVjdCwgbm90IHt0cCRuYW1lfVwiKTtcbmlmKDA+YXx8MjU1PGEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KVwiKTtyZXR1cm4gYX0sZ2V0JHJhdyhhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5ieXRlcylyZXR1cm4gYS52O3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgYnl0ZXMtbGlrZSBvYmplY3QgaXMgcmVxdWlyZWQsIG5vdCAnXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCInXCIpO30sZ2V0JHNwbGl0QXJnczpmdW5jdGlvbihhLGIpe2I9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGIsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtiPTA+Yj9JbmZpbml0eTpiO2E9U2suYnVpbHRpbi5jaGVja05vbmUoYSk/bnVsbDp0aGlzLmdldCRyYXcoYSk7aWYobnVsbCE9PWEmJiFhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZW1wdHkgc2VwYXJhdG9yXCIpO3JldHVybntzZXA6YSxtYXhzcGxpdDpifX0sZmluZCRsZWZ0OmQoITEpLFxuZmluZCRyaWdodDpkKCEwKSxmaW5kJHN1YmxlZnQ6ZnVuY3Rpb24oYSxiLGMpe2M9Yy1hLmxlbmd0aCsxO2xldCBkPWI7Zm9yKDtkPGM7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QrK31yZXR1cm4tMX0sZmluZCRzdWJyaWdodChhLGIsYyl7bGV0IGQ9Yy1hLmxlbmd0aDtmb3IoO2Q+PWI7KXtpZihhLmV2ZXJ5KChhLGIpPT5hPT09dGhpcy52W2QrYl0pKXJldHVybiBkO2QtLX1yZXR1cm4tMX0sJHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4uYnl0ZXMucHJvdG90eXBlLnRwJG5ldyhhLGIpO2Mudj1hLnY7cmV0dXJuIGN9LHNrJGFzYXJyYXkoKXtjb25zdCBhPVtdO3RoaXMudi5mb3JFYWNoKGI9PnthLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhiKSl9KTtyZXR1cm4gYX19LGZsYWdzOntzdHIkZW5jb2RlOmUsJGRlY29kZTpsLGNoZWNrJGVuY29kZUFyZ3M6Yn0sbWV0aG9kczp7X19nZXRuZXdhcmdzX186eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudikpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6bnVsbH0sY2FwaXRhbGl6ZTp7JG1ldGgoKXtjb25zdCBhPXRoaXMudi5sZW5ndGg7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudik7Y29uc3QgYj1uZXcgVWludDhBcnJheShhKTtsZXQgYz10aGlzLnZbMF07YlswXT11KGMpP2MtMzI6Yztmb3IobGV0IGQ9MTtkPGE7ZCsrKWM9dGhpcy52W2RdLGJbZF09QShjKT9jKzMyOmM7cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jYXBpdGFsaXplKCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkIChBU0NJSSlcXG5hbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuXCJ9LGNlbnRlcjp7JG1ldGg6ayhcImNlbnRlclwiLCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcXG5kb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuXCJ9LGNvdW50OnskbWV0aChhLGIsYyl7YT10aGlzLmdldCR0Z3QoYSk7KHtzdGFydDpiLGVuZDpjfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsYykpO2xldCBkPTA7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKWZvcig7YjxjO2IrKyl0aGlzLnZbYl09PT1hJiZkKys7ZWxzZXtjPWMtYS5sZW5ndGgrMTtmb3IobGV0IGU9YjtlPGM7ZSsrKWEuZXZlcnkoKGEsYik9PmE9PT10aGlzLnZbZStiXSkmJihkKyssZSs9YS5sZW5ndGgtMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZCl9LCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic2VjdGlvbiBzdWIgaW5cXG5ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcXG5hcyBpbiBzbGljZSBub3RhdGlvbi5cIn0sXG5kZWNvZGU6eyRtZXRoOmwsJGZsYWdzOntOYW1lZEFyZ3M6W1wiZW5jb2RpbmdcIixcImVycm9yc1wiXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JylcIiwkZG9jOlwiRGVjb2RlIHRoZSBieXRlcyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgZW5jb2RpbmcuXFxuXFxuICBlbmNvZGluZ1xcbiAgICBUaGUgZW5jb2Rpbmcgd2l0aCB3aGljaCB0byBkZWNvZGUgdGhlIGJ5dGVzLlxcbiAgZXJyb3JzXFxuICAgIFRoZSBlcnJvciBoYW5kbGluZyBzY2hlbWUgdG8gdXNlIGZvciB0aGUgaGFuZGxpbmcgb2YgZGVjb2RpbmcgZXJyb3JzLlxcbiAgICBUaGUgZGVmYXVsdCBpcyAnc3RyaWN0JyBtZWFuaW5nIHRoYXQgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGFcXG4gICAgVW5pY29kZURlY29kZUVycm9yLiBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlICdpZ25vcmUnIGFuZCAncmVwbGFjZSdcXG4gICAgYXMgd2VsbCBhcyBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHdpdGggY29kZWNzLnJlZ2lzdGVyX2Vycm9yIHRoYXRcXG4gICAgY2FuIGhhbmRsZSBVbmljb2RlRGVjb2RlRXJyb3JzLlwifSxcbmVuZHN3aXRoOnskbWV0aDpoKFwiZW5kc3dpdGhcIiwoYSxiKT0+e2NvbnN0IGM9YS5sZW5ndGgtYi5sZW5ndGg7cmV0dXJuIDA8PWMmJmIuZXZlcnkoKGIsZCk9PmI9PT1hW2MrZF0pfSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxcbldpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cXG5XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxcbnN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS5cIn0sZXhwYW5kdGFiczp7JG1ldGgoYSl7YT1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxTay5idWlsdGluLk92ZXJmbG93RXJyb3IsXCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIChnb3QgdHlwZSB7dHAkbmFtfSlcIik7XG5jb25zdCBiPVtdO2xldCBjPTA7Zm9yKGxldCBlPTA7ZTx0aGlzLnYubGVuZ3RoO2UrKyl7dmFyIGQ9dGhpcy52W2VdOzk9PT1kPyhkPWEtYyVhLGIucHVzaCguLi5BcnJheShkKS5maWxsKDMyKSksYys9ZCk6MTA9PT1kfHwxMz09PWQ/KGIucHVzaChkKSxjPTApOihiLnB1c2goZCksYysrKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXMobmV3IFVpbnQ4QXJyYXkoYikpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJ0YWJzaXplXCJdLERlZmF1bHRzOls4XX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxcbklmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLlwifSxmaW5kOnskbWV0aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5maW5kJGxlZnQoYSxcbmIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcXG5cXG5SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SZXR1cm4gLTEgb24gZmFpbHVyZS5cIn0saGV4OnskbWV0aCgpe2xldCBhPVwiXCI7Zm9yKGxldCBiPTA7Yjx0aGlzLnYubGVuZ3RoO2IrKylhKz10aGlzLnZbYl0udG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsXCIwXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmhleCgpIC0+IHN0cmluZ1xcblxcbkNyZWF0ZSBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBudW1iZXJzIGZyb20gYSBieXRlcyBvYmplY3QuXFxuRXhhbXBsZTogYidcXFxceGI5XFxcXHgwMVxcXFx4ZWYnLmhleCgpIC0+ICdiOTAxZWYnLlwifSxcbmluZGV4OnskbWV0aDpmdW5jdGlvbihhLGIsYyl7YT10aGlzLmZpbmQkbGVmdChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxpc2FsbnVtOnskbWV0aDp2KGE9PnQoYSl8fFxudShhKXx8QShhKSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNhbG51bSgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBhbHBoYW51bWVyaWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYWxwaGE6eyRtZXRoOnYoYT0+NjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FscGhhKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIGFscGhhYmV0aWNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzYXNjaWk6eyRtZXRoOnYoYT0+MDw9YSYmMTI3Pj1hLCEwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2FzY2lpKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgaXMgZW1wdHkgb3IgYWxsIGNoYXJhY3RlcnMgaW4gQiBhcmUgQVNDSUksXFxuRmFsc2Ugb3RoZXJ3aXNlLlwifSxcbmlzZGlnaXQ6eyRtZXRoOnYodCksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIuaXNkaWdpdCgpIC0+IGJvb2xcXG5cXG5SZXR1cm4gVHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiBCIGFyZSBkaWdpdHNcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LGlzbG93ZXI6eyRtZXRoOkIodSxBKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc2xvd2VyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0saXNzcGFjZTp7JG1ldGg6dihwKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3NwYWNlKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIEIgYXJlIHdoaXRlc3BhY2VcXG5hbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpbiBCLCBGYWxzZSBvdGhlcndpc2UuXCJ9LFxuaXN0aXRsZTp7JG1ldGg6ZnVuY3Rpb24oKXtsZXQgYT0hMSxiPSExO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspe2NvbnN0IGQ9dGhpcy52W2NdO2lmKEEoZCkpe2lmKGEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj1hPSEwfWVsc2UgaWYodShkKSl7aWYoIWEpcmV0dXJuIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ7Yj0hMH1lbHNlIGE9ITF9cmV0dXJuIGI/U2suYnVpbHRpbi5ib29sLnRydWUkOlNrLmJ1aWx0aW4uYm9vbC5mYWxzZSR9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLmlzdGl0bGUoKSAtPiBib29sXFxuXFxuUmV0dXJuIFRydWUgaWYgQiBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmVcXG5jaGFyYWN0ZXIgaW4gQiwgaS5lLiB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seSBmb2xsb3cgdW5jYXNlZFxcbmNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy4gUmV0dXJuIEZhbHNlXFxub3RoZXJ3aXNlLlwifSxcbmlzdXBwZXI6eyRtZXRoOkIoQSx1KSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5pc3VwcGVyKCkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIGluIEIgYXJlIHVwcGVyY2FzZSBhbmQgdGhlcmUgaXNcXG5hdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyIGluIEIsIEZhbHNlIG90aGVyd2lzZS5cIn0sam9pbjp7JG1ldGgoYSl7Y29uc3QgYj1bXTtsZXQgYz0wO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uYnl0ZXMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcXVlbmNlIGl0ZW0gXCIrYytcIjogZXhwZWN0ZWQgYSBieXRlcy1saWtlIG9iamVjdCwgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkrXCIgZm91bmRcIik7YysrO2IubGVuZ3RoJiZiLnB1c2goLi4udGhpcy52KTtiLnB1c2goLi4uYS52KX0pLFxuKCk9Pm5ldyBTay5idWlsdGluLmJ5dGVzKG5ldyBVaW50OEFycmF5KGIpKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgaXRlcmFibGVfb2ZfYnl0ZXMsIC8pXCIsJGRvYzpcIkNvbmNhdGVuYXRlIGFueSBudW1iZXIgb2YgYnl0ZXMgb2JqZWN0cy5cXG5cXG5UaGUgYnl0ZXMgd2hvc2UgbWV0aG9kIGlzIGNhbGxlZCBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIGVhY2ggcGFpci5cXG5cXG5UaGUgcmVzdWx0IGlzIHJldHVybmVkIGFzIGEgbmV3IGJ5dGVzIG9iamVjdC5cXG5cXG5FeGFtcGxlOiBiJy4nLmpvaW4oW2InYWInLCBiJ3BxJywgYidycyddKSAtPiBiJ2FiLnBxLnJzJy5cIn0sbGp1c3Q6eyRtZXRoOmsoXCJsanVzdFwiLCExLCExKSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS5cIn0sXG5sb3dlcjp7JG1ldGg6RChhPT5BKGEpP2ErMzI6YSksJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIubG93ZXIoKSAtPiBjb3B5IG9mIEJcXG5cXG5SZXR1cm4gYSBjb3B5IG9mIEIgd2l0aCBhbGwgQVNDSUkgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlwifSxsc3RyaXA6eyRtZXRoOm4oITAsITEpLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6XCIoJHNlbGYsIGJ5dGVzPU5vbmUsIC8pXCIsJGRvYzpcIlN0cmlwIGxlYWRpbmcgYnl0ZXMgY29udGFpbmVkIGluIHRoZSBhcmd1bWVudC5cXG5cXG5JZiB0aGUgYXJndW1lbnQgaXMgb21pdHRlZCBvciBOb25lLCBzdHJpcCBsZWFkaW5nICBBU0NJSSB3aGl0ZXNwYWNlLlwifSxwYXJ0aXRpb246eyRtZXRoOmcoITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMuIElmIHRoZSBzZXBhcmF0b3IgaXMgZm91bmQsXFxucmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxcbml0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBieXRlc1xcbm9iamVjdCBhbmQgdHdvIGVtcHR5IGJ5dGVzIG9iamVjdHMuXCJ9LFxucmVwbGFjZTp7JG1ldGgoYSxiLGMpe2E9dGhpcy5nZXQkcmF3KGEpO2I9dGhpcy5nZXQkcmF3KGIpO2M9dm9pZCAwPT09Yz8tMTpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYyxTay5idWlsdGluLk92ZXJmbG93RXJyb3IpO2M9MD5jP0luZmluaXR5OmM7Y29uc3QgZD1bXTtsZXQgZT0wO2Zvcih2YXIgZj0wO2Y8dGhpcy52Lmxlbmd0aCYmZTxjOyl7Y29uc3QgYz10aGlzLmZpbmQkc3VibGVmdChhLGYsdGhpcy52Lmxlbmd0aCk7aWYoLTE9PT1jKWJyZWFrO2Zvcig7ZjxjO2YrKylkLnB1c2godGhpcy52W2ZdKTtkLnB1c2goLi4uYik7Zj1jK2EubGVuZ3RoO2UrK31mb3IoZjtmPHRoaXMudi5sZW5ndGg7ZisrKWQucHVzaCh0aGlzLnZbZl0pO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhuZXcgVWludDhBcnJheShkKSl9LCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6XCIoJHNlbGYsIG9sZCwgbmV3LCBjb3VudD0tMSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgY29weSB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgb2xkIHJlcGxhY2VkIGJ5IG5ldy5cXG5cXG4gIGNvdW50XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzIHRvIHJlcGxhY2UuXFxuICAgIC0xICh0aGUgZGVmYXVsdCB2YWx1ZSkgbWVhbnMgcmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMuXFxuXFxuSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGNvdW50IGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBjb3VudCBvY2N1cnJlbmNlcyBhcmVcXG5yZXBsYWNlZC5cIn0sXG5yZmluZDp7JG1ldGgoYSxiLGMpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKHRoaXMuZmluZCRyaWdodChhLGIsYykpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XFxuXFxuUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXFxuc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXFxuYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxcblxcblJldHVybiAtMSBvbiBmYWlsdXJlLlwifSxyaW5kZXg6eyRtZXRoOmZ1bmN0aW9uKGEsYixjKXthPXRoaXMuZmluZCRyaWdodChhLGIsYyk7aWYoLTE9PT1hKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJzdWJzZWN0aW9uIG5vdCBmb3VuZFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxcblxcblJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxcbnN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxcbmFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cXG5cXG5SYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLlwifSxyanVzdDp7JG1ldGg6ayhcInJqdXN0XCIsITAsITEpLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXFxuXFxuUmV0dXJuIEIgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xcbmRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKVwifSxcbnJwYXJ0aXRpb246eyRtZXRoOmcoITApLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgc2VwLCAvKVwiLCRkb2M6XCJQYXJ0aXRpb24gdGhlIGJ5dGVzIGludG8gdGhyZWUgcGFydHMgdXNpbmcgdGhlIGdpdmVuIHNlcGFyYXRvci5cXG5cXG5UaGlzIHdpbGwgc2VhcmNoIGZvciB0aGUgc2VwYXJhdG9yIHNlcCBpbiB0aGUgYnl0ZXMsIHN0YXJ0aW5nIGF0IHRoZSBlbmQuIElmXFxudGhlIHNlcGFyYXRvciBpcyBmb3VuZCwgcmV0dXJucyBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlXFxuc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIGl0LlxcblxcbklmIHRoZSBzZXBhcmF0b3IgaXMgbm90IGZvdW5kLCByZXR1cm5zIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBieXRlc1xcbm9iamVjdHMgYW5kIHRoZSBvcmlnaW5hbCBieXRlcyBvYmplY3QuXCJ9LHJzcGxpdDp7JG1ldGg6ZnVuY3Rpb24oYSxiKXsoe3NlcDphLFxubWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W107bGV0IGQ9MCxlPXRoaXMudi5sZW5ndGg7aWYobnVsbCE9PWEpe2Zvcig7MDw9ZSYmZDxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VicmlnaHQoYSwwLGUpO2lmKC0xPT09YilicmVhaztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGIrYS5sZW5ndGgsZSkpKTtlPWI7ZCsrfWMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxlKSkpfWVsc2V7Zm9yKGUtLTtkPGI7KXtmb3IoO3AodGhpcy52W2VdKTspZS0tO2lmKDA+ZSlicmVhazthPWUrMTtmb3IoZS0tOzA8PWUmJiFwKHRoaXMudltlXSk7KWUtLTtjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGUrMSxhKSkpO2QrK31pZigwPD1lKXtmb3IoO3AodGhpcy52W2VdKTspZS0tOzA8PWUmJmMucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoMCxcbmUrMSkpKX19cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QoYy5yZXZlcnNlKCkpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cXG5cXG5TcGxpdHRpbmcgaXMgZG9uZSBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBieXRlcyBhbmQgd29ya2luZyB0byB0aGUgZnJvbnQuXCJ9LFxucnN0cmlwOnskbWV0aDpuKCExLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LHNwbGl0OnskbWV0aDpmdW5jdGlvbihhLGIpeyh7c2VwOmEsbWF4c3BsaXQ6Yn09dGhpcy5nZXQkc3BsaXRBcmdzKGEsYikpO2NvbnN0IGM9W10sZD10aGlzLnYubGVuZ3RoO2xldCBlPTAsZj0wO2lmKG51bGwhPT1hKXtmb3IoO2Y8ZCYmZTxiOyl7Y29uc3QgYj10aGlzLmZpbmQkc3VibGVmdChhLGYsZCk7aWYoLTE9PT1iKWJyZWFrO2MucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoZixiKSkpO2Y9YithLmxlbmd0aDtlKyt9Yy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLFxuZCkpKX1lbHNle2Zvcig7ZTxiOyl7Zm9yKDtwKHRoaXMudltmXSk7KWYrKztpZihmPT09ZClicmVhazthPWY7Zm9yKGYrKztmPGQmJiFwKHRoaXMudltmXSk7KWYrKztjLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGEsZikpKTtlKyt9aWYoZjxkKXtmb3IoO3AodGhpcy52W2ZdKTspZisrO2Y8ZCYmYy5wdXNoKG5ldyBTay5idWlsdGluLmJ5dGVzKHRoaXMudi5zdWJhcnJheShmLGQpKSl9fXJldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGMpfSwkZmxhZ3M6e05hbWVkQXJnczpbXCJzZXBcIixcIm1heHNwbGl0XCJdLERlZmF1bHRzOltTay5idWlsdGluLm5vbmUubm9uZSQsLTFdfSwkdGV4dHNpZzpcIigkc2VsZiwgLywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzZWN0aW9ucyBpbiB0aGUgYnl0ZXMsIHVzaW5nIHNlcCBhcyB0aGUgZGVsaW1pdGVyLlxcblxcbiAgc2VwXFxuICAgIFRoZSBkZWxpbWl0ZXIgYWNjb3JkaW5nIHdoaWNoIHRvIHNwbGl0IHRoZSBieXRlcy5cXG4gICAgTm9uZSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHNwbGl0IG9uIEFTQ0lJIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xcbiAgICAoc3BhY2UsIHRhYiwgcmV0dXJuLCBuZXdsaW5lLCBmb3JtZmVlZCwgdmVydGljYWwgdGFiKS5cXG4gIG1heHNwbGl0XFxuICAgIE1heGltdW0gbnVtYmVyIG9mIHNwbGl0cyB0byBkby5cXG4gICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyBubyBsaW1pdC5cIn0sXG5zcGxpdGxpbmVzOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmlzVHJ1ZShhKTtjb25zdCBiPVtdO2xldCBjPTA7bGV0IGQ9MDtjb25zdCBlPXRoaXMudi5sZW5ndGg7Zm9yKDtkPGU7KXt2YXIgZj10aGlzLnZbZF07aWYoMTM9PT1mKXtjb25zdCBlPTEwPT09dGhpcy52W2QrMV07Zj1hP2U/ZCsyOmQrMTpkO2IucHVzaChuZXcgU2suYnVpbHRpbi5ieXRlcyh0aGlzLnYuc3ViYXJyYXkoYyxmKSkpO2Q9Yz1lP2QrMjpkKzF9ZWxzZSAxMD09PWY/KGY9YT9kKzE6ZCxiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZikpKSxkPWM9ZCsxKTpkKyt9YzxlJiZiLnB1c2gobmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52LnN1YmFycmF5KGMsZSkpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX0sJGZsYWdzOntOYW1lZEFyZ3M6W1wia2VlcGVuZHNcIl0sRGVmYXVsdHM6WyExXX0sJHRleHRzaWc6XCIoJHNlbGYsIC8sIGtlZXBlbmRzPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgYnl0ZXMsIGJyZWFraW5nIGF0IGxpbmUgYm91bmRhcmllcy5cXG5cXG5MaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdCB1bmxlc3Mga2VlcGVuZHMgaXMgZ2l2ZW4gYW5kXFxudHJ1ZS5cIn0sXG5zdGFydHN3aXRoOnskbWV0aDpoKFwic3RhcnRzd2l0aFwiLChhLGIpPT5iLmxlbmd0aDw9YS5sZW5ndGgmJmIuZXZlcnkoKGIsYyk9PmI9PT1hW2NdKSksJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxcblxcblJldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cXG5XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXFxuV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cXG5wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuXCJ9LHN0cmlwOnskbWV0aDpuKCEwLCEwKSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBieXRlcz1Ob25lLCAvKVwiLCRkb2M6XCJTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBieXRlcyBjb250YWluZWQgaW4gdGhlIGFyZ3VtZW50LlxcblxcbklmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIE5vbmUsIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIEFTQ0lJIHdoaXRlc3BhY2UuXCJ9LFxuc3dhcGNhc2U6eyRtZXRoOkQoYT0+QShhKT9hKzMyOnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi5zd2FwY2FzZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZFxcbnRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS5cIn0sdGl0bGU6eyRtZXRoKCl7Y29uc3QgYT10aGlzLnYubGVuZ3RoLGI9bmV3IFVpbnQ4QXJyYXkoYSk7bGV0IGM9ITE7Zm9yKGxldCBkPTA7ZDxhO2QrKyl7Y29uc3QgYT10aGlzLnZbZF07QShhKT8oYltkXT1jP2ErMzI6YSxjPSEwKTp1KGEpPyhiW2RdPWM/YTphLTMyLGM9ITApOihiW2RdPWEsYz0hMSl9cmV0dXJuIG5ldyBTay5idWlsdGluLmJ5dGVzKGIpfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi50aXRsZSgpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiBCLCBpLmUuIEFTQ0lJIHdvcmRzIHN0YXJ0IHdpdGggdXBwZXJjYXNlXFxuY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLlwifSxcbnVwcGVyOnskbWV0aDpEKGE9PnUoYSk/YS0zMjphKSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQi51cHBlcigpIC0+IGNvcHkgb2YgQlxcblxcblJldHVybiBhIGNvcHkgb2YgQiB3aXRoIGFsbCBBU0NJSSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuXCJ9LHpmaWxsOnskbWV0aChhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uSW5kZXhFcnJvcik7Y29uc3QgYj1hLXRoaXMudi5sZW5ndGg7aWYoMD49YilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uYnl0ZXModGhpcy52KTtjb25zdCBjPW5ldyBVaW50OEFycmF5KGEpO2xldCBkPTAsZTtpZig0Mz09PXRoaXMudlswXXx8NDU9PT10aGlzLnZbMF0pY1swXT10aGlzLnZbMF0sZCsrO2MuZmlsbCg0OCxkLGQrYik7ZT1kO2ZvcihkKz1iO2Q8YTtkKyssZSsrKWNbZF09dGhpcy52W2VdO3JldHVybiBuZXcgU2suYnVpbHRpbi5ieXRlcyhjKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiQi56ZmlsbCh3aWR0aCkgLT4gY29weSBvZiBCXFxuXFxuUGFkIGEgbnVtZXJpYyBzdHJpbmcgQiB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGRcXG5vZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgQiBpcyBuZXZlciB0cnVuY2F0ZWQuXCJ9fSxjbGFzc21ldGhvZHM6e2Zyb21oZXg6eyRtZXRoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7Zm9yKGxldCBjPWY7YzxiO2MrPTIpe2xldCBiPWEuc3Vic3RyKGMsMik7aWYoIWQudGVzdChiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiBmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uIFwiKyhjKzEpKTtlLnB1c2gocGFyc2VJbnQoYiwxNikpfX1pZighU2suYnVpbHRpbi5jaGVja1N0cmluZyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmcm9taGV4KCkgYXJndW1lbnQgbXVzdCBiZSBzdHIsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7XG5hPWEuJGpzc3RyKCk7Y29uc3QgYz0vXFxzKy9nLGQ9L15bYWJjZGVmQUJDREVGMDEyMzQ1Njc4OV17Mn0kLyxlPVtdO2xldCBmPTAsZztmb3IoO251bGwhPT0oZz1jLmV4ZWMoYSkpOyliKGcuaW5kZXgpLGY9Yy5sYXN0SW5kZXg7YihhLmxlbmd0aCk7cmV0dXJuIG5ldyB0aGlzKGUpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJHR5cGUsIHN0cmluZywgLylcIiwkZG9jOlwiQ3JlYXRlIGEgYnl0ZXMgb2JqZWN0IGZyb20gYSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgbnVtYmVycy5cXG5cXG5TcGFjZXMgYmV0d2VlbiB0d28gbnVtYmVycyBhcmUgYWNjZXB0ZWQuXFxuRXhhbXBsZTogYnl0ZXMuZnJvbWhleCgnQjkgMDFFRicpIC0+IGInXFxcXFxcXFx4YjlcXFxcXFxcXHgwMVxcXFxcXFxceGVmJy5cIn19fSk7dmFyIEc9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwiYnl0ZXNfaXRlcmF0b3JcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS52fSxpdGVybmV4dCgpe2NvbnN0IGE9XG50aGlzLiRzZXFbdGhpcy4kaW5kZXgrK107aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ieXRlc1wiLFNrLmJ1aWx0aW4uYnl0ZXMpfSxmdW5jdGlvbihtLHEsYSl7KGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMoKXt9dmFyIGw9U3RyaW5nLmZyb21DaGFyQ29kZSxoPXt9LnRvU3RyaW5nLGQ9aC5jYWxsKGEuU2hhcmVkQXJyYXlCdWZmZXIpLGc9aCgpLG49YS5VaW50OEFycmF5LGs9bnx8QXJyYXkscD1uP0FycmF5QnVmZmVyOmssdT1wLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJlwibGVuZ3RoXCJpbiBhfSxBPWguY2FsbChwLnByb3RvdHlwZSk7cD1jLnByb3RvdHlwZTtcbnZhciB0PWEuVGV4dEVuY29kZXIsbT1uZXcgKG4/VWludDE2QXJyYXk6aykoMzIpO2IucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbihhKXtpZighdShhKSl7dmFyIGI9aC5jYWxsKGEpO2lmKGIhPT1BJiZiIT09ZCYmYiE9PWcpdGhyb3cgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2RlY29kZScgb24gJ1RleHREZWNvZGVyJzogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIG5vdCBvZiB0eXBlICcoQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3KSdcIik7YT1uP25ldyBrKGEpOmF8fFtdfWZvcih2YXIgYz1iPVwiXCIsZT0wLGY9YS5sZW5ndGh8MCxwPWYtMzJ8MCxCLHQsdj0wLHE9MCxQLFE9MCxVPS0xO2U8Zjspe2ZvcihCPWU8PXA/MzI6Zi1lfDA7UTxCO2U9ZSsxfDAsUT1RKzF8MCl7dD1hW2VdJjI1NTtzd2l0Y2godD4+NCl7Y2FzZSAxNTpQPWFbZT1lKzF8MF0mMjU1O2lmKDIhPT1QPj42fHwyNDc8dCl7ZT1lLTF8MDticmVha312PSh0JjcpPDw2fFAmNjM7cT01O3Q9MjU2O2Nhc2UgMTQ6UD1cbmFbZT1lKzF8MF0mMjU1LHY8PD02LHZ8PSh0JjE1KTw8NnxQJjYzLHE9Mj09PVA+PjY/cSs0fDA6MjQsdD10KzI1NiY3Njg7Y2FzZSAxMzpjYXNlIDEyOlA9YVtlPWUrMXwwXSYyNTUsdjw8PTYsdnw9KHQmMzEpPDw2fFAmNjMscT1xKzd8MCxlPGYmJjI9PT1QPj42JiZ2Pj5xJiYxMTE0MTEyPnY/KHQ9dix2PXYtNjU1MzZ8MCwwPD12JiYoVT0odj4+MTApKzU1Mjk2fDAsdD0odiYxMDIzKSs1NjMyMHwwLDMxPlE/KG1bUV09VSxRPVErMXwwLFU9LTEpOihQPVUsVT10LHQ9UCkpKToodD4+PTgsZT1lLXQtMXwwLHQ9NjU1MzMpLHY9cT0wLEI9ZTw9cD8zMjpmLWV8MDtkZWZhdWx0Om1bUV09dDtjb250aW51ZTtjYXNlIDExOmNhc2UgMTA6Y2FzZSA5OmNhc2UgODp9bVtRXT02NTUzM31jKz1sKG1bMF0sbVsxXSxtWzJdLG1bM10sbVs0XSxtWzVdLG1bNl0sbVs3XSxtWzhdLG1bOV0sbVsxMF0sbVsxMV0sbVsxMl0sbVsxM10sbVsxNF0sbVsxNV0sbVsxNl0sbVsxN10sbVsxOF0sbVsxOV0sbVsyMF0sXG5tWzIxXSxtWzIyXSxtWzIzXSxtWzI0XSxtWzI1XSxtWzI2XSxtWzI3XSxtWzI4XSxtWzI5XSxtWzMwXSxtWzMxXSk7MzI+USYmKGM9Yy5zbGljZSgwLFEtMzJ8MCkpO2lmKGU8Zil7aWYobVswXT1VLFE9flU+Pj4zMSxVPS0xLGMubGVuZ3RoPGIubGVuZ3RoKWNvbnRpbnVlfWVsc2UtMSE9PVUmJihjKz1sKFUpKTtiKz1jO2M9XCJcIn1yZXR1cm4gYn07cC5lbmNvZGU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP1wiXCI6XCJcIithO3ZhciBiPWEubGVuZ3RofDAsYz1uZXcgaygoYjw8MSkrOHwwKSxkLGU9MCxmPSFuO2ZvcihkPTA7ZDxiO2Q9ZCsxfDAsZT1lKzF8MCl7dmFyIGc9YS5jaGFyQ29kZUF0KGQpfDA7aWYoMTI3Pj1nKWNbZV09ZztlbHNle2lmKDIwNDc+PWcpY1tlXT0xOTJ8Zz4+NjtlbHNle2E6e2lmKDU1Mjk2PD1nKWlmKDU2MzE5Pj1nKXt2YXIgaD1hLmNoYXJDb2RlQXQoZD1kKzF8MCl8MDtpZig1NjMyMDw9aCYmNTczNDM+PWgpe2c9KGc8PDEwKStoLTU2NjEzODg4fDA7aWYoNjU1MzU8XG5nKXtjW2VdPTI0MHxnPj4xODtjW2U9ZSsxfDBdPTEyOHxnPj4xMiY2MztjW2U9ZSsxfDBdPTEyOHxnPj42JjYzO2NbZT1lKzF8MF09MTI4fGcmNjM7Y29udGludWV9YnJlYWsgYX1nPTY1NTMzfWVsc2UgNTczNDM+PWcmJihnPTY1NTMzKTshZiYmZDw8MTxlJiZkPDwxPChlLTd8MCkmJihmPSEwLGg9bmV3IGsoMypiKSxoLnNldChjKSxjPWgpfWNbZV09MjI0fGc+PjEyO2NbZT1lKzF8MF09MTI4fGc+PjYmNjN9Y1tlPWUrMXwwXT0xMjh8ZyY2M319cmV0dXJuIG4/Yy5zdWJhcnJheSgwLGUpOmMuc2xpY2UoMCxlKX07dHx8KGEuVGV4dERlY29kZXI9YixhLlRleHRFbmNvZGVyPWMpfSkoXCJ1bmRlZmluZWRcIj09dHlwZW9mIGE/XCJ1bmRlZmluZWRcIj09dHlwZW9mIHNlbGY/dGhpczpzZWxmOmEpfSkuY2FsbCh0aGlzLGEoMCkpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4udHVwbGU9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInR1cGxlXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PVxuYT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi50dXBsZSxcImJhZCBjYWxsIHRvIHR1cGxlLCB1c2UgJ25ldycgd2l0aCBhbiBBcnJheSBvZiBweXRob24gb2JqZWN0c1wiKTt0aGlzLnY9YTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLHRwJGRvYzpcIkJ1aWx0LWluIGltbXV0YWJsZSBzZXF1ZW5jZS5cXG5cXG5JZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYW4gZW1wdHkgdHVwbGUuXFxuSWYgaXRlcmFibGUgaXMgc3BlY2lmaWVkIHRoZSB0dXBsZSBpcyBpbml0aWFsaXplZCBmcm9tIGl0ZXJhYmxlJ3MgaXRlbXMuXFxuXFxuSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LlwiLFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT10aGlzLnYubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTthPWEuam9pbihcIiwgXCIpOzE9PT10aGlzLnYubGVuZ3RoJiYoYSs9XCIsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCIoXCIrYStcIilcIil9LHRwJG5ldyhhLGIpe2lmKHRoaXMhPT1Tay5idWlsdGluLnR1cGxlLnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwidHVwbGVcIixiKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJ0dXBsZVwiLGEsMCwxKTthPWFbMF07cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4udHVwbGUoW10pOmEuY29uc3RydWN0b3I9PT1Tay5idWlsdGluLnR1cGxlP2E6U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSxcbiEwKSxhPT5uZXcgU2suYnVpbHRpbi50dXBsZShhKSl9LHRwJGhhc2goKXtsZXQgYSxiPTM0MzAwMDgsZT0xMDAwMDAzO2NvbnN0IGY9dGhpcy52Lmxlbmd0aDtmb3IobGV0IGM9MDtjPGY7KytjKXthPVNrLmFic3RyLm9iamVjdEhhc2godGhpcy52W2NdKTtpZigtMT09PWEpcmV0dXJuLTE7Yj0oYl5hKSplO2UrPTgyNTIwK2YrZn1iKz05NzUzMTstMT09PWImJihiPS0yKTtyZXR1cm4gYnwwfSx0cCRyaWNoY29tcGFyZTpTay5nZW5lcmljLnNlcUNvbXBhcmUsdHAkaXRlcigpe3JldHVybiBuZXcgYSh0aGlzKX0sbXAkc3Vic2NyaXB0KGEpe2lmKFNrLm1pc2NldmFsLmlzSW5kZXgoYSkpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEpOzA+YSYmKGE9dGhpcy52Lmxlbmd0aCthKTtpZigwPmF8fGE+PXRoaXMudi5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW5kZXhFcnJvcihcInR1cGxlIGluZGV4IG91dCBvZiByYW5nZVwiKTtyZXR1cm4gdGhpcy52W2FdfWlmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zbGljZSl7Y29uc3QgYj1bXTthLnNzc2l0ZXIkKHRoaXMudi5sZW5ndGgsYT0+e2IucHVzaCh0aGlzLnZbYV0pfSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBzbGljZXMsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShhKSk7fSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy52Lmxlbmd0aH0sc3EkcmVwZWF0KGEpe2E9U2subWlzY2V2YWwuYXNJbmRleFNpemVkKGEsU2suYnVpbHRpbi5PdmVyZmxvd0Vycm9yKTtpZigxPT09YSYmdGhpcy5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4udHVwbGUpcmV0dXJuIHRoaXM7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGE7YysrKWZvcihsZXQgYT0wO2E8dGhpcy52Lmxlbmd0aDthKyspYi5wdXNoKHRoaXMudlthXSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKGIpfSxzcSRjb25jYXQoYSl7aWYoIShhIGluc3RhbmNlb2ZcblNrLmJ1aWx0aW4udHVwbGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJykgdG8gdHVwbGVcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLnR1cGxlKHRoaXMudi5jb25jYXQoYS52KSl9LHNxJGNvbnRhaW5zKGEpe2ZvcihsZXQgYj10aGlzLnRwJGl0ZXIoKSxjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKWlmKGM9PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYyxhLFwiRXFcIikpcmV0dXJuITA7cmV0dXJuITF9fSxwcm90bzp7JHN1YnR5cGVfbmV3KGEsYil7Yj1uZXcgdGhpcy5jb25zdHJ1Y3RvcjthPVNrLmJ1aWx0aW4udHVwbGUucHJvdG90eXBlLnRwJG5ldyhhKTtiLnY9YS52O3JldHVybiBifSxzayRhc2FycmF5KCl7cmV0dXJuIHRoaXMudi5zbGljZSgwKX19LG1ldGhvZHM6e19fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZSh0aGlzLnYuc2xpY2UoMCkpfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOm51bGx9LGluZGV4OnskbWV0aChhLGIsZSl7aWYodm9pZCAwIT09YiYmIVNrLm1pc2NldmFsLmlzSW5kZXgoYil8fHZvaWQgMCE9PWUmJiFTay5taXNjZXZhbC5pc0luZGV4KGUpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNsaWNlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7KHtzdGFydDpiLGVuZDplfT1Tay5idWlsdGluLnNsaWNlLnN0YXJ0RW5kJHdydCh0aGlzLGIsZSkpO2NvbnN0IGM9dGhpcy52O2Zvcig7YjxlO2IrKylpZihjW2JdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbYl0sYSxcIkVxXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO3Rocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJ0dXBsZS5pbmRleCh4KTogeCBub3QgaW4gdHVwbGVcIik7fSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9LFxuJHRleHRzaWc6XCIoJHNlbGYsIHZhbHVlLCBzdGFydD0wLCBzdG9wPXN5cy5tYXhzaXplLCAvKVwiLCRkb2M6XCJSZXR1cm4gZmlyc3QgaW5kZXggb2YgdmFsdWUuXFxuXFxuUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifSxjb3VudDp7JG1ldGgoYSl7Y29uc3QgYj10aGlzLnYubGVuZ3RoLGM9dGhpcy52O2xldCBmPTA7Zm9yKGxldCBlPTA7ZTxiOysrZSlpZihjW2VdPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGNbZV0sYSxcIkVxXCIpKWYrPTE7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oZil9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgdmFsdWUsIC8pXCIsJGRvYzpcIlJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4udHVwbGVcIixTay5idWlsdGluLnR1cGxlKTt2YXIgYT1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJ0dXBsZV9pdGVyYXRvclwiLFxue2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEuc2skYXNhcnJheSgpfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5LG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSl7bGV0IGI9YS4kc2F2ZWRLZXlIYXNoO3JldHVybiB2b2lkIDAhPT1iP2I6Yj1Tay5hYnN0ci5vYmplY3RIYXNoKGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnNldChTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhKSl9ZnVuY3Rpb24gYihhLGIpe2ZvcihsZXQgYz1Tay5hYnN0ci5pdGVyKGEpLGQ9Yy50cCRpdGVybmV4dCgpO3ZvaWQgMCE9PWQ7ZD1jLnRwJGl0ZXJuZXh0KCkpaWYoIVNrLmFic3RyLnNlcXVlbmNlQ29udGFpbnMoYixcbmQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGUoYSxiLGQpe2NvbnN0IGU9e2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe2lmKDEhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjcmVhdGUgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiJyBpbnN0YW5jZXNcIik7dGhpcy5kaWN0PWE7dGhpcy5pbiRyZXByPSExfX07ZS5zbG90cz1PYmplY3QuYXNzaWduKGIsaCk7ZS5tZXRob2RzPXtpc2Rpc2pvaW50OnskbWV0aChhKXtjb25zdCBiPWModGhpcyk7cmV0dXJuIGIuaXNkaXNqb2ludC4kbWV0aC5jYWxsKGIsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0aGUgdmlldyBhbmQgdGhlIGdpdmVuIGl0ZXJhYmxlIGhhdmUgYSBudWxsIGludGVyc2VjdGlvbi5cIn0sX19yZXZlcnNlZF9fOnskbWV0aDpkLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Qga2V5cy5cIn19O1xuZS5mbGFncz17c2skYWNjZXB0YWJsZV9hc19iYXNlOiExfTtcImRpY3RfdmFsdWVzXCI9PT1hJiYoZGVsZXRlIGUuc2xvdHMudHAkYXNfbnVtYmVyLGRlbGV0ZSBlLnNsb3RzLnRwJHJpY2hjb21wYXJlKTtyZXR1cm4gU2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhhLGUpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBTay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoYSx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRvcmlnPWE7dGhpcy50cCRpdGVybmV4dD0oKT0+e3RoaXMuJHNlcT1hLiRpdGVtcygpO3RoaXMuJHZlcnNpb249YS4kdmVyc2lvbjtjJiYodGhpcy4kc2VxPXRoaXMuJHNlcS5yZXZlcnNlKCkpO3RoaXMudHAkaXRlcm5leHQ9dGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUudHAkaXRlcm5leHQ7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoKX19LGl0ZXJuZXh0OmIsbWV0aG9kczp7X19sZW5ndGhfaGludF9fOlNrLmdlbmVyaWMuaXRlckxlbmd0aEhpbnRXaXRoQXJyYXlNZXRob2REZWZ9LFxuZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX0scHJvdG86e25leHQkaXRlbTpsfX0pfWZ1bmN0aW9uIGwoKXtpZih0aGlzLiR2ZXJzaW9uIT09dGhpcy4kb3JpZy4kdmVyc2lvbil7aWYodGhpcy4kbGVuIT09dGhpcy4kb3JpZy5nZXQkc2l6ZSgpKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcImRpY3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb25cIik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uUnVudGltZUVycm9yKFwiZGljdGlvbmFyeSBrZXlzIGNoYW5nZWQgZHVyaW5nIGl0ZXJhdGlvblwiKTt9cmV0dXJuIHRoaXMuJHNlcVt0aGlzLiRpbmRleCsrXX1Tay5idWlsdGluLmRpY3Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImRpY3RcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO1NrLmFzc2VydHMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYSkmJjA9PT1hLmxlbmd0aCUyJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0LFxuXCJiYWQgY2FsbCB0byBkaWN0IGNvbnN0cnVjdG9yXCIpO3RoaXMuc2l6ZT0wO3RoaXMuZW50cmllcz1PYmplY3QuY3JlYXRlKG51bGwpO3RoaXMuYnVja2V0cz17fTtmb3IobGV0IGI9MDtiPGEubGVuZ3RoO2IrPTIpdGhpcy5zZXQkaXRlbShhW2JdLGFbYisxXSk7dGhpcy5pbiRyZXByPSExO3RoaXMuJHZlcnNpb249MH0sc2xvdHM6e3RwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkYXNfbnVtYmVyOiEwLHRwJGhhc2g6U2suYnVpbHRpbi5ub25lLm5vbmUkLHRwJGRvYzpcImRpY3QoKSAtPiBuZXcgZW1wdHkgZGljdGlvbmFyeVxcbmRpY3QobWFwcGluZykgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhIG1hcHBpbmcgb2JqZWN0J3NcXG4gICAgKGtleSwgdmFsdWUpIHBhaXJzXFxuZGljdChpdGVyYWJsZSkgLT4gbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgYXMgaWYgdmlhOlxcbiAgICBkID0ge31cXG4gICAgZm9yIGssIHYgaW4gaXRlcmFibGU6XFxuICAgICAgICBkW2tdID0gdlxcbmRpY3QoKiprd2FyZ3MpIC0+IG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWU9dmFsdWUgcGFpcnNcXG4gICAgaW4gdGhlIGtleXdvcmQgYXJndW1lbnQgbGlzdC4gIEZvciBleGFtcGxlOiAgZGljdChvbmU9MSwgdHdvPTIpXCIsXG4kcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiey4uLn1cIik7dGhpcy5pbiRyZXByPSEwO2NvbnN0IGE9dGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+U2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIjogXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihiKSk7dGhpcy5pbiRyZXByPSExO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJ7XCIrYS5qb2luKFwiLCBcIikrXCJ9XCIpfSx0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGIpe3JldHVybiB0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwiZGljdFwiKX0sdHAkaXRlcigpe3JldHVybiBuZXcgayh0aGlzKX0sdHAkcmljaGNvbXBhcmUoYSxiKXtsZXQgYztpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpfHxcIkVxXCIhPT1iJiZcIk5vdEVxXCIhPT1iKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtpZihhPT09dGhpcyljPSEwO2Vsc2UgaWYodGhpcy5zaXplIT09XG5hLnNpemUpYz0hMTtlbHNle2xldCBiO2M9dGhpcy4kaXRlbXMoKS5ldmVyeSgoW2MsZF0pPT57Yj1hLm1wJGxvb2t1cChjKTtyZXR1cm4gdm9pZCAwIT09YiYmKGI9PT1kfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woZCxiLFwiRXFcIikpfSl9cmV0dXJuXCJFcVwiPT09Yj9jOiFjfSxuYiRvcihhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3QpKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPXRoaXMuZGljdCRjb3B5KCk7Yi5kaWN0JG1lcmdlKGEpO3JldHVybiBifSxuYiRyZWZsZWN0ZWRfb3IoYSl7aWYoIShhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5kaWN0KSlyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7YT1hLmRpY3QkY29weSgpO2EuZGljdCRtZXJnZSh0aGlzKTtyZXR1cm4gYX0sbmIkaW5wbGFjZV9vcihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy51cGRhdGUkb25lYXJnKGEpLFxuKCk9PnRoaXMpfSxzcSRsZW5ndGgoKXtyZXR1cm4gdGhpcy5nZXQkc2l6ZSgpfSxzcSRjb250YWlucyhhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5tcCRsb29rdXAoYSl9LG1wJHN1YnNjcmlwdChhLGIpe3ZhciBjPXRoaXMubXAkbG9va3VwKGEpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKHRoaXMsU2suYnVpbHRpbi5zdHIuJG1pc3NpbmcpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGE9U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW2FdKSxiP2E6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGEpO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sbXAkYXNzX3N1YnNjcmlwdChhLGIpe2lmKHZvaWQgMD09PWIpe2lmKHZvaWQgMD09PXRoaXMucG9wJGl0ZW0oYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoYSk7fWVsc2UgdGhpcy5zZXQkaXRlbShhLGIpfX0sbWV0aG9kczp7X19yZXZlcnNlZF9fOnskbWV0aCgpe3JldHVybiBuZXcgQSh0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkaWN0IGtleXMuXCJ9LGdldDp7JG1ldGgoYSxiKXtyZXR1cm4gdGhpcy5tcCRsb29rdXAoYSl8fGJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBrZXkgaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2UgZGVmYXVsdC5cIn0sc2V0ZGVmYXVsdDp7JG1ldGgoYixjKXtsZXQgZDtjb25zdCBlPWEoYik7ZD1cInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdOnRoaXMuZ2V0JGJ1Y2tldF9pdGVtKGIsZSk7aWYodm9pZCAwIT09ZClyZXR1cm4gZFsxXTtjPWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcInN0cmluZ1wiPT09dHlwZW9mIGU/dGhpcy5lbnRyaWVzW2VdPVtiLGNdOlxudGhpcy5zZXQkYnVja2V0X2l0ZW0oYixjLGUpO3RoaXMuc2l6ZSsrO3RoaXMuJHZlcnNpb24rKztyZXR1cm4gY30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIC8pXCIsJGRvYzpcIkluc2VydCBrZXkgd2l0aCBhIHZhbHVlIG9mIGRlZmF1bHQgaWYga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cXG5cXG5SZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYga2V5IGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlIGRlZmF1bHQuXCJ9LHBvcDp7JG1ldGgoYSxiKXtjb25zdCBjPXRoaXMucG9wJGl0ZW0oYSk7aWYodm9pZCAwIT09YylyZXR1cm4gY1sxXTtpZih2b2lkIDAhPT1iKXJldHVybiBiO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS5cXG5JZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkXCJ9LFxucG9waXRlbTp7JG1ldGgoKXtjb25zdCBhPXRoaXMuZ2V0JHNpemUoKTtpZigwPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5LZXlFcnJvcihcInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eVwiKTtjb25zdCBbYixjXT10aGlzLiRpdGVtcygpW2EtMV07dGhpcy5wb3AkaXRlbShiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2IsY10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZW1vdmUgYW5kIHJldHVybiBzb21lIChrZXksIHZhbHVlKSBwYWlyIGFzIGFcXG4yLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS5cIn0sa2V5czp7JG1ldGgoKXtyZXR1cm4gbmV3IGQodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBuZXcgbih0aGlzKX0sXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gbmV3IGcodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sdXBkYXRlOnskbWV0aChhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZSRjb21tb24oYSxiLFwidXBkYXRlXCIpLCgpPT5Tay5idWlsdGluLm5vbmUubm9uZSQpfSwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnVwZGF0ZShbRSwgXSoqRikgLT4gTm9uZS4gIFVwZGF0ZSBEIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLlxcbklmIEUgaXMgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIHRoZW4gZG9lczogIGZvciBrIGluIEU6IERba10gPSBFW2tdXFxuSWYgRSBpcyBwcmVzZW50IGFuZCBsYWNrcyBhIC5rZXlzKCkgbWV0aG9kLCB0aGVuIGRvZXM6ICBmb3IgaywgdiBpbiBFOiBEW2tdID0gdlxcbkluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgayBpbiBGOiAgRFtrXSA9IEZba11cIn0sXG5jbGVhcjp7JG1ldGgoKXt0aGlzLnNpemU9MDt0aGlzLiR2ZXJzaW9uKys7dGhpcy5lbnRyaWVzPU9iamVjdC5jcmVhdGUobnVsbCk7dGhpcy5idWNrZXRzPXt9fSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gRC5cIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gdGhpcy5kaWN0JGNvcHkoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LGNsYXNzbWV0aG9kczp7ZnJvbWtleXM6eyRtZXRoOmZ1bmN0aW9uKGEsYil7Yj1ifHxTay5idWlsdGluLm5vbmUubm9uZSQ7bGV0IGM9dGhpcz09PVNrLmJ1aWx0aW4uZGljdD9uZXcgdGhpczp0aGlzLnRwJGNhbGwoW10sW10pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGQ9PntjPWQ7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihhKSxhPT5cbmMubXAkYXNzX3N1YnNjcmlwdChhLGIsITApKX0sKCk9PmMpfSwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCR0eXBlLCBpdGVyYWJsZSwgdmFsdWU9Tm9uZSwgLylcIiwkZG9jOlwiQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gaXRlcmFibGUgYW5kIHZhbHVlcyBzZXQgdG8gdmFsdWUuXCJ9fSxwcm90bzp7cXVpY2skbG9va3VwOmZ1bmN0aW9uKGEpe2E9dGhpcy5lbnRyaWVzW2EuJHNhdmVkS2V5SGFzaF07aWYodm9pZCAwIT09YSlyZXR1cm4gYVsxXX0sbXAkbG9va3VwOmZ1bmN0aW9uKGIpe2NvbnN0IGM9YShiKTtiPVwic3RyaW5nXCI9PT10eXBlb2YgYz90aGlzLmVudHJpZXNbY106dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixjKTtpZih2b2lkIDAhPT1iKXJldHVybiBiWzFdfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnNpemV9LHNrJGFzYXJyYXkoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpLm1hcChhPT5hWzBdKX0sdXBkYXRlJGNvbW1vbjpmdW5jdGlvbihhLFxuYixjKXtTay5hYnN0ci5jaGVja0FyZ3NMZW4oYyxhLDAsMSk7YT1hWzBdO2xldCBkO3ZvaWQgMCE9PWEmJihkPXRoaXMudXBkYXRlJG9uZWFyZyhhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGQsKCk9PntpZihiKWZvcihsZXQgYT0wO2E8Yi5sZW5ndGg7YSs9Mil0aGlzLnNldCRpdGVtKG5ldyBTay5idWlsdGluLnN0cihiW2FdKSxiW2ErMV0pfSl9LHVwZGF0ZSRvbmVhcmcoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmRpY3R8fHZvaWQgMCE9PVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYSxTay5idWlsdGluLnN0ci4ka2V5cyk/dGhpcy5kaWN0JG1lcmdlKGEpOnRoaXMuZGljdCRtZXJnZV9zZXEoYSl9LGRpY3QkY29weSgpe2NvbnN0IGE9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7YS5zaXplPXRoaXMuc2l6ZTt2YXIgYj1PYmplY3QuZW50cmllcyh0aGlzLmVudHJpZXMpO2Zvcih2YXIgYyBpbiBiKXt2YXIgZD1iW2NdWzFdO2EuZW50cmllc1tiW2NdWzBdXT1bZFswXSxcbmRbMV1dfWZvcihsZXQgZSBpbiB0aGlzLmJ1Y2tldHMpZm9yKGM9dGhpcy5idWNrZXRzW2VdLGEuYnVja2V0c1tlXT1iPVtdLGQ9MDtkPGMubGVuZ3RoO2QrKyliLnB1c2goYS5lbnRyaWVzW1wiI1wiK2UrXCJfXCIrZF0pO3JldHVybiBhfSwkaXRlbXMoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmVudHJpZXMpfSxzZXQkaXRlbTpmdW5jdGlvbihiLGMpe2NvbnN0IGQ9YShiKTtsZXQgZTtcInN0cmluZ1wiPT09dHlwZW9mIGQ/KGU9dGhpcy5lbnRyaWVzW2RdLHZvaWQgMD09PWU/KHRoaXMuZW50cmllc1tkXT1bYixjXSx0aGlzLnNpemUrKyx0aGlzLiR2ZXJzaW9uKyspOmVbMV09Yyk6KGU9dGhpcy5nZXQkYnVja2V0X2l0ZW0oYixkKSx2b2lkIDA9PT1lPyh0aGlzLnNldCRidWNrZXRfaXRlbShiLGMsZCksdGhpcy5zaXplKyssdGhpcy4kdmVyc2lvbisrKTplWzFdPWMpfSxnZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiKXtiPXRoaXMuYnVja2V0c1tiXTtpZih2b2lkIDAhPT1iKWZvcihsZXQgZD1cbjA7ZDxiLmxlbmd0aDtkKyspe3ZhciBjPWJbZF07aWYodm9pZCAwIT09YyYmKGNbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjWzBdLFwiRXFcIikpKXJldHVybiBjfX0scG9wJGJ1Y2tldF9pdGVtOmZ1bmN0aW9uKGEsYil7Y29uc3QgYz10aGlzLmJ1Y2tldHNbYl07bGV0IGQ7aWYodm9pZCAwIT09Yylmb3IobGV0IGU9MDtlPGMubGVuZ3RoO2UrKylpZihkPWNbZV0sdm9pZCAwIT09ZCYmKGRbMF09PT1hfHxTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxkWzBdLFwiRXFcIikpKXJldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzW1wiI1wiK2IrXCJfXCIrZV0sY1tlXT12b2lkIDAsYy5ldmVyeShhPT52b2lkIDA9PT1hKSYmZGVsZXRlIHRoaXMuYnVja2V0c1tiXSxkfSxzZXQkYnVja2V0X2l0ZW06ZnVuY3Rpb24oYSxiLGMpe2xldCBkPXRoaXMuYnVja2V0c1tjXTthPVthLGJdO3ZvaWQgMD09PWQ/KHRoaXMuYnVja2V0c1tjXT1bYV0sYz1cIiNcIitjK1wiXzBcIik6KGI9ZC5pbmRleE9mKHZvaWQgMCksXG4tMSE9PWI/KGM9XCIjXCIrYytcIl9cIitiLGRbYl09YSk6KGM9XCIjXCIrYytcIl9cIitkLmxlbmd0aCxkLnB1c2goYSkpKTt0aGlzLmVudHJpZXNbY109YX0scG9wJGl0ZW06ZnVuY3Rpb24oYil7Y29uc3QgYz1hKGIpO1wic3RyaW5nXCI9PT10eXBlb2YgYz8oYj10aGlzLmVudHJpZXNbY10sZGVsZXRlIHRoaXMuZW50cmllc1tjXSk6Yj10aGlzLnBvcCRidWNrZXRfaXRlbShiLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIHRoaXMuc2l6ZS0tLHRoaXMuJHZlcnNpb24rKyxifSxkaWN0JG1lcmdlOmZ1bmN0aW9uKGEpe2lmKGEudHAkaXRlcj09PVNrLmJ1aWx0aW4uZGljdC5wcm90b3R5cGUudHAkaXRlcil7dmFyIGI9YS50cCRpdGVyKCk7Zm9yKGxldCBjPWIudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1jO2M9Yi50cCRpdGVybmV4dCgpKXtjb25zdCBiPWEubXAkc3Vic2NyaXB0KGMpO3RoaXMuc2V0JGl0ZW0oYyxiKX19ZWxzZSByZXR1cm4gYj1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJGtleXMpLFxuU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGIsW10pLGI9PlNrLm1pc2NldmFsLml0ZXJGb3IoU2suYWJzdHIuaXRlcihiKSxiPT5Tay5taXNjZXZhbC5jaGFpbihhLm1wJHN1YnNjcmlwdChiLCEwKSxhPT57dGhpcy5zZXQkaXRlbShiLGEpfSkpKX0sZGljdCRtZXJnZV9zZXE6ZnVuY3Rpb24oYSl7bGV0IGI9MDtyZXR1cm4gU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZighU2suYnVpbHRpbi5jaGVja0l0ZXJhYmxlKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlIHNlcXVlbmNlIGVsZW1lbnQgI1wiK2IrXCIgdG8gYSBzZXF1ZW5jZVwiKTthPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpO2lmKDIhPT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjXCIrXG5iK1wiIGhhcyBsZW5ndGggXCIrYS5sZW5ndGgrXCI7IDIgaXMgcmVxdWlyZWRcIik7dGhpcy5zZXQkaXRlbShhWzBdLGFbMV0pO2IrK30pfX19KTtjb25zdCBoPXt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRoYXNoOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe2lmKHRoaXMuaW4kcmVwcilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLi4uXCIpO3RoaXMuaW4kcmVwcj0hMDtsZXQgYT1Tay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZSh0aGlzKTthPWEubWFwKGE9PlNrLm1pc2NldmFsLm9iamVjdFJlcHIoYSkpO3RoaXMuaW4kcmVwcj0hMTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRyaWNoY29tcGFyZShhLGMpe2lmKCEoU2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8YSBpbnN0YW5jZW9mIGR8fFxuYSBpbnN0YW5jZW9mIG4pKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBlPXRoaXMuc3EkbGVuZ3RoKCksZj1hLnNxJGxlbmd0aCgpO3N3aXRjaChjKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpsZXQgZDt0aGlzPT09YT9kPSEwOmU9PT1mJiYoZD1iKHRoaXMsYSkpO3JldHVyblwiTm90RXFcIj09PWM/IWQ6ZDtjYXNlIFwiTHRcIjpyZXR1cm4gZTxmJiZiKHRoaXMsYSk7Y2FzZSBcIkx0RVwiOnJldHVybiBlPD1mJiZiKHRoaXMsYSk7Y2FzZSBcIkd0XCI6cmV0dXJuIGU+ZiYmYihhLHRoaXMpO2Nhc2UgXCJHdEVcIjpyZXR1cm4gZT49ZiYmYihhLHRoaXMpfX0sbmIkc3VidHJhY3QoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmRpZmZlcmVuY2UuJG1ldGguY2FsbChiLGEpfSxuYiRhbmQoYSl7Y29uc3QgYj1jKHRoaXMpO3JldHVybiBiLmludGVyc2VjdGlvbi4kbWV0aC5jYWxsKGIsYSl9LG5iJG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi51bmlvbi4kbWV0aC5jYWxsKGIsXG5hKX0sbmIkeG9yKGEpe2NvbnN0IGI9Yyh0aGlzKTtyZXR1cm4gYi5zeW1tZXRyaWNfZGlmZmVyZW5jZS4kbWV0aC5jYWxsKGIsYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmRpY3QuZ2V0JHNpemUoKX19O3ZhciBkPWUoXCJkaWN0X2tleXNcIix7c3EkY29udGFpbnMoYSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZGljdC5tcCRsb29rdXAoYSl9LHRwJGl0ZXIoKXtyZXR1cm4gbmV3IGsodGhpcy5kaWN0KX19LGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBKHRoaXMuZGljdCl9KSxnPWUoXCJkaWN0X3ZhbHVlc1wiLHt0cCRpdGVyKCl7cmV0dXJuIG5ldyB1KHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdih0aGlzLmRpY3QpfSksbj1lKFwiZGljdF9pdGVtc1wiLHtzcSRjb250YWlucyhhKXtpZighKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLnR1cGxlJiYyPT09YS5zcSRsZW5ndGgoKSkpcmV0dXJuITE7dmFyIGI9YS5tcCRzdWJzY3JpcHQobmV3IFNrLmJ1aWx0aW4uaW50XygwKSk7XG5hPWEubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLmludF8oMSkpO2I9dGhpcy5kaWN0Lm1wJGxvb2t1cChiKTtyZXR1cm4gdm9pZCAwPT09Yj8hMTpiPT09YXx8U2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGIsYSxcIkVxXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBwKHRoaXMuZGljdCl9fSxmdW5jdGlvbigpe3JldHVybiBuZXcgdCh0aGlzLmRpY3QpfSksaz1mKFwiZGljdF9rZXlpdGVyYXRvclwiLGZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5leHQkaXRlbSgpO3JldHVybiBhJiZhWzBdfSkscD1mKFwiZGljdF9pdGVtaXRlcmF0b3JcIixmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5uZXh0JGl0ZW0oKTtyZXR1cm4gYSYmbmV3IFNrLmJ1aWx0aW4udHVwbGUoW2FbMF0sYVsxXV0pfSksdT1mKFwiZGljdF92YWx1ZWl0ZXJhdG9yXCIsZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMubmV4dCRpdGVtKCk7cmV0dXJuIGEmJmFbMV19KSxBPWYoXCJkaWN0X3JldmVyc2VrZXlpdGVyYXRvclwiLGsucHJvdG90eXBlLnRwJGl0ZXJuZXh0LFxuITApLHQ9ZihcImRpY3RfcmV2ZXJzZWl0ZW1pdGVyYXRvclwiLHAucHJvdG90eXBlLnRwJGl0ZXJuZXh0LCEwKSx2PWYoXCJkaWN0X3JldmVyc2V2YWx1ZWl0ZXJhdG9yXCIsdS5wcm90b3R5cGUudHAkaXRlcm5leHQsITApO1NrLmJ1aWx0aW4uZGljdC5weTIkbWV0aG9kcz17aGFzX2tleTp7JG5hbWU6XCJoYXNfa2V5XCIsJGZsYWdzOntPbmVBcmc6ITB9LCRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5ib29sKHRoaXMuc3EkY29udGFpbnMoYSkpfSwkZG9jOlwiRC5oYXNfa2V5KGspIC0+IFRydWUgaWYgRCBoYXMgYSBrZXkgaywgZWxzZSBGYWxzZVwifSxrZXlzOnskbmFtZTpcImtleXNcIiwkbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMuc2skYXNhcnJheSgpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQua2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGtleXNcIn0saXRlbXM6eyRuYW1lOlwiaXRlbXNcIixcbiRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFthLGJdKT0+bmV3IFNrLmJ1aWx0aW4udHVwbGUoW2EsYl0pKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELml0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBEJ3MgaXRlbXNcIn0sdmFsdWVzOnskbmFtZTpcInZhbHVlc1wiLCRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3QodGhpcy4kaXRlbXMoKS5tYXAoKFssYV0pPT5hKSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELnZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn19fSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhhLHtlbnRyaWVzOntnZXQ6KCk9Pntjb25zdCBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2IsXG5jXSk9PntiPVNrLnVuZml4UmVzZXJ2ZWQoYik7Yi5pbmNsdWRlcyhcIiRcIil8fChiPW5ldyBTay5idWlsdGluLnN0cihiKSxhW2IuJHNhdmVkS2V5SGFzaF09W2IsY10pfSk7cmV0dXJuIGF9LGNvbmZpZ3VyYWJsZTohMH0sc2l6ZTp7Z2V0OigpPT5PYmplY3Qua2V5cyhiKS5tYXAoYT0+U2sudW5maXhSZXNlcnZlZChhKSkuZmlsdGVyKGE9PiFhLmluY2x1ZGVzKFwiJFwiKSkubGVuZ3RoLGNvbmZpZ3VyYWJsZTohMH19KX1Tay5idWlsdGluLm1hcHBpbmdwcm94eT1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwibWFwcGluZ3Byb3h5XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGMpe1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSxcImJhZCBjYWxsIHRvIG1hcHBpbmcgcHJveHksIHVzZSAnbmV3J1wiKTt0aGlzLm1hcHBpbmc9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7dm9pZCAwIT09YyYmYSh0aGlzLm1hcHBpbmcsYyl9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cixcbnRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYil7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcIm1hcHBpbmdwcm94eVwiLGIpO1NrLmFic3RyLmNoZWNrT25lQXJnKFwibWFwcGluZ3Byb3h5XCIsYSxiKTthPWFbMF07aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm1hcHBpbmdwcm94eSgpIGFyZ3VtZW50IG11c3QgYmUgYSBtYXBwaW5nLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO2I9bmV3IFNrLmJ1aWx0aW4ubWFwcGluZ3Byb3h5O2IubWFwcGluZz1hO3JldHVybiBifSx0cCRyaWNoY29tcGFyZShhLGIpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2wodGhpcy5tYXBwaW5nLGEsYil9LHRwJHN0cigpe3JldHVybiB0aGlzLm1hcHBpbmcudHAkc3RyKCl9LCRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihcIm1hcHBpbmdwcm94eShcIitcblNrLm1pc2NldmFsLm9iamVjdFJlcHIodGhpcy5tYXBwaW5nKStcIilcIil9LG1wJHN1YnNjcmlwdChhLGIpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkc3Vic2NyaXB0KGEsYil9LHNxJGNvbnRhaW5zKGEpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkY29udGFpbnMoYSl9LHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLm1hcHBpbmcuc3EkbGVuZ3RoKCl9LHRwJGl0ZXIoKXtyZXR1cm4gdGhpcy5tYXBwaW5nLnRwJGl0ZXIoKX0sdHAkYXNfbnVtYmVyOiEwLG5iJG9yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AodGhpcy5tYXBwaW5nLGEsXCJCaXRPclwiKX0sbmIkcmVmbGVjdGVkX29yKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLm1hcHBpbmdwcm94eSYmKGE9YS5tYXBwaW5nKTtyZXR1cm4gU2suYWJzdHIubnVtYmVyQmluT3AoYSx0aGlzLm1hcHBpbmcsXCJCaXRPclwiKX0sbmIkaW5wbGFjZV9vcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCInfD0nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgXCIrXG5Tay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIjsgdXNlICd8JyBpbnN0ZWFkXCIpO319LG1ldGhvZHM6e2dldDp7JG1ldGgoYSxiKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGdldCksYSxiKX0sJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5nZXQoa1ssZF0pIC0+IERba10gaWYgayBpbiBELCBlbHNlIGQuICBkIGRlZmF1bHRzIHRvIE5vbmUuXCJ9LGtleXM6eyRtZXRoKCl7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLm1hcHBpbmcudHAkZ2V0YXR0cih0aGlzLnN0ciRrZXlzKSxbXSl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJELmtleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyBrZXlzXCJ9LGl0ZW1zOnskbWV0aCgpe3JldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkodGhpcy5tYXBwaW5nLnRwJGdldGF0dHIodGhpcy5zdHIkaXRlbXMpLFxuW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC5pdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gRCdzIGl0ZW1zXCJ9LHZhbHVlczp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJHZhbHVlcyksW10pfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiRC52YWx1ZXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIEQncyB2YWx1ZXNcIn0sY29weTp7JG1ldGgoKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KHRoaXMubWFwcGluZy50cCRnZXRhdHRyKHRoaXMuc3RyJGNvcHkpLFtdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkQuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIERcIn19LHByb3RvOntzdHIkZ2V0Om5ldyBTay5idWlsdGluLnN0cihcImdldFwiKSxcbnN0ciRjb3B5Om5ldyBTay5idWlsdGluLnN0cihcImNvcHlcIiksc3RyJGtleXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwia2V5c1wiKSxzdHIkaXRlbXM6bmV3IFNrLmJ1aWx0aW4uc3RyKFwiaXRlbXNcIiksc3RyJHZhbHVlczpuZXcgU2suYnVpbHRpbi5zdHIoXCJ2YWx1ZXNcIiksbXAkbG9va3VwKGEpe3JldHVybiB0aGlzLm1hcHBpbmcubXAkbG9va3VwKGEpfX0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnByb3BlcnR5PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJwcm9wZXJ0eVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlKXt0aGlzLnByb3AkZ2V0PWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3Akc2V0PWN8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZGVsPWJ8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJDt0aGlzLnByb3AkZG9jPWV8fGEmJmEuJGRvY3x8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbnNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe2E9U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJwcm9wZXJ0eVwiLFtcImZnZXRcIixcImZzZXRcIixcImZkZWxcIixcImRvY1wiXSxhLGMsQXJyYXkoNCkuZmlsbChTay5idWlsdGluLm5vbmUubm9uZSQpKTt0aGlzLnByb3AkZ2V0PWFbMF07dGhpcy5wcm9wJHNldD1hWzFdO3RoaXMucHJvcCRkZWw9YVsyXTtTay5idWlsdGluLmNoZWNrTm9uZShhWzNdKT9Tay5idWlsdGluLmNoZWNrTm9uZShhWzBdKXx8KHRoaXMucHJvcCRkb2M9YVswXS4kZG9jfHxhWzNdKTp0aGlzLnByb3AkZG9jPWFbM119LHRwJGRvYzpcIlByb3BlcnR5IGF0dHJpYnV0ZS5cXG5cXG4gIGZnZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZ2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZzZXRcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgdmFsdWVcXG4gIGZkZWxcXG4gICAgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgZGVsJ2luZyBhbiBhdHRyaWJ1dGVcXG4gIGRvY1xcbiAgICBkb2NzdHJpbmdcXG5cXG5UeXBpY2FsIHVzZSBpcyB0byBkZWZpbmUgYSBtYW5hZ2VkIGF0dHJpYnV0ZSB4OlxcblxcbmNsYXNzIEMob2JqZWN0KTpcXG4gICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94XFxuICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKTogc2VsZi5feCA9IHZhbHVlXFxuICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5feFxcbiAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgJ0knbSB0aGUgJ3gnIHByb3BlcnR5LicpXFxuXFxuRGVjb3JhdG9ycyBtYWtlIGRlZmluaW5nIG5ldyBwcm9wZXJ0aWVzIG9yIG1vZGlmeWluZyBleGlzdGluZyBvbmVzIGVhc3k6XFxuXFxuY2xhc3MgQyhvYmplY3QpOlxcbiAgICBAcHJvcGVydHlcXG4gICAgZGVmIHgoc2VsZik6XFxuICAgICAgICAnSSBhbSB0aGUgJ3gnIHByb3BlcnR5LidcXG4gICAgICAgIHJldHVybiBzZWxmLl94XFxuICAgIEB4LnNldHRlclxcbiAgICBkZWYgeChzZWxmLCB2YWx1ZSk6XFxuICAgICAgICBzZWxmLl94ID0gdmFsdWVcXG4gICAgQHguZGVsZXRlclxcbiAgICBkZWYgeChzZWxmKTpcXG4gICAgICAgIGRlbCBzZWxmLl94XCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZihudWxsPT09YSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT10aGlzLnByb3AkZ2V0KXRocm93IG5ldyBTay5idWlsdGluLkF0dHJpYnV0ZUVycm9yKFwidW5yZWFkYWJsZSBhdHRyaWJ1dGVcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLnByb3AkZ2V0LFthXSl9LHRwJGRlc2NyX3NldChhLGMpe2xldCBiO2I9bnVsbD09Yz90aGlzLnByb3AkZGVsOnRoaXMucHJvcCRzZXQ7aWYoU2suYnVpbHRpbi5jaGVja05vbmUoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCJjYW4ndCBcIisobnVsbD09Yz9cImRlbGV0ZVwiOlwic2V0XCIpK1wiIGF0dHJpYnV0ZVwiKTtpZighYi50cCRjYWxsKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShiKStcIicgaXMgbm90IGNhbGxhYmxlXCIpO3JldHVybiBudWxsPT1jP2IudHAkY2FsbChbYV0pOmIudHAkY2FsbChbYSxjXSl9fSxcbm1ldGhvZHM6e2dldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KGEsdGhpcy5wcm9wJHNldCx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LHNldHRlcjp7JG1ldGgoYSl7cmV0dXJuIG5ldyBTay5idWlsdGluLnByb3BlcnR5KHRoaXMucHJvcCRnZXQsYSx0aGlzLnByb3AkZGVsLHRoaXMucHJvcCRkb2MpfSwkZmxhZ3M6e09uZUFyZzohMH19LGRlbGV0ZXI6eyRtZXRoKGEpe3JldHVybiBuZXcgU2suYnVpbHRpbi5wcm9wZXJ0eSh0aGlzLnByb3AkZ2V0LHRoaXMucHJvcCRzZXQsYSx0aGlzLnByb3AkZG9jKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0sZ2V0c2V0czp7ZmdldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZ2V0fX0sZnNldDp7JGdldCgpe3JldHVybiB0aGlzLnByb3Akc2V0fX0sZmRlbDp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZGVsfX0sX19kb2NfXzp7JGdldCgpe3JldHVybiB0aGlzLnByb3AkZG9jfSxcbiRzZXQoYSl7dGhpcy5wcm9wJGRvYz1hPWF8fFNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fX0pO1NrLmJ1aWx0aW4uY2xhc3NtZXRob2Q9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImNsYXNzbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuY20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsdHAkaW5pdChhLGMpe1NrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJjbGFzc21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImNsYXNzbWV0aG9kXCIsYSwxLDEpO3RoaXMuY20kY2FsbGFibGU9YVswXX0sdHAkZG9jOlwiY2xhc3NtZXRob2QoZnVuY3Rpb24pIC0+IG1ldGhvZFxcblxcbkNvbnZlcnQgYSBmdW5jdGlvbiB0byBiZSBhIGNsYXNzIG1ldGhvZC5cXG5cXG5BIGNsYXNzIG1ldGhvZCByZWNlaXZlcyB0aGUgY2xhc3MgYXMgaW1wbGljaXQgZmlyc3QgYXJndW1lbnQsXFxuanVzdCBsaWtlIGFuIGluc3RhbmNlIG1ldGhvZCByZWNlaXZlcyB0aGUgaW5zdGFuY2UuXFxuVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICBjbGFzcyBDOlxcbiAgICAgIEBjbGFzc21ldGhvZFxcbiAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTpcXG4gICAgICAgICAgLi4uXFxuXFxuSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZVxcbihlLmcuIEMoKS5mKCkpLiAgVGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuXFxuSWYgYSBjbGFzcyBtZXRob2QgaXMgY2FsbGVkIGZvciBhIGRlcml2ZWQgY2xhc3MsIHRoZSBkZXJpdmVkIGNsYXNzXFxub2JqZWN0IGlzIHBhc3NlZCBhcyB0aGUgaW1wbGllZCBmaXJzdCBhcmd1bWVudC5cXG5cXG5DbGFzcyBtZXRob2RzIGFyZSBkaWZmZXJlbnQgdGhhbiBDKysgb3IgSmF2YSBzdGF0aWMgbWV0aG9kcy5cXG5JZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi5cIixcbnRwJGRlc2NyX2dldChhLGMpe2NvbnN0IGI9dGhpcy5jbSRjYWxsYWJsZTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgY2xhc3NtZXRob2Qgb2JqZWN0XCIpO3ZvaWQgMD09PWMmJihjPWEub2IkdHlwZSk7cmV0dXJuKGE9Yi50cCRkZXNjcl9nZXQpP2EuY2FsbChiLGMpOm5ldyBTay5idWlsdGluLm1ldGhvZChiLGMpfX0sZ2V0c2V0czp7X19mdW5jX186eyRnZXQoKXtyZXR1cm4gdGhpcy5jbSRjYWxsYWJsZX19LF9fZGljdF9fOlNrLmdlbmVyaWMuZ2V0U2V0RGljdH19KTtTay5idWlsdGluLnN0YXRpY21ldGhvZD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3RhdGljbWV0aG9kXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuc20kY2FsbGFibGU9YTt0aGlzLiRkPW5ldyBTay5idWlsdGluLmRpY3R9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRuZXc6U2suZ2VuZXJpYy5uZXcsXG50cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN0YXRpY21ldGhvZFwiLGMpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcInN0YXRpY21ldGhvZFwiLGEsMSwxKTt0aGlzLnNtJGNhbGxhYmxlPWFbMF19LHRwJGRvYzpcInN0YXRpY21ldGhvZChmdW5jdGlvbikgLT4gbWV0aG9kXFxuXFxuQ29udmVydCBhIGZ1bmN0aW9uIHRvIGJlIGEgc3RhdGljIG1ldGhvZC5cXG5cXG5BIHN0YXRpYyBtZXRob2QgZG9lcyBub3QgcmVjZWl2ZSBhbiBpbXBsaWNpdCBmaXJzdCBhcmd1bWVudC5cXG5UbyBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206XFxuXFxuICAgICBjbGFzcyBDOlxcbiAgICAgICAgIEBzdGF0aWNtZXRob2RcXG4gICAgICAgICBkZWYgZihhcmcxLCBhcmcyLCAuLi4pOlxcbiAgICAgICAgICAgICAuLi5cXG5cXG5JdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlXFxuKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cXG5cXG5TdGF0aWMgbWV0aG9kcyBpbiBQeXRob24gYXJlIHNpbWlsYXIgdG8gdGhvc2UgZm91bmQgaW4gSmF2YSBvciBDKysuXFxuRm9yIGEgbW9yZSBhZHZhbmNlZCBjb25jZXB0LCBzZWUgdGhlIGNsYXNzbWV0aG9kIGJ1aWx0aW4uXCIsXG50cCRkZXNjcl9nZXQoYSxjKXtpZih2b2lkIDA9PT10aGlzLnNtJGNhbGxhYmxlKXRocm93IG5ldyBTay5idWlsdGluLlJ1bnRpbWVFcnJvcihcInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdFwiKTtyZXR1cm4gdGhpcy5zbSRjYWxsYWJsZX19LGdldHNldHM6e19fZnVuY19fOnskZ2V0KCl7cmV0dXJuIHRoaXMuc20kY2FsbGFibGV9fSxfX2RpY3RfXzpTay5nZW5lcmljLmdldFNldERpY3R9fSl9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXtsZXQgZT10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBlJiZcIm51bWJlclwiPT09dHlwZW9mIGMpe2NvbnN0IGI9YShlLGMpO2lmKGQoYikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9ZT1uKGUpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGUsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19XG5mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gYShkLGMpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIGIoZCxjKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGIoYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBjPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGM/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKGMpKTpuZXcgU2suYnVpbHRpbi5pbnRfKGIoYykpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy52KX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGQmJlwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhhKGQsYykpO2Q9bihkKTtjPW4oYyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oSlNCSS5udW1iZXJJZlNhZmUoYihkLGMpKSl9cmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBsKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pe2xldCBkPXRoaXMudjtjPWMudjtpZigwPT09ZClyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnYpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYyl7aWYoMD5jKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtpZihcIm51bWJlclwiPT09dHlwZW9mIGQpe2NvbnN0IGI9YShkLGMpO2lmKHZvaWQgMCE9PWIpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYil9Yz1KU0JJLkJpZ0ludChjKX1lbHNlIGlmKEpTQkkubGVzc1RoYW4oSlNCSS5CaWdJbnQoMCkpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJuZWdhdGl2ZSBzaGlmdCBjb3VudFwiKTtcbmQ9bihkKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKGQsYykpfXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJH19ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRfKXt2YXIgZD10aGlzLnY7Yz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBkJiZcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIGQ9YShkLGMpLDA+ZCYmKGQrPTQyOTQ5NjcyOTYpLG5ldyBTay5idWlsdGluLmludF8oZCk7ZD1uKGQpO2M9bihjKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLm51bWJlcklmU2FmZShiKGQsYykpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGE8PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZhPj0tTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYTw9XG5OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYT49LU51bWJlci5NQVhfU0FGRV9JTlRFR0VSPythOkpTQkkuQmlnSW50KGEpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP0pTQkkuQmlnSW50KGEpOmF9U2suYnVpbHRpbi5pbnRfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJpbnRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50XyxcImJhZCBjYWxsIHRvIGludCB1c2UgJ25ldydcIik7bGV0IGI7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxKU0JJLl9faXNCaWdJbnQoYSkpYj1hO2Vsc2UgaWYodm9pZCAwPT09YSliPTA7ZWxzZSBpZihcInN0cmluZ1wiPT09dHlwZW9mIGEpYj1nKGEpO2Vsc2V7aWYoYS5uYiRpbnQpcmV0dXJuIGEubmIkaW50KCk7U2suYXNzZXJ0cy5mYWlsKFwiYmFkIGFyZ3VtZW50IHRvIGludCBjb25zdHJ1Y3RvclwiKX10aGlzLnY9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCxcbnRwJGRvYzpcImludCh4PTApIC0+IGludGVnZXJcXG5pbnQoeCwgYmFzZT0xMCkgLT4gaW50ZWdlclxcblxcbkNvbnZlcnQgYSBudW1iZXIgb3Igc3RyaW5nIHRvIGFuIGludGVnZXIsIG9yIHJldHVybiAwIGlmIG5vIGFyZ3VtZW50c1xcbmFyZSBnaXZlbi4gIElmIHggaXMgYSBudW1iZXIsIHJldHVybiB4Ll9faW50X18oKS4gIEZvciBmbG9hdGluZyBwb2ludFxcbm51bWJlcnMsIHRoaXMgdHJ1bmNhdGVzIHRvd2FyZHMgemVyby5cXG5cXG5JZiB4IGlzIG5vdCBhIG51bWJlciBvciBpZiBiYXNlIGlzIGdpdmVuLCB0aGVuIHggbXVzdCBiZSBhIHN0cmluZyxcXG5ieXRlcywgb3IgYnl0ZWFycmF5IGluc3RhbmNlIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyIGxpdGVyYWwgaW4gdGhlXFxuZ2l2ZW4gYmFzZS4gIFRoZSBsaXRlcmFsIGNhbiBiZSBwcmVjZWRlZCBieSAnKycgb3IgJy0nIGFuZCBiZSBzdXJyb3VuZGVkXFxuYnkgd2hpdGVzcGFjZS4gIFRoZSBiYXNlIGRlZmF1bHRzIHRvIDEwLiAgVmFsaWQgYmFzZXMgYXJlIDAgYW5kIDItMzYuXFxuQmFzZSAwIG1lYW5zIHRvIGludGVycHJldCB0aGUgYmFzZSBmcm9tIHRoZSBzdHJpbmcgYXMgYW4gaW50ZWdlciBsaXRlcmFsLlxcbj4+PiBpbnQoJzBiMTAwJywgYmFzZT0wKVxcbjRcIixcbiRyKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LHRwJGhhc2goKXtjb25zdCBhPXRoaXMudjtyZXR1cm5cIm51bWJlclwiPT09dHlwZW9mIGE/YTpKU0JJLnRvTnVtYmVyKEpTQkkucmVtYWluZGVyKGEsSlNCSS5fX01BWF9TQUZFKSl9LHRwJG5ldyhhLGIpezE9PT1hLmxlbmd0aCsoYj9iLmxlbmd0aDowKT8oYj1hWzBdLGE9U2suYnVpbHRpbi5ub25lLm5vbmUkKTooYT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImludFwiLFtudWxsLFwiYmFzZVwiXSxhLGIsW25ldyBTay5idWlsdGluLmludF8oMCksU2suYnVpbHRpbi5ub25lLm5vbmUkXSksYj1hWzBdLGE9YVsxXSk7YT1hIT09U2suYnVpbHRpbi5ub25lLm5vbmUkP1NrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEpOm51bGw7aWYoYiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uc3RyKW51bGw9PT1hJiYoYT0xMCksYj1uZXcgU2suYnVpbHRpbi5pbnRfKFNrLnN0cjJudW1iZXIoYi52LFxuYSkpO2Vsc2V7aWYobnVsbCE9PWEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZVwiKTtpZihiLm5iJGludCliPWIubmIkaW50KCk7ZWxzZSBpZihhPVNrLmFic3RyLmxvb2t1cFNwZWNpYWwoYixTay5idWlsdGluLnN0ci4kdHJ1bmMpKXthPVNrLm1pc2NldmFsLmNhbGxzaW1BcnJheShhLFtdKTtpZighU2suYnVpbHRpbi5jaGVja0ludChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoU2suYnVpbHRpbi5zdHIuJHRydW5jLiRqc3N0cigpK1wiIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSBcIitTay5hYnN0ci50eXBlTmFtZShiKStcIilcIik7Yj1uZXcgU2suYnVpbHRpbi5pbnRfKGEudil9ZWxzZSB0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJpbnQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBhIGJ5dGVzLWxpa2Ugb2JqZWN0IG9yIGEgbnVtYmVyLCBub3QgJ1wiK1xuU2suYWJzdHIudHlwZU5hbWUoYikrXCInXCIpO31pZih0aGlzPT09U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZSlyZXR1cm4gYjthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO2Eudj1iLnY7cmV0dXJuIGF9LHRwJGdldGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLG9iJGVxOmMoKGEsYik9PmE9PWIsSlNCSS5lcXVhbCksb2IkbmU6YygoYSxiKT0+YSE9YixKU0JJLm5vdEVxdWFsKSxvYiRndDpjKChhLGIpPT5hPmIsSlNCSS5ncmVhdGVyVGhhbiksb2IkZ2U6YygoYSxiKT0+YT49YixKU0JJLmdyZWF0ZXJUaGFuT3JFcXVhbCksb2IkbHQ6YygoYSxiKT0+YTxiLEpTQkkubGVzc1RoYW4pLG9iJGxlOmMoKGEsYik9PmE8PWIsSlNCSS5sZXNzVGhhbk9yRXF1YWwpLG5iJGludDplLG5iJGluZGV4KCl7cmV0dXJuIHRoaXMudn0sbmIkZmxvYXQoKXt2YXIgYT10aGlzLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk7YT1wYXJzZUZsb2F0KEpTQkkudG9OdW1iZXIoYSkpO1xuaWYoSW5maW5pdHk9PT1hfHwtSW5maW5pdHk9PT1hKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX0sbmIkaXNuZWdhdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5sZXNzVGhhbihhLEpTQkkuX19aRVJPKX0sbmIkaXNwb3NpdGl2ZSgpe2NvbnN0IGE9dGhpcy52O3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYT8wPmE6SlNCSS5ncmVhdGVyVGhhbk9yRXF1YWwoYSxKU0JJLl9fWkVSTyl9LG5iJGJvb2woKXtyZXR1cm4gMCE9PXRoaXMudn0sbmIkcG9zaXRpdmU6ZSxuYiRuZWdhdGl2ZTpiKGE9Pi1hLEpTQkkudW5hcnlNaW51cyksbmIkYWRkOmEoKGEsYik9PmErYiwoYSxiKT0+SlNCSS5udW1iZXJJZlNhZmUoSlNCSS5hZGQoYSxiKSkpLG5iJHN1YnRyYWN0OmEoKGEsYik9PmEtYiwoYSxiKT0+XG5KU0JJLm51bWJlcklmU2FmZShKU0JJLnN1YnRyYWN0KGEsYikpKSxuYiRtdWx0aXBseTphKChhLGIpPT5hKmIsSlNCSS5tdWx0aXBseSksbmIkZGl2aWRlKGEpe3JldHVybiBTay5fX2Z1dHVyZV9fLmRpdmlzaW9uP3RoaXMubmIkZmxvYXQoKS5uYiRkaXZpZGUoYSk6dGhpcy5uYiRmbG9vcl9kaXZpZGUoYSl9LG5iJGZsb29yX2RpdmlkZTpmKChhLGIpPT5NYXRoLmZsb29yKGEvYiksSlNCSS5kaXZpZGUpLG5iJHJlbWFpbmRlcjpmKChhLGIpPT5hLU1hdGguZmxvb3IoYS9iKSpiLEpTQkkucmVtYWluZGVyKSxuYiRkaXZtb2QoYSl7Y29uc3QgYj10aGlzLm5iJGZsb29yX2RpdmlkZShhKTthPXRoaXMubmIkcmVtYWluZGVyKGEpO3JldHVybiBiPT09U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR8fGE9PT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJD9Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDpuZXcgU2suYnVpbHRpbi50dXBsZShbYixcbmFdKX0sbmIkYW5kOmgoKGEsYik9PmEmYixKU0JJLmJpdHdpc2VBbmQpLG5iJG9yOmgoKGEsYik9PmF8YixKU0JJLmJpdHdpc2VPciksbmIkeG9yOmgoKGEsYik9PmFeYixKU0JJLmJpdHdpc2VYb3IpLG5iJGFiczpiKE1hdGguYWJzLGE9PkpTQkkubGVzc1RoYW4oYSxKU0JJLl9fWkVSTyk/SlNCSS51bmFyeU1pbnVzKGEpOmEpLG5iJGxzaGlmdDpsKChhLGIpPT57aWYoNTM+YiYmKGE9MiphKnBbYl0sZChhKSkpcmV0dXJuIGF9LEpTQkkubGVmdFNoaWZ0KSxuYiRyc2hpZnQ6bCgoYSxiKT0+e2NvbnN0IGM9YT4+YjtyZXR1cm4gMDxhJiYwPmM/YyZNYXRoLnBvdygyLDMyLWIpLTE6Y30sKGEsYik9PkpTQkkubnVtYmVySWZTYWZlKEpTQkkuc2lnbmVkUmlnaHRTaGlmdChhLGIpKSksbmIkaW52ZXJ0OmIoYT0+fmEsSlNCSS5iaXR3aXNlTm90KSxuYiRwb3dlcihhLGIpe2xldCBjO3ZvaWQgMCE9PWImJlNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpJiYoYj12b2lkIDApO2lmKGEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5pbnRfJiYodm9pZCAwPT09Ynx8YiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uaW50Xykpe2xldCBlPXRoaXMudixmPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGUmJlwibnVtYmVyXCI9PT10eXBlb2YgZil7Y29uc3QgYT1NYXRoLnBvdyhlLGYpO2lmKGQoYSkmJihjPTA+Zj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uaW50XyhhKSx2b2lkIDA9PT1iKSlyZXR1cm4gY31pZih2b2lkIDAhPT1iKXtpZihhLm5iJGlzbmVnYXRpdmUoKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgMm5kIGFyZ3VtZW50IGNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWRcIik7aWYoMD09PWIudil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwXCIpO3JldHVybiB2b2lkIDAhPT1jP2MubmIkcmVtYWluZGVyKGIpOm5ldyBTay5idWlsdGluLmludF8oSlNCSS5wb3dlcm1vZChuKGUpLFxubihmKSxuKGIudikpKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLmV4cG9uZW50aWF0ZShuKGUpLG4oZikpKX1yZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9LG5iJGxvbmcoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHRoaXMudil9fSxnZXRzZXRzOntyZWFsOnskZ2V0OmUsJGRvYzpcInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifSxpbWFnOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oMCl9LCRkb2M6XCJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlclwifX0sbWV0aG9kczp7Y29uanVnYXRlOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgaW50LlwifSxiaXRfbGVuZ3RoOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKFNrLmJ1aWx0aW4uYmluKHRoaXMpLnNxJGxlbmd0aCgpLVxuMil9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlwiTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlcHJlc2VudCBzZWxmIGluIGJpbmFyeS5cXG5cXG4+Pj4gYmluKDM3KVxcbicwYjEwMDEwMSdcXG4+Pj4gKDM3KS5iaXRfbGVuZ3RoKClcXG42XCJ9LHRvX2J5dGVzOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJOb3QgeWV0IGltcGxlbWVudGVkIGluIFNrdWxwdFwiKTt9LCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvLCBsZW5ndGgsIGJ5dGVvcmRlciwgKiwgc2lnbmVkPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYW4gYXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGFuIGludGVnZXIuXFxuXFxuICBsZW5ndGhcXG4gICAgTGVuZ3RoIG9mIGJ5dGVzIG9iamVjdCB0byB1c2UuICBBbiBPdmVyZmxvd0Vycm9yIGlzIHJhaXNlZCBpZiB0aGVcXG4gICAgaW50ZWdlciBpcyBub3QgcmVwcmVzZW50YWJsZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuXFxuICBieXRlb3JkZXJcXG4gICAgVGhlIGJ5dGUgb3JkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVnZXIuICBJZiBieXRlb3JkZXIgaXMgJ2JpZycsXFxuICAgIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnl0ZSBhcnJheS4gIElmXFxuICAgIGJ5dGVvcmRlciBpcyAnbGl0dGxlJywgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhdCB0aGUgZW5kIG9mIHRoZVxcbiAgICBieXRlIGFycmF5LiAgVG8gcmVxdWVzdCB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIgb2YgdGhlIGhvc3Qgc3lzdGVtLCB1c2VcXG4gICAgYHN5cy5ieXRlb3JkZXInIGFzIHRoZSBieXRlIG9yZGVyIHZhbHVlLlxcbiAgc2lnbmVkXFxuICAgIERldGVybWluZXMgd2hldGhlciB0d28ncyBjb21wbGVtZW50IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBpbnRlZ2VyLlxcbiAgICBJZiBzaWduZWQgaXMgRmFsc2UgYW5kIGEgbmVnYXRpdmUgaW50ZWdlciBpcyBnaXZlbiwgYW4gT3ZlcmZsb3dFcnJvclxcbiAgICBpcyByYWlzZWQuXCJ9LFxuX190cnVuY19fOnskbWV0aDplLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJUcnVuY2F0aW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2Zsb29yX186eyRtZXRoOmUsJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkZsb29yaW5nIGFuIEludGVncmFsIHJldHVybnMgaXRzZWxmLlwifSxfX2NlaWxfXzp7JG1ldGg6ZSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiQ2VpbGluZyBvZiBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi5cIn0sX19yb3VuZF9fOnskbWV0aChhKXtyZXR1cm4gdGhpcy5yb3VuZCQoYSl9LCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUm91bmRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuXFxuUm91bmRpbmcgd2l0aCBhbiBuZGlnaXRzIGFyZ3VtZW50IGFsc28gcmV0dXJucyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy52KV0pfSxcbiRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sX19mb3JtYXRfXzp7JG1ldGg6U2suZm9ybWF0dGluZy5ta051bWJlcl9fZm9ybWF0X18oITEpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkc2VsZiwgZm9ybWF0X3NwZWMsIC8pXCIsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9fSxwcm90bzp7c3RyJChhLGIpe2E9dm9pZCAwPT09YXx8MTA9PT1hP3RoaXMudi50b1N0cmluZygpOnRoaXMudi50b1N0cmluZyhhKTtifHx2b2lkIDA9PT1ifHxcIi1cIj09PWFbMF0mJihhPWEuc3Vic3RyaW5nKDEpKTtyZXR1cm4gYX0scm91bmQkKGEpe2E9dm9pZCAwPT09YT8wOlNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTt2YXIgYj10aGlzLnYsYz1NYXRoLnBvdygxMCwtYSk7aWYoMDxhKXJldHVybiBuZXcgU2suYnVpbHRpbi5pbnRfKGIpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYiYmU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXJldHVybiBhPVxuYi9jLGI9TWF0aC5yb3VuZChhKSxuZXcgU2suYnVpbHRpbi5pbnRfKCguNT09PSgwPGE/YTotYSklMT8wPT09YiUyP2I6Yi0xOmIpKmMpO2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYilyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhNYXRoLnJvdW5kKGIvYykqYyk7e2M9SlNCSS5CaWdJbnQoMTAqYyk7YT1KU0JJLkJpZ0ludCgxMCk7Yj1KU0JJLmRpdmlkZShiLGMpO2NvbnN0IGQ9SlNCSS5kaXZpZGUoYixhKSxlPUpTQkkuc3VidHJhY3QoYixKU0JJLm11bHRpcGx5KGEsZCkpOzU+SlNCSS50b051bWJlcihlKT9iPUpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShkLGEpLGMpOkpTQkkubXVsdGlwbHkoSlNCSS5tdWx0aXBseShKU0JJLmFkZChkLEpTQkkuQmlnSW50KDEpLGEpLGMpKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX19fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uaW50X1wiLFNrLmJ1aWx0aW4uaW50Xyk7Y29uc3Qgaz0vXyg/PVteX10pL2c7U2suc3RyMm51bWJlcj1cbmZ1bmN0aW9uKGEsYil7dmFyIGM9YSxlPSExLGY7YT1hLnJlcGxhY2UoL15cXHMrfFxccyskL2csXCJcIik7XCItXCI9PT1hLmNoYXJBdCgwKSYmKGU9ITAsYT1hLnN1YnN0cmluZygxKSk7XCIrXCI9PT1hLmNoYXJBdCgwKSYmKGE9YS5zdWJzdHJpbmcoMSkpO2lmKG51bGw9PT1ifHx2b2lkIDA9PT1iKWI9MTA7aWYoKDI+Ynx8MzY8YikmJjAhPT1iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzZcIik7XCJzdHJpbmdcIj09PXR5cGVvZiBiJiYoYj1OdW1iZXIoYikpO2lmKFwiMHhcIj09PWEuc3Vic3RyaW5nKDAsMikudG9Mb3dlckNhc2UoKSlpZigxNj09PWJ8fDA9PT1iKWE9YS5zdWJzdHJpbmcoMiksYj0xNjtlbHNle2lmKDM0PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBiXCI9PT1hLnN1YnN0cmluZygwLFxuMikudG9Mb3dlckNhc2UoKSlpZigyPT09Ynx8MD09PWIpYT1hLnN1YnN0cmluZygyKSxiPTI7ZWxzZXtpZigxMj5iKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSBcIitiK1wiOiAnXCIrYytcIidcIik7fWVsc2UgaWYoXCIwb1wiPT09YS5zdWJzdHJpbmcoMCwyKS50b0xvd2VyQ2FzZSgpKWlmKDg9PT1ifHwwPT09YilhPWEuc3Vic3RyaW5nKDIpLGI9ODtlbHNle2lmKDI1PmIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIFwiK2IrXCI6ICdcIitjK1wiJ1wiKTt9ZWxzZSBpZihcIjBcIj09PWEuY2hhckF0KDApKXtpZihcIjBcIj09PWEpcmV0dXJuIDA7aWYoOD09PWJ8fDA9PT1iKWI9OH0wPT09YiYmKGI9MTApO2lmKC0xIT09YS5pbmRleE9mKFwiX1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoXCJfX1wiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrXG5iK1wiOiAnXCIrYytcIidcIik7YT0xMCE9PWI/YS5yZXBsYWNlKGssXCJcIik6YS5jaGFyQXQoMCkrYS5zdWJzdHJpbmcoMSkucmVwbGFjZShrLFwiXCIpfWlmKDA9PT1hLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO2ZvcihmPTA7ZjxhLmxlbmd0aDtmKz0xKXt2YXIgZz1hLmNoYXJDb2RlQXQoZik7dmFyIGg9Yjs0ODw9ZyYmNTc+PWc/aD1nLTQ4OjY1PD1nJiY5MD49Zz9oPWctNjUrMTA6OTc8PWcmJjEyMj49ZyYmKGg9Zy05NysxMCk7aWYoaD49Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKSB3aXRoIGJhc2UgXCIrYitcIjogJ1wiK2MrXCInXCIpO31lJiYoYT1cIi1cIithKTtoPXBhcnNlSW50KGEsYik7aWYoZChoKSlyZXR1cm4gaDtjPSExO1wiLVwiPT09YVswXSYmKGM9ITAsYT1hLnN1YnN0cmluZygxKSk7Yj1KU0JJLkJpZ0ludChiKTtcbmU9SlNCSS5CaWdJbnQoMSk7Zj1KU0JJLkJpZ0ludCgwKTtmb3IoZz1hLmxlbmd0aC0xOzA8PWc7Zy0tKWg9YS5jaGFyQ29kZUF0KGcpLDQ4PD1oJiY1Nz49aD9oLT00ODo2NTw9aCYmOTA+PWg/aD1oLTY1KzEwOjk3PD1oJiYxMjI+PWgmJihoPWgtOTcrMTApLGg9SlNCSS5tdWx0aXBseShKU0JJLkJpZ0ludChoKSxlKSxmPUpTQkkuYWRkKGYsaCksZT1KU0JJLm11bHRpcGx5KGUsYik7YyYmKGY9SlNCSS5tdWx0aXBseShmLEpTQkkuQmlnSW50KC0xKSkpO3JldHVybiBhPWZ9O1NrLmJ1aWx0aW4uaW50Xy5weTIkbWV0aG9kcz17fTtTay5sb25nRnJvbVN0cj1mdW5jdGlvbihhLGIpe2lmKFNrLl9fZnV0dXJlX18ucHl0aG9uMylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhnKGEpKTthPVNrLnN0cjJudW1iZXIoYSxiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5sb25nRnJvbVN0clwiLFNrLmxvbmdGcm9tU3RyKTtTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkPVxuZDtTay5idWlsdGluLmludF8uc3RyaW5nVG9OdW1iZXJPckJpZz1nO2NvbnN0IHA9Wy41LDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI1Niw1MTIsMTAyNCwyMDQ4LDQwOTYsODE5MiwxNjM4NCwzMjc2OCw2NTUzNiwxMzEwNzIsMjYyMTQ0LDUyNDI4OCwxMDQ4NTc2LDIwOTcxNTIsNDE5NDMwNCw4Mzg4NjA4LDE2Nzc3MjE2LDMzNTU0NDMyLDY3MTA4ODY0LDEzNDIxNzcyOCwyNjg0MzU0NTYsNTM2ODcwOTEyLDEwNzM3NDE4MjQsMjE0NzQ4MzY0OCw0Mjk0OTY3Mjk2LDg1ODk5MzQ1OTIsMTcxNzk4NjkxODQsMzQzNTk3MzgzNjgsNjg3MTk0NzY3MzYsMTM3NDM4OTUzNDcyLDI3NDg3NzkwNjk0NCw1NDk3NTU4MTM4ODgsMTA5OTUxMTYyNzc3NiwyMTk5MDIzMjU1NTUyLDQzOTgwNDY1MTExMDQsODc5NjA5MzAyMjIwOCwxNzU5MjE4NjA0NDQxNiwzNTE4NDM3MjA4ODgzMiw3MDM2ODc0NDE3NzY2NCwweDgwMDAwMDAwMDAwMCwyODE0NzQ5NzY3MTA2NTYsNTYyOTQ5OTUzNDIxMzEyLDB4NDAwMDAwMDAwMDAwMCxcbjB4ODAwMDAwMDAwMDAwMCw0NTAzNTk5NjI3MzcwNDk2LDkwMDcxOTkyNTQ3NDA5OTJdO1NrLmJ1aWx0aW4ubG5nPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJsb25nXCIse2Jhc2U6U2suYnVpbHRpbi5pbnRfLGNvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe1NrLmJ1aWx0aW4uaW50Xy5jYWxsKHRoaXMsYSl9LHNsb3RzOnskcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkrXCJMXCIpfSx0cCRhc19udW1iZXI6ITAsbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkbmVnYXRpdmUuY2FsbCh0aGlzKS52KX0sbmIkcG9zaXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubG5nKHUubmIkcG9zaXRpdmUuY2FsbCh0aGlzKS52KX19fSk7Y29uc3QgdT1Tay5idWlsdGluLmludF8ucHJvdG90eXBlfSxmdW5jdGlvbihtLHEpe2NvbnN0IGE9U2suYnVpbHRpbi5pbnRfLnByb3RvdHlwZTtTay5idWlsdGluLmJvb2w9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcImJvb2xcIixcbntjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEpP1NrLmJ1aWx0aW4uYm9vbC50cnVlJDpTay5idWlsdGluLmJvb2wuZmFsc2UkfSxiYXNlOlNrLmJ1aWx0aW4uaW50XyxzbG90czp7dHAkZG9jOlwiYm9vbCh4KSAtPiBib29sXFxuXFxuUmV0dXJucyBUcnVlIHdoZW4gdGhlIGFyZ3VtZW50IHggaXMgdHJ1ZSwgRmFsc2Ugb3RoZXJ3aXNlLlxcblRoZSBidWlsdGlucyBUcnVlIGFuZCBGYWxzZSBhcmUgdGhlIG9ubHkgdHdvIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYm9vbC5cXG5UaGUgY2xhc3MgYm9vbCBpcyBhIHN1YmNsYXNzIG9mIHRoZSBjbGFzcyBpbnQsIGFuZCBjYW5ub3QgYmUgc3ViY2xhc3NlZC5cIix0cCRuZXcoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiYm9vbFwiLGIpO1NrLmFic3RyLmNoZWNrQXJnc0xlbihcImJvb2xcIixhLDAsMSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYVswXSl9LCRyKCl7cmV0dXJuIHRoaXMudj90aGlzLnN0ciRUcnVlOlxudGhpcy5zdHIkRmFsc2V9LHRwJGFzX251bWJlcjohMCxuYiRhbmQoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudiZjLnYpOmEubmIkYW5kLmNhbGwodGhpcyxjKX0sbmIkb3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudnxjLnYpOmEubmIkb3IuY2FsbCh0aGlzLGMpfSxuYiR4b3IoYyl7cmV0dXJuIGMub2IkdHlwZT09PVNrLmJ1aWx0aW4uYm9vbD9uZXcgU2suYnVpbHRpbi5ib29sKHRoaXMudl5jLnYpOmEubmIkeG9yLmNhbGwodGhpcyxjKX19LGZsYWdzOntzayRhY2NlcHRhYmxlX2FzX2Jhc2VfY2xhc3M6ITF9LG1ldGhvZHM6e19fZm9ybWF0X186eyRtZXRoKCl7cmV0dXJuIHRoaXMuJHIoKX0sJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3N0ciRGYWxzZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJGYWxzZVwiKSxzdHIkVHJ1ZTpuZXcgU2suYnVpbHRpbi5zdHIoXCJUcnVlXCIpfX0pO1xuU2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5ib29sXCIsU2suYnVpbHRpbi5ib29sKTtTay5idWlsdGluLmJvb2wudHJ1ZSQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmJvb2wucHJvdG90eXBlLHt2Ont2YWx1ZToxLGVudW1lcmFibGU6ITB9fSk7U2suYnVpbHRpbi5ib29sLmZhbHNlJD1PYmplY3QuY3JlYXRlKFNrLmJ1aWx0aW4uYm9vbC5wcm90b3R5cGUse3Y6e3ZhbHVlOjAsZW51bWVyYWJsZTohMH19KX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2NvbnN0IGM9dGhpcy52O2I9Yi52O2lmKFwibnVtYmVyXCIhPT10eXBlb2YgYilpZihKU0JJLl9faXNCaWdJbnQoYikpe2lmKGI9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGIpKSxJbmZpbml0eT09Ynx8LUluZmluaXR5PT1iKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7XG59ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoYyxiKX19ZnVuY3Rpb24gYihhKXtjb25zdCBiPWMoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YyYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInBvdygpIDNyZCBhcmd1bWVudCBub3QgYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnNcIik7cmV0dXJuIGIuY2FsbCh0aGlzLGEpfX1mdW5jdGlvbiBlKGEsYil7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWE/SW5maW5pdHk9PT1ifHwtSW5maW5pdHk9PT1hP25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA+Yj9uZXcgU2suYnVpbHRpbi5mbG9hdF8oLUluZmluaXR5KTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oSW5maW5pdHkpOlxuLUluZmluaXR5PT09YT9JbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik6MD5iP25ldyBTay5idWlsdGluLmZsb2F0XyhJbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC1JbmZpbml0eSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEvYil9ZnVuY3Rpb24gZihhLGIpe2lmKEluZmluaXR5PT09YXx8LUluZmluaXR5PT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE5hTik7aWYoMD09PWIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uWmVyb0RpdmlzaW9uRXJyb3IoXCJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXCIpO3JldHVybiBJbmZpbml0eT09PWI/MD5hP25ldyBTay5idWlsdGluLmZsb2F0XygtMSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApOi1JbmZpbml0eT09PWI/MD5hfHwwIT09YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oMCk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC0xKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTWF0aC5mbG9vcihhL1xuYikpfWZ1bmN0aW9uIGwoYSxiKXtpZigwPT09Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cIik7aWYoMD09PWEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XygwKTtpZihJbmZpbml0eT09PWIpcmV0dXJuIEluZmluaXR5PT09YXx8LUluZmluaXR5PT09dGhpcy52P25ldyBTay5idWlsdGluLmZsb2F0XyhOYU4pOjA8YT9uZXcgU2suYnVpbHRpbi5mbG9hdF8oYSk6bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKEluZmluaXR5KTtsZXQgYz1hJWI7MD5hPzA8YiYmMD5jJiYoYys9Yik6MD5iJiYwIT09YyYmKGMrPWIpOzA9PT1jJiYoMD5iP2M9LTA6LUluZmluaXR5PT09SW5maW5pdHkvYyYmKGM9MCkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9ZnVuY3Rpb24gaChhLGIpe2lmKDA+YSYmMCE9PWIlMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwibmVnYXRpdmUgbnVtYmVyIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyXCIpO1xuaWYoMD09PWEmJjA+Yil0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXJcIik7Y29uc3QgYz1NYXRoLnBvdyhhLGIpO2lmKEluZmluaXR5PT09TWF0aC5hYnMoYykmJkluZmluaXR5IT09TWF0aC5hYnMoYSkmJkluZmluaXR5IT09TWF0aC5hYnMoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcihcIk51bWVyaWNhbCByZXN1bHQgb3V0IG9mIHJhbmdlXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9Y29uc3QgZD1PYmplY3QuY3JlYXRlKG51bGwse0luZmluaXR5Ont2YWx1ZTozMTQxNTl9LFwiLUluZmluaXR5XCI6e3ZhbHVlOi0zMTQxNTl9LE5hTjp7dmFsdWU6MH19KTtTay5idWlsdGluLmZsb2F0Xz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZmxvYXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfLFxuXCJiYWQgY2FsbCB0byBmbG9hdCB1c2UgJ25ldydcIik7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXRoaXMudj1hO2Vsc2UgaWYodm9pZCAwPT09YSl0aGlzLnY9MDtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSl0aGlzLnY9cGFyc2VGbG9hdChhKTtlbHNle2lmKGEubmIkZmxvYXQpcmV0dXJuIGEubmIkZmxvYXQoKTtTay5hc3NlcnRzLmZhaWwoXCJiYWQgYXJndW1lbnQgdG8gZmxvYXQgY29uc3RydWN0b3JcIil9fSxzbG90czp7dHAkZ2V0dGF0dHI6U2suZ2VuZXJpYy5nZXRBdHRyLHRwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDb252ZXJ0IGEgc3RyaW5nIG9yIG51bWJlciB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgaWYgcG9zc2libGUuXCIsdHAkaGFzaCgpe2NvbnN0IGE9dGhpcy52O2xldCBiPWRbYV07aWYodm9pZCAwIT09YilyZXR1cm4gYjtiPU51bWJlci5pc0ludGVnZXIoYSk/dGhpcy5uYiRpbnQoKS50cCRoYXNoKCk6TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKk51bWJlci5NQVhfU0FGRV9JTlRFR0VSLVxuTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIvMik7cmV0dXJuIGRbdGhpcy52XT1ifSwkcigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy5zdHIkKDEwLCEwKSl9LHRwJG5ldyhhLGIpe2lmKGImJmIubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImZsb2F0KCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHNcIik7aWYoYSYmMTxhLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCBleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgXCIrYS5sZW5ndGgpO2E9YVswXTtpZih2b2lkIDA9PT1hKXZhciBjPW5ldyBTay5idWlsdGluLmZsb2F0XygwKTtlbHNlIGlmKGEubmIkZmxvYXQpYz1hLm5iJGZsb2F0KCk7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKXtjPWEudjthPWM7aWYoLTEhPT1jLmluZGV4T2YoXCJfXCIpKXtpZihnLnRlc3QoYykpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBmbG9hdDogJ1wiK1xuYytcIidcIik7YT1jLmNoYXJBdCgwKStjLnN1YnN0cmluZygxKS5yZXBsYWNlKG4sXCJcIil9aWYoYy5tYXRjaCgvXi1pbmYkL2kpKXZhciBkPS1JbmZpbml0eTtlbHNlIGMubWF0Y2goL15bK10/aW5mJC9pKT9kPUluZmluaXR5OmMubWF0Y2goL15bLStdP25hbiQvaSk/ZD1OYU46aXNOYU4oYSl8fChkPXBhcnNlRmxvYXQoYSksTnVtYmVyLmlzTmFOKGQpJiYoZD12b2lkIDApKTtpZih2b2lkIDA9PT1kKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQ6IFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIobmV3IFNrLmJ1aWx0aW4uc3RyKGMpKSk7Yz1uZXcgU2suYnVpbHRpbi5mbG9hdF8oZCl9aWYodm9pZCAwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJmbG9hdCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXJcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZSlyZXR1cm4gYztcbmQ9bmV3IHRoaXMuY29uc3RydWN0b3I7ZC52PWMudjtyZXR1cm4gZH0sbmIkaW50KCl7bGV0IGE9dGhpcy52O2E9MD5hP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjYW5ub3QgY29udmVydCBmbG9hdCBcIitTay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMpK1wiIHRvIGludGVnZXJcIik7cmV0dXJuIFNrLmJ1aWx0aW4uaW50Xy53aXRoaW5UaHJlc2hvbGQoYSk/bmV3IFNrLmJ1aWx0aW4uaW50XyhhKTpuZXcgU2suYnVpbHRpbi5pbnRfKEpTQkkuQmlnSW50KGEpKX0sbmIkZmxvYXQ6YSxuYiRsb25nKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmxuZyh0aGlzLm5iJGludCgpLnYpfSxuYiRhZGQ6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGErYikpLG5iJHN1YnRyYWN0OmMoKGEsYik9Pm5ldyBTay5idWlsdGluLmZsb2F0XyhhLWIpKSxuYiRyZWZsZWN0ZWRfc3VidHJhY3Q6YygoYSxcbmIpPT5uZXcgU2suYnVpbHRpbi5mbG9hdF8oYi1hKSksbmIkbXVsdGlwbHk6YygoYSxiKT0+bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKGEqYikpLG5iJGRpdmlkZTpjKGUpLG5iJHJlZmxlY3RlZF9kaXZpZGU6YygoYSxiKT0+ZShiLGEpKSxuYiRmbG9vcl9kaXZpZGU6YyhmKSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlOmMoKGEsYik9PmYoYixhKSksbmIkcmVtYWluZGVyOmMobCksbmIkcmVmbGVjdGVkX3JlbWFpbmRlcjpjKChhLGIpPT5sKGIsYSkpLG5iJGRpdm1vZDpjKChhLGIpPT5uZXcgU2suYnVpbHRpbi50dXBsZShbZihhLGIpLGwoYSxiKV0pKSxuYiRyZWZsZWN0ZWRfZGl2bW9kOmMoKGEsYik9Pm5ldyBTay5idWlsdGluLnR1cGxlKFtmKGIsYSksbChiLGEpXSkpLG5iJHBvd2VyOmIoaCksbmIkcmVmbGVjdGVkX3Bvd2VyOmIoKGEsYik9PmgoYixhKSksbmIkYWJzKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhNYXRoLmFicyh0aGlzLnYpKX0sbmIkbmVnYXRpdmUoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKC10aGlzLnYpfSxcbm5iJHBvc2l0aXZlKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0Xyh0aGlzLnYpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnZ9LG5iJGlzbmVnYXRpdmUoKXtyZXR1cm4gMD50aGlzLnZ9LG5iJGlzcG9zaXRpdmUoKXtyZXR1cm4gMDw9dGhpcy52fSxvYiRlcTpjKChhLGIpPT5hPT1iKSxvYiRuZTpjKChhLGIpPT5hIT1iKSxvYiRndDpjKChhLGIpPT5hPmIpLG9iJGdlOmMoKGEsYik9PmE+PWIpLG9iJGx0OmMoKGEsYik9PmE8Yiksb2IkbGU6YygoYSxiKT0+YTw9Yil9LGdldHNldHM6e3JlYWw6eyRnZXQ6YSwkZG9jOlwidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyXCJ9LGltYWc6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKDApfSwkZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGg6YSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJHNlbGYsIC8pXCIsJGRvYzpcIlJldHVybiBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LlwifSxcbl9fdHJ1bmNfXzp7JG1ldGgoKXtyZXR1cm4gdGhpcy5uYiRpbnQoKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIEludGVncmFsIGNsb3Nlc3QgdG8geCBiZXR3ZWVuIDAgYW5kIHguXCJ9LF9fcm91bmRfXzp7JG1ldGgoYSl7cmV0dXJuIHRoaXMucm91bmQkKGEpfSwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOlwiKCRzZWxmLCBuZGlnaXRzPU5vbmUsIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4LCByb3VuZGluZyBoYWxmIHRvd2FyZCBldmVuLlxcblxcbldoZW4gYW4gYXJndW1lbnQgaXMgcGFzc2VkLCB3b3JrIGxpa2UgYnVpbHQtaW4gcm91bmQoeCwgbmRpZ2l0cykuXCJ9LGlzX2ludGVnZXI6eyRtZXRoKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woTnVtYmVyLmlzSW50ZWdlcih0aGlzLnYpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLFxuJGRvYzpcIlJldHVybiBUcnVlIGlmIHRoZSBmbG9hdCBpcyBhbiBpbnRlZ2VyLlwifSxfX2dldG5ld2FyZ3NfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW3RoaXNdKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCAvKVwiLCRkb2M6U2suYnVpbHRpbi5ub25lLm5vbmUkfSxfX2Zvcm1hdF9fOnskbWV0aDpTay5mb3JtYXR0aW5nLm1rTnVtYmVyX19mb3JtYXRfXyghMCksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRzZWxmLCBmb3JtYXRfc3BlYywgLylcIiwkZG9jOlNrLmJ1aWx0aW4ubm9uZS5ub25lJH19fSk7Y29uc3QgZz0vX1tlRV18W2VFXV98XFwuX3xfXFwufFsrLV1ffF9fLyxuPS9fKD89W15fXSkvZztTay5idWlsdGluLmZsb2F0Xy5QeUZsb2F0X0NoZWNrPWZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hPyExOlNrLmJ1aWx0aW4uY2hlY2tOdW1iZXIoYSl8fFNrLmJ1aWx0aW4uY2hlY2tGbG9hdChhKXx8YS5vYiR0eXBlLiRpc1N1YlR5cGUoU2suYnVpbHRpbi5mbG9hdF8pP1xuITA6ITF9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS50b0ZpeGVkPWZ1bmN0aW9uKGEpe2E9U2suYnVpbHRpbi5hc251bSQoYSk7cmV0dXJuIHRoaXMudi50b0ZpeGVkKGEpfTtTay5idWlsdGluLmZsb2F0Xy5wcm90b3R5cGUucm91bmQkPWZ1bmN0aW9uKGEpe3ZhciBiPVNrLmJ1aWx0aW4uYXNudW0kKHRoaXMpO3ZhciBjPXZvaWQgMD09PWE/MDpTay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSk7aWYoU2suX19mdXR1cmVfXy5iYW5rZXJzX3JvdW5kaW5nKXtiKj1NYXRoLnBvdygxMCxjKTt2YXIgZD1NYXRoLnJvdW5kKGIpO2M9KC41PT09KDA8Yj9iOi1iKSUxPzA9PT1kJTI/ZDpkLTE6ZCkvTWF0aC5wb3coMTAsYyk7cmV0dXJuIHZvaWQgMD09PWE/bmV3IFNrLmJ1aWx0aW4uaW50XyhjKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9YT1NYXRoLnBvdygxMCxjKTtjPU1hdGgucm91bmQoYiphKS9hO3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8oYyl9O1NrLmJ1aWx0aW4uZmxvYXRfLnByb3RvdHlwZS5zdHIkPVxuZnVuY3Rpb24oYSxiKXtpZihpc05hTih0aGlzLnYpKXJldHVyblwibmFuXCI7dm9pZCAwPT09YiYmKGI9ITApO2lmKEluZmluaXR5PT10aGlzLnYpcmV0dXJuXCJpbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmYilyZXR1cm5cIi1pbmZcIjtpZigtSW5maW5pdHk9PXRoaXMudiYmIWIpcmV0dXJuXCJpbmZcIjtiPWI/dGhpcy52Ok1hdGguYWJzKHRoaXMudik7aWYodm9pZCAwPT09YXx8MTA9PT1hKXt2YXIgYz1Tay5fX2Z1dHVyZV9fLnB5dGhvbjM/Yi50b1ByZWNpc2lvbigxNik6Yi50b1ByZWNpc2lvbigxMik7dmFyIGQ9Yy5pbmRleE9mKFwiLlwiKTthPWIudG9TdHJpbmcoKS5zbGljZSgwLGQpO2Q9Yi50b1N0cmluZygpLnNsaWNlKGQpO2EubWF0Y2goL14tPzAkLykmJmQuc2xpY2UoMSkubWF0Y2goL14wezQsfS8pJiYoYz0xMj5jLmxlbmd0aD9iLnRvRXhwb25lbnRpYWwoKTpiLnRvRXhwb25lbnRpYWwoMTEpKTtpZigwPmMuaW5kZXhPZihcImVcIikmJjA8PWMuaW5kZXhPZihcIi5cIikpe2Zvcig7XCIwXCI9PVxuYy5jaGFyQXQoYy5sZW5ndGgtMSk7KWM9Yy5zdWJzdHJpbmcoMCxjLmxlbmd0aC0xKTtcIi5cIj09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJihjKz1cIjBcIil9Yz1jLnJlcGxhY2UoL1xcLjArZS8sXCJlXCIsXCJpXCIpO2M9Yy5yZXBsYWNlKC8oZVstK10pKFsxLTldKSQvLFwiJDEwJDJcIik7Yz1jLnJlcGxhY2UoLzArKGUuKikvLFwiJDFcIil9ZWxzZSBjPWIudG9TdHJpbmcoYSk7MD09PXRoaXMudiYmLUluZmluaXR5PT09MS90aGlzLnYmJihjPVwiLVwiK2MpOzA+Yy5pbmRleE9mKFwiLlwiKSYmMD5jLmluZGV4T2YoXCJFXCIpJiYwPmMuaW5kZXhPZihcImVcIikmJihjKz1cIi4wXCIpO3JldHVybiBjfTtTay5idWlsdGluLmZsb2F0Xy5weTIkbWV0aG9kcz17fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEpe2xldCBiPWEudjtpZihcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI7YS5uYiRmbG9hdCYmKGI9YS5uYiRmbG9hdCgpKTtpZih2b2lkIDA9PT1iKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImEgZmxvYXQgaXMgcmVxdWlyZWRcIik7XG5yZXR1cm4gYi52fWZ1bmN0aW9uIGMoYSxiLGMpe2lmKGM9PT1Tay5idWlsdGluLmNvbXBsZXgucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KGEsYik7Yz1uZXcgYy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmNvbXBsZXguY2FsbChjLGEsYik7cmV0dXJuIGN9ZnVuY3Rpb24gYihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtjb25zdCBkPXRoaXMucmVhbCxlPXRoaXMuaW1hZzt2YXIgZj1jLnJlYWw7Y29uc3QgZz1jLnY7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBmKWM9Yy5pbWFnO2Vsc2UgaWYoXCJudW1iZXJcIj09PXR5cGVvZiBnKWY9ZyxjPTA7ZWxzZSBpZihKU0JJLl9faXNCaWdJbnQoZykpe2lmKHZvaWQgMD09PWIpe2lmKGY9cGFyc2VGbG9hdChKU0JJLnRvTnVtYmVyKGcpKSxJbmZpbml0eT09Znx8LUluZmluaXR5PT1mKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXRcIik7fWVsc2UgZj1cbmcudG9TdHJpbmcoKTtjPTB9ZWxzZSByZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCQ7cmV0dXJuIGEoZCxlLGYsYyl9fWZ1bmN0aW9uIGUoYSxiLGMsZCl7dmFyIGU9TWF0aC5hYnMoYyk7Y29uc3QgZj1NYXRoLmFicyhkKTtpZihlPj1mKXtpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtlPWQvYztjKz1kKmU7ZD0oYStiKmUpL2M7YT0oYi1hKmUpL2N9ZWxzZSBmPj1lPyhlPWMvZCxjPWMqZStkLFNrLmFzc2VydHMuYXNzZXJ0KDAhPT1kKSxkPShhKmUrYikvYyxhPShiKmUtYSkvYyk6YT1kPU5hTjtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGEpfWZ1bmN0aW9uIGYoYSxiLGMsZCl7aWYoMD09PWMmJjA9PT1kKXtkPTE7dmFyIGU9MH1lbHNlIGlmKDA9PT1hJiYwPT09Yil7aWYoMCE9PWR8fDA+Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5aZXJvRGl2aXNpb25FcnJvcihcImNvbXBsZXggZGl2aXNpb24gYnkgemVyb1wiKTtcbmU9ZD0wfWVsc2V7Y29uc3QgZj1NYXRoLmh5cG90KGEsYik7ZT1NYXRoLnBvdyhmLGMpO2E9TWF0aC5hdGFuMihiLGEpO2MqPWE7MCE9PWQmJihlLz1NYXRoLmV4cChhKmQpLGMrPWQqTWF0aC5sb2coZikpO2Q9ZSpNYXRoLmNvcyhjKTtlKj1NYXRoLnNpbihjKX1yZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleChkLGUpfWZ1bmN0aW9uIGwoYSxiLGMpe2xldCBkPTE7dmFyIGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleCgxLDApO2ZvcihhPW5ldyBTay5idWlsdGluLmNvbXBsZXgoYSxiKTswPGQmJmM+PWQ7KWMmZCYmKGU9bmV3IFNrLmJ1aWx0aW4uY29tcGxleChlLnJlYWwqYS5yZWFsLWUuaW1hZyphLmltYWcsZS5yZWFsKmEuaW1hZythLnJlYWwqZS5pbWFnKSksZDw8PTEsYT1uZXcgU2suYnVpbHRpbi5jb21wbGV4KGEucmVhbCphLnJlYWwtYS5pbWFnKmEuaW1hZywyKmEucmVhbCphLmltYWcpO3JldHVybiBlfWZ1bmN0aW9uIGgoYSxiLGMsZCxlKXtlPSExO3N3aXRjaChiKXtjYXNlIFwiZVwiOmNhc2UgXCJmXCI6Y2FzZSBcImdcIjpicmVhaztcbmNhc2UgXCJFXCI6ZT0hMDtiPVwiZVwiO2JyZWFrO2Nhc2UgXCJGXCI6ZT0hMDtiPVwiZlwiO2JyZWFrO2Nhc2UgXCJyXCI6aWYoMCE9PWMpdGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7Yz0xNztiPVwiZ1wiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoXCJCYWQgaW50ZXJuYWxsIGNhbGxcIik7fWlmKGlzTmFOKGEpKWE9XCJuYW5cIjtlbHNlIGlmKEluZmluaXR5PT09YSlhPVwiaW5mXCI7ZWxzZSBpZigtSW5maW5pdHk9PT1hKWE9XCItaW5mXCI7ZWxzZXtkJmguUHlfRFRTRl9BRERfRE9UXzAmJihiPVwiZ1wiKTt2YXIgZj1cIiVcIisoZCZoLlB5X0RUU0ZfQUxUP1wiI1wiOlwiXCIpO251bGwhPWMmJihmPWYrXCIuXCIrYyk7Zj1uZXcgU2suYnVpbHRpbi5zdHIoZitiKTthPWYubmIkcmVtYWluZGVyKG5ldyBTay5idWlsdGluLmZsb2F0XyhhKSk7YT1hLnZ9ZCZoLlB5X0RUU0ZfU0lHTiYmXCItXCIhPT1hWzBdJiYoYT1cIitcIithKTtlJiYoYT1hLnRvVXBwZXJDYXNlKCkpO3JldHVybiBhfVNrLmJ1aWx0aW4uY29tcGxleD1cblNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJjb21wbGV4XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uY29tcGxleCxcImJhZCBjYWxsIHRvIGNvbXBsZXggY29uc3RydWN0b3IsIHVzZSAnbmV3J1wiKTt0aGlzLnJlYWw9YTt0aGlzLmltYWc9Yn0sc2xvdHM6e3RwJGFzX251bWJlcjohMCx0cCRkb2M6XCJDcmVhdGUgYSBjb21wbGV4IG51bWJlciBmcm9tIGEgcmVhbCBwYXJ0IGFuZCBhbiBvcHRpb25hbCBpbWFnaW5hcnkgcGFydC5cXG5cXG5UaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuXCIsdHAkaGFzaCgpe3ZhciBhPShuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5yZWFsKSkudHAkaGFzaCgpO2E9MTAwMyoobmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZykpLnRwJGhhc2goKSthO3JldHVybiBTay5idWlsdGluLmludF8ud2l0aGluVGhyZXNob2xkKGEpP1xuYToobmV3IFNrLmJ1aWx0aW4uaW50XyhKU0JJLkJpZ0ludChhKSkpLnRwJGhhc2goKX0sdHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkbmV3KGIsZSl7Yj1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcImNvbXBsZXhcIixbXCJyZWFsXCIsXCJpbWFnXCJdLGIsZSxbbnVsbCxudWxsXSk7e3ZhciBmPWJbMV0sZztsZXQgaz1lPSExO3ZhciBoPWJbMF07aWYobnVsbCE9aCYmaC5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uY29tcGxleCYmbnVsbD09ZillPWg7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGgpKXtpZihudWxsIT1mKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmcgaWYgZmlyc3QgaXMgYSBzdHJpbmdcIik7ZT1Tay5idWlsdGluLmNvbXBsZXguY29tcGxleF9zdWJ0eXBlX2Zyb21fc3RyaW5nKGgsdGhpcyl9ZWxzZXtpZihudWxsIT1mJiZTay5idWlsdGluLmNoZWNrU3RyaW5nKGYpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJnIGNhbid0IGJlIGEgc3RyaW5nXCIpO1xubnVsbD09aD9iPW51bGw6KGI9U2suYWJzdHIubG9va3VwU3BlY2lhbChoLFNrLmJ1aWx0aW4uc3RyLiRjb21wbGV4KSxiPXZvaWQgMCE9PWI/U2subWlzY2V2YWwuY2FsbHNpbUFycmF5KGIsW10pOm51bGwpO2lmKG51bGwhPWImJmIhPT1Tay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJCl7aWYoIWQoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0XCIpO2g9Yn1pZihudWxsIT1oJiZ2b2lkIDA9PT1oLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLCBub3QgJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtpZihudWxsIT1mJiZ2b2lkIDA9PT1mLm5iJGZsb2F0KXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNvbXBsZXgoKSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciwgbm90ICdcIitcblNrLmFic3RyLnR5cGVOYW1lKGgpK1wiJ1wiKTtudWxsPT1oP2g9Yj0wOmQoaCk/KGI9aC5yZWFsLGg9aC5pbWFnLGU9ITApOihiPWEoaCksaD0wKTtudWxsPT1mP2Y9Zz0wOmQoZik/KGc9Zi5yZWFsLGY9Zi5pbWFnLGs9ITApOihnPWEoZiksZj0wKTshMD09PWsmJihiLT1mKTshMD09PWUmJihnKz1oKTtlPWMoYixnLHRoaXMpfX1yZXR1cm4gZX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihcIkVxXCIhPT1jJiZcIk5vdEVxXCIhPT1jKXtpZihTay5idWlsdGluLmNoZWNrTnVtYmVyKGEpfHxkKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVyc1wiKTtyZXR1cm4gU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCR9cmV0dXJuIGIoZnVuY3Rpb24oYSxiLGQsZSl7YT1hPT1kJiZiPT1lO3JldHVyblwiRXFcIj09PWM/YTohYX0sITApLmNhbGwodGhpcyxhKX0sJHIoKXt7dmFyIGEsXG5iO2xldCBlPWE9XCJcIjt2YXIgYz10aGlzLnJlYWw7dmFyIGQ9dGhpcy5pbWFnO2lmKGI9MD09PWMpYj0xPT0oYz8wPmM/LTE6MTowPjEvYz8tMToxKTtiPyhjPVwiXCIsYj1oKGQsXCJnXCIsbnVsbCwwLG51bGwpKTooYz1hPWgoYyxcImdcIixudWxsLDAsbnVsbCksYj1oKGQsXCJnXCIsbnVsbCxoLlB5X0RUU0ZfU0lHTixudWxsKSwwPT09ZCYmLUluZmluaXR5PT09MS9kJiZiJiZcIi1cIiE9PWJbMF0mJihiPVwiLVwiK2IpLGE9XCIoXCIsZT1cIilcIik7ZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJcIithK2MrYitcImpcIitlKX1yZXR1cm4gZH0sbmIkaW50KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludFwiKTt9LG5iJGxvbmcoKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gbG9uZ1wiKTt9LG5iJGZsb2F0KCl7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0XCIpO1xufSxuYiRwb3NpdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KHRoaXMucmVhbCx0aGlzLmltYWcpfSxuYiRuZWdhdGl2ZSgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5jb21wbGV4KC10aGlzLnJlYWwsLXRoaXMuaW1hZyl9LG5iJGJvb2woKXtyZXR1cm4gdGhpcy5yZWFsfHx0aGlzLmltYWd9LG5iJGFkZDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChhK2MsYitkKSksbmIkc3VidHJhY3Q6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYS1jLGItZCkpLG5iJHJlZmxlY3RlZF9zdWJ0cmFjdDpiKChhLGIsYyxkKT0+bmV3IFNrLmJ1aWx0aW4uY29tcGxleChjLWEsZC1iKSksbmIkbXVsdGlwbHk6YigoYSxiLGMsZCk9Pm5ldyBTay5idWlsdGluLmNvbXBsZXgoYyphLWQqYixhKmQrYipjKSksbmIkZGl2aWRlOmIoZSksbmIkcmVmbGVjdGVkX2RpdmlkZTpiKChhLGIsYyxkKT0+ZShjLGQsYSxiKSksbmIkZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO1xufSxuYiRyZWZsZWN0ZWRfZmxvb3JfZGl2aWRlKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IHRha2UgZmxvb3Igb2YgY29tcGxleCBudW1iZXIuXCIpO30sbmIkcmVtYWluZGVyKGEpe3Rocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImNhbid0IG1vZCBjb21wbGV4IG51bWJlcnMuXCIpO30sbmIkcmVmbGVjdGVkX3JlbWFpbmRlcihhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCBtb2QgY29tcGxleCBudW1iZXJzLlwiKTt9LG5iJGRpdm1vZChhKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJjYW4ndCB0YWtlIGZsb29yIG9yIG1vZCBvZiBjb21wbGV4IG51bWJlci5cIik7fSxuYiRwb3dlcihhLGIpe2lmKG51bGwhPWImJiFTay5idWlsdGluLmNoZWNrTm9uZShiKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCBtb2R1bG9cIik7cmV0dXJuIGsuY2FsbCh0aGlzLGEpfSxuYiRhYnMoKXt2YXIgYT1cbnRoaXMucmVhbDtjb25zdCBiPXRoaXMuaW1hZztpZighTnVtYmVyLmlzRmluaXRlKGEpfHwhTnVtYmVyLmlzRmluaXRlKGIpKXJldHVybiBJbmZpbml0eT09PWF8fC1JbmZpbml0eT09PWE/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGEpKTpJbmZpbml0eT09PWJ8fC1JbmZpbml0eT09PWI/bmV3IFNrLmJ1aWx0aW4uZmxvYXRfKE1hdGguYWJzKGIpKTpuZXcgU2suYnVpbHRpbi5mbG9hdF8oTmFOKTthPU1hdGguaHlwb3QoYSxiKTtpZighTnVtYmVyLmlzRmluaXRlKGEpKXRocm93IG5ldyBTay5idWlsdGluLk92ZXJmbG93RXJyb3IoXCJhYnNvbHV0ZSB2YWx1ZSB0b28gbGFyZ2VcIik7cmV0dXJuIG5ldyBTay5idWlsdGluLmZsb2F0XyhhKX19LGdldHNldHM6e3JlYWw6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCl9LCRkb2M6XCJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn0saW1hZzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8odGhpcy5pbWFnKX0sXG4kZG9jOlwidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXJcIn19LG1ldGhvZHM6e2Nvbmp1Z2F0ZTp7JG1ldGgoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uY29tcGxleCh0aGlzLnJlYWwsLXRoaXMuaW1hZyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJjb21wbGV4LmNvbmp1Z2F0ZSgpIC0+IGNvbXBsZXhcXG5cXG5SZXR1cm4gdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGl0cyBhcmd1bWVudC4gKDMtNGopLmNvbmp1Z2F0ZSgpID09IDMrNGouXCJ9LF9fZ2V0bmV3YXJnc19fOnskbWV0aCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi50dXBsZShbbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMucmVhbCksbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHRoaXMuaW1hZyldKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpTay5idWlsdGluLm5vbmUubm9uZSR9LF9fZm9ybWF0X186eyRtZXRoKGEpe2lmKFNrLmJ1aWx0aW4uY2hlY2tTdHJpbmcoYSkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcIl9fZm9ybWF0X18gaXMgbm90IGltcGxlbWVudGVkIGZvciBjb21wbGV4IHR5cGUuXCIpO1xudGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiX19mb3JtYXRfXyByZXF1aXJlcyBzdHJcIik7fSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiY29tcGxleC5fX2Zvcm1hdF9fKCkgLT4gc3RyXFxuXFxuQ29udmVydCB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gZm9ybWF0X3NwZWMuXCJ9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uY29tcGxleFwiLFNrLmJ1aWx0aW4uY29tcGxleCk7Y29uc3QgZD1Tay5idWlsdGluLmNoZWNrQ29tcGxleCxnPS9fW2VFXXxbZUVdX3xcXC5ffF9cXC58WystXV98X2p8al8vLG49L18oPz1bXl9dKS9nO1NrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmc9ZnVuY3Rpb24oYSxiKXtiPWJ8fFNrLmJ1aWx0aW4uY29tcGxleC5wcm90b3R5cGU7dmFyIGQ9MCxlPTAsZj0hMTtpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGEpKWE9U2suZmZpLnJlbWFwVG9KcyhhKTtlbHNlIGlmKFwic3RyaW5nXCIhPT1cbnR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm92aWRlZCB1bnN1cHBvcnRlZCBzdHJpbmctYWxpa2UgYXJndW1lbnRcIik7aWYoLTEhPT1hLmluZGV4T2YoXCJcXHgwMFwiKXx8MD09PWEubGVuZ3RofHxcIlwiPT09YSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmdcIik7dmFyIGg9MDthPWEucmVwbGFjZSgvaW5mfGluZmluaXR5L2dpLFwiSW5maW5pdHlcIik7Zm9yKGE9YS5yZXBsYWNlKC9uYW4vZ2ksXCJOYU5cIik7XCIgXCI9PT1hW2hdOyloKys7aWYoXCIoXCI9PT1hW2hdKWZvcihmPSEwLGgrKztcIiBcIj09PWFbaF07KWgrKztpZigtMSE9PWEuaW5kZXhPZihcIl9cIikpe2lmKGcudGVzdChhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGNvbXBsZXg6ICdcIithK1wiJ1wiKTthPWEuY2hhckF0KDApK2Euc3Vic3RyaW5nKDEpLnJlcGxhY2UobixcIlwiKX12YXIgaz0vXig/OlsrLV0/KD86KD86KD86XFxkKlxcLlxcZCspfCg/OlxcZCtcXC4/KSkoPzpbZUVdWystXT9cXGQrKT98TmFOfEluZmluaXR5KSkvO1xudmFyIGw9YS5zdWJzdHIoaCk7dmFyIHA9bC5tYXRjaChrKTtpZihudWxsIT09cClpZihoKz1wWzBdLmxlbmd0aCxcImpcIj09PWFbaF18fFwiSlwiPT09YVtoXSllPXBhcnNlRmxvYXQocFswXSksaCsrO2Vsc2UgaWYoXCIrXCI9PT1hW2hdfHxcIi1cIj09PWFbaF0pe2Q9cGFyc2VGbG9hdChwWzBdKTtwPWEuc3Vic3RyKGgpLm1hdGNoKGspO251bGwhPT1wPyhlPXBhcnNlRmxvYXQocFswXSksaCs9cFswXS5sZW5ndGgpOihlPVwiK1wiPT09YVtoXT8xOi0xLGgrKyk7aWYoXCJqXCIhPT1hW2hdJiZcIkpcIiE9PWFbaF0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtoKyt9ZWxzZSBkPXBhcnNlRmxvYXQocFswXSk7ZWxzZSBwPXA9bC5tYXRjaCgvXihbKy1dP1tqSl0pLyksbnVsbCE9PXAmJihlPTE9PT1wWzBdLmxlbmd0aD8xOlwiK1wiPT09cFswXVswXT8xOi0xLGgrPXBbMF0ubGVuZ3RoKTtmb3IoO1wiIFwiPT09YVtoXTspaCsrO2lmKGYpe2lmKFwiKVwiIT09XG5hW2hdKXRocm93IG5ldyBTay5idWlsdGluLlZhbHVlRXJyb3IoXCJjb21wbGV4KCkgYXJnIGlzIG1hbGZvcm1lZCBzdHJpbmdcIik7Zm9yKGgrKztcIiBcIj09PWFbaF07KWgrK31pZihhLmxlbmd0aCE9PWgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihcImNvbXBsZXgoKSBhcmcgaXMgbWFsZm9ybWVkIHN0cmluZ1wiKTtyZXR1cm4gYyhkLGUsYil9O2NvbnN0IGs9YigoYSxiLGMsZCk9Pntjb25zdCBnPWN8MDtyZXR1cm4gMD09PWQmJmM9PT1nPygxMDA8Z3x8LTEwMD5nP2E9ZihhLGIsZywwKTowPGc/YT1sKGEsYixnKTooYT1sKGEsYiwtZyksYT1lKDEsMCxhLnJlYWwsYS5pbWFnKSksYSk6ZihhLGIsYyxkKX0pO2guUHlfRFRTRl9TSUdOPTE7aC5QeV9EVFNGX0FERF9ET1RfMD0yO2guUHlfRFRTRl9BTFQ9NDtoLlB5X0RUU1RfRklOSVRFPTA7aC5QeV9EVFNUX0lORklOSVRFPTE7aC5QeV9EVFNUX05BTj0yfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uc2xpY2U9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhcInNsaWNlXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjLGIpe3ZvaWQgMD09PWMmJnZvaWQgMD09PWImJihjPWEsYT1Tay5idWlsdGluLm5vbmUubm9uZSQpO3ZvaWQgMD09PWMmJihjPVNrLmJ1aWx0aW4ubm9uZS5ub25lJCk7dm9pZCAwPT09YiYmKGI9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWM7dGhpcy5zdGVwPWJ9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRkb2M6XCJzbGljZShzdG9wKVxcbnNsaWNlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXFxuXFxuQ3JlYXRlIGEgc2xpY2Ugb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZCBzbGljaW5nIChlLmcuIGFbMDoxMDoyXSkuXCIsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkbmV3KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInNsaWNlXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2xpY2VcIixhLDEsMyk7cmV0dXJuIG5ldyBTay5idWlsdGluLnNsaWNlKC4uLmEpfSxcbiRyKCl7Y29uc3QgYT1Tay5taXNjZXZhbC5vYmplY3RSZXByKHRoaXMuc3RhcnQpLGM9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0b3ApLGI9U2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnN0ZXApO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCJzbGljZShcIithK1wiLCBcIitjK1wiLCBcIitiK1wiKVwiKX0sdHAkcmljaGNvbXBhcmUoYSxjKXtpZihhLm9iJHR5cGUhPT1Tay5idWlsdGluLnNsaWNlKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDtjb25zdCBiPW5ldyBTay5idWlsdGluLnR1cGxlKFt0aGlzLnN0YXJ0LHRoaXMuc3RvcCx0aGlzLnN0ZXBdKTthPW5ldyBTay5idWlsdGluLnR1cGxlKFthLnN0YXJ0LGEuc3RvcCxhLnN0ZXBdKTtyZXR1cm4gYi50cCRyaWNoY29tcGFyZShhLGMpfX0sZ2V0c2V0czp7c3RhcnQ6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGFydH19LHN0ZXA6eyRnZXQoKXtyZXR1cm4gdGhpcy5zdGVwfX0sc3RvcDp7JGdldCgpe3JldHVybiB0aGlzLnN0b3B9fX0sXG5tZXRob2RzOntpbmRpY2VzOnskbWV0aDpmdW5jdGlvbihhKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhLFNrLmJ1aWx0aW4uT3ZlcmZsb3dFcnJvcik7aWYoMD5hKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImxlbmd0aCBzaG91bGQgbm90IGJlIG5lZ2F0aXZlXCIpO2NvbnN0IHtzdGFydDpjLHN0b3A6YixzdGVwOmV9PXRoaXMuc2xpY2UkaW5kaWNlcyhhKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8oYyksbmV3IFNrLmJ1aWx0aW4uaW50XyhiKSxuZXcgU2suYnVpbHRpbi5pbnRfKGUpXSl9LCRkb2M6XCJTLmluZGljZXMobGVuKSAtPiAoc3RhcnQsIHN0b3AsIHN0cmlkZSlcXG5cXG5Bc3N1bWluZyBhIHNlcXVlbmNlIG9mIGxlbmd0aCBsZW4sIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIHN0b3BcXG5pbmRpY2VzLCBhbmQgdGhlIHN0cmlkZSBsZW5ndGggb2YgdGhlIGV4dGVuZGVkIHNsaWNlIGRlc2NyaWJlZCBieVxcblMuIE91dCBvZiBib3VuZHMgaW5kaWNlcyBhcmUgY2xpcHBlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlXFxuaGFuZGxpbmcgb2Ygbm9ybWFsIHNsaWNlcy5cIixcbiR0ZXh0c2lnOm51bGwsJGZsYWdzOntPbmVBcmc6ITB9fX0scHJvdG86e3NsaWNlJGFzX2luZGljZXMoYSl7bGV0IGM7dmFyIGI9YT9hPT5Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYSxudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIE5vbmUgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpOmE9PlNrLm1pc2NldmFsLmFzSW5kZXhPclRocm93KGEsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2RcIik7aWYoU2suYnVpbHRpbi5jaGVja05vbmUodGhpcy5zdGVwKSljPTE7ZWxzZSBpZihjPWIodGhpcy5zdGVwKSwwPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVyb1wiKTthPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RhcnQpP251bGw6Yih0aGlzLnN0YXJ0KTtiPVNrLmJ1aWx0aW4uY2hlY2tOb25lKHRoaXMuc3RvcCk/bnVsbDpcbmIodGhpcy5zdG9wKTtyZXR1cm57c3RhcnQ6YSxzdG9wOmIsc3RlcDpjfX0sJHdydChhLGMsYixlLGYpe2Y9Zj9iPT5KU0JJLl9faXNCaWdJbnQoYik/SlNCSS5hZGQoYixKU0JJLkJpZ0ludChhKSk6YithOmI9PmIrYTswPGU/KG51bGw9PT1jP2M9MDowPmMmJihjPWYoYyksMD5jJiYoYz0wKSksbnVsbD09PWI/Yj1hOmI+YT9iPWE6MD5iJiYoYj1mKGIpKSk6KG51bGw9PT1jP2M9YS0xOmM+PWE/Yz1hLTE6MD5jJiYoYz1mKGMpKSxudWxsPT09Yj9iPS0xOjA+YiYmKGI9ZihiKSwwPmImJihiPS0xKSkpO3JldHVybntzdGFydDpjLHN0b3A6YixzdGVwOmV9fSxzbGljZSRpbmRpY2VzKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkYXNfaW5kaWNlcyghMCxjKTtyZXR1cm4gdGhpcy4kd3J0KGEsYixlLGYsYyl9LHNzc2l0ZXIkKGEsYyl7bGV0IHtzdGFydDpiLHN0b3A6ZSxzdGVwOmZ9PXRoaXMuc2xpY2UkaW5kaWNlcyhhLCEwKTtpZigwPGYpZm9yKGE9YjthPFxuZTthKz1mKWMoYSk7ZWxzZSBmb3IoYT1iO2E+ZTthKz1mKWMoYSl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO1NrLmJ1aWx0aW4uc2xpY2Uuc3RhcnRFbmQkd3J0PWZ1bmN0aW9uKGEsYyxiKXthPWEuc3EkbGVuZ3RoKCk7dm9pZCAwPT09Y3x8U2suYnVpbHRpbi5jaGVja05vbmUoYyk/Yz0wOihjPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChjLG51bGwsXCJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgaGF2ZSBhbiBfX2luZGV4X18gbWV0aG9kXCIpLDA+YyYmKGMrPWEsMD5jJiYoYz0wKSkpO3ZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpP2I9YTooYj1Tay5taXNjZXZhbC5hc0luZGV4U2l6ZWQoYixudWxsLFwic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yIGhhdmUgYW4gX19pbmRleF9fIG1ldGhvZFwiKSwwPmI/KGIrPWEsMD5iJiYoYj0wKSk6Yj5hJiYoYj1hKSk7cmV0dXJue3N0YXJ0OmMsZW5kOmJ9fX0sZnVuY3Rpb24obSxcbnEpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBTay5idWlsdGluLmNoZWNrQW55U2V0KGIpP2EuY2FsbCh0aGlzLGIpOlNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkfX1mdW5jdGlvbiBjKGEpe2EgaW5zdGFuY2VvZiBTay5idWlsdGluLnNldCYmYS50cCRoYXNoPT09U2suYnVpbHRpbi5ub25lLm5vbmUkJiYoYT1uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoU2subWlzY2V2YWwuYXJyYXlGcm9tSXRlcmFibGUoYSkpKTtyZXR1cm4gYX1tPXt9O1NrLmJ1aWx0aW4uc2V0PVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJzZXRcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YT9hPVtdOkFycmF5LmlzQXJyYXkoYSl8fChhPVNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zZXQsXCJCYWQgY2FsbCB0byBzZXQgLSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIEFycmF5IGFuZCAnbmV3J1wiKTtcbmNvbnN0IGI9W107Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pLGIucHVzaCghMCk7dGhpcy52PW5ldyBTay5idWlsdGluLmRpY3QoYik7dGhpcy5pbiRyZXByPSExfSxzbG90czp7dHAkZ2V0YXR0cjpTay5nZW5lcmljLmdldEF0dHIsdHAkYXNfbnVtYmVyOiEwLHRwJGFzX3NlcXVlbmNlX29yX21hcHBpbmc6ITAsdHAkaGFzaDpTay5idWlsdGluLm5vbmUubm9uZSQsdHAkZG9jOlwic2V0KCkgLT4gbmV3IGVtcHR5IHNldCBvYmplY3RcXG5zZXQoaXRlcmFibGUpIC0+IG5ldyBzZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gdW5vcmRlcmVkIGNvbGxlY3Rpb24gb2YgdW5pcXVlIGVsZW1lbnRzLlwiLHRwJGluaXQoYSxiKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwic2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic2V0XCIsYSwwLDEpO3RoaXMuc2V0JGNsZWFyKCk7cmV0dXJuKGE9YVswXSkmJnRoaXMuc2V0JHVwZGF0ZShhKX0sdHAkbmV3OlNrLmdlbmVyaWMubmV3LFxuJHIoKXtpZih0aGlzLmluJHJlcHIpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihTay5hYnN0ci50eXBlTmFtZSh0aGlzKStcIiguLi4pXCIpO3RoaXMuaW4kcmVwcj0hMDtjb25zdCBhPXRoaXMuc2skYXNhcnJheSgpLm1hcChhPT5Tay5taXNjZXZhbC5vYmplY3RSZXByKGEpKTt0aGlzLmluJHJlcHI9ITE7cmV0dXJuIFNrLl9fZnV0dXJlX18ucHl0aG9uMz8wPT09YS5sZW5ndGg/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKClcIik6dGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zZXQ/bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKHtcIithLmpvaW4oXCIsIFwiKStcIn0pXCIpOm5ldyBTay5idWlsdGluLnN0cihcIntcIithLmpvaW4oXCIsIFwiKStcIn1cIik6bmV3IFNrLmJ1aWx0aW4uc3RyKFNrLmFic3RyLnR5cGVOYW1lKHRoaXMpK1wiKFtcIithLmpvaW4oXCIsIFwiKStcIl0pXCIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSx0cCRyaWNoY29tcGFyZShhLFxuYil7aWYoIVNrLmJ1aWx0aW4uY2hlY2tBbnlTZXQoYSkpcmV0dXJuIFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWQuTm90SW1wbGVtZW50ZWQkO3N3aXRjaChiKXtjYXNlIFwiTm90RXFcIjpjYXNlIFwiRXFcIjpyZXR1cm4gYT10aGlzPT09YT8hMDp0aGlzLmdldCRzaXplKCkhPT1hLmdldCRzaXplKCk/ITE6U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKSxcIkVxXCI9PT1iP2E6IWE7Y2FzZSBcIkx0RVwiOnJldHVybiB0aGlzPT09YXx8U2subWlzY2V2YWwuaXNUcnVlKHRoaXMuc2V0JGlzc3Vic2V0KGEpKTtjYXNlIFwiR3RFXCI6cmV0dXJuIHRoaXM9PT1hfHxTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpO2Nhc2UgXCJMdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk8YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUodGhpcy5zZXQkaXNzdWJzZXQoYSkpO2Nhc2UgXCJHdFwiOnJldHVybiB0aGlzLmdldCRzaXplKCk+YS5nZXQkc2l6ZSgpJiZTay5taXNjZXZhbC5pc1RydWUoYS5zZXQkaXNzdWJzZXQodGhpcykpfX0sXG5uYiRzdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkYW5kOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uLiRtZXRoLmNhbGwodGhpcyxhKX0pLG5iJG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudW5pb24uJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkeG9yOmEoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3ltbWV0cmljX2RpZmZlcmVuY2UuJG1ldGguY2FsbCh0aGlzLGEpfSksbmIkaW5wbGFjZV9zdWJ0cmFjdDphKGZ1bmN0aW9uKGEpe2E9PT10aGlzJiYoYT1hLnNldCRjb3B5KCkpO3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmRpZmZlcmVuY2VfdXBkYXRlLiRtZXRoLmNhbGwodGhpcyxhKSwoKT0+dGhpcyl9KSxuYiRpbnBsYWNlX2FuZDphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLmludGVyc2VjdGlvbl91cGRhdGUuJG1ldGguY2FsbCh0aGlzLFxuYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV9vcjphKGZ1bmN0aW9uKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbih0aGlzLnVwZGF0ZS4kbWV0aC5jYWxsKHRoaXMsYSksKCk9PnRoaXMpfSksbmIkaW5wbGFjZV94b3I6YShmdW5jdGlvbihhKXthPT09dGhpcyYmKGE9YS5zZXQkY29weSgpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUuJG1ldGguY2FsbCh0aGlzLGEpLCgpPT50aGlzKX0pLHNxJGxlbmd0aCgpe3JldHVybiB0aGlzLmdldCRzaXplKCl9LHNxJGNvbnRhaW5zKGEpe2E9YyhhKTtyZXR1cm4gdGhpcy52LnNxJGNvbnRhaW5zKGEpfX0sbWV0aG9kczp7YWRkOnskbWV0aChhKXt0aGlzLnNldCRhZGQoYSk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LlxcblxcblRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuXCJ9LFxuY2xlYXI6eyRtZXRoKCl7dGhpcy5zZXQkY2xlYXIoKTtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSwkZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoaXMgc2V0LlwifSxjb3B5OnskbWV0aCgpe3JldHVybiB0aGlzLnNldCRjb3B5KCl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBzZXQuXCJ9LGRpc2NhcmQ6eyRtZXRoKGEpe2E9YyhhKTt0aGlzLnNldCRkaXNjYXJkKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLlxcblxcbklmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy5cIn0sZGlmZmVyZW5jZTp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KGEsYT0+Yi5zZXQkZGlmZmVyZW5jZV91cGRhdGUoYSkpLCgpPT5iKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gb3IgbW9yZSBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYnV0IG5vdCB0aGUgb3RoZXJzLilcIn0sZGlmZmVyZW5jZV91cGRhdGU6eyRtZXRoKC4uLmEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT50aGlzLnNldCRkaWZmZXJlbmNlX3VwZGF0ZShhKSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7TWluQXJnczowfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZW1vdmUgYWxsIGVsZW1lbnRzIG9mIGFub3RoZXIgc2V0IGZyb20gdGhpcyBzZXQuXCJ9LGludGVyc2VjdGlvbjp7JG1ldGgoLi4uYSl7cmV0dXJuIHRoaXMuc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKX0sXG4kZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKVwifSxpbnRlcnNlY3Rpb25fdXBkYXRlOnskbWV0aCguLi5hKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkaW50ZXJzZWN0aW9uX211bHRpKC4uLmEpLGE9Pnt0aGlzLnN3YXAkYm9kaWVzKGEpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSxpc2Rpc2pvaW50OnskbWV0aChhKXtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckZvcihTay5hYnN0ci5pdGVyKGEpLGE9PntpZih0aGlzLnNxJGNvbnRhaW5zKGEpKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoU2suYnVpbHRpbi5ib29sLmZhbHNlJCl9KSxcbmE9PmF8fFNrLmJ1aWx0aW4uYm9vbC50cnVlJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gVHJ1ZSBpZiB0d28gc2V0cyBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uXCJ9LGlzc3Vic2V0OnskbWV0aChhKXtTay5idWlsdGluLmNoZWNrQW55U2V0KGEpfHwoYT10aGlzLnNldCRtYWtlX2Jhc2V0eXBlKGEpKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRpc3N1YnNldChhKSl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC5cIn0saXNzdXBlcnNldDp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGEsYT0+YS5zZXQkaXNzdWJzZXQodGhpcykpfSwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6bnVsbCxcbiRkb2M6XCJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC5cIn0scG9wOnskbWV0aCgpe2lmKDA9PT10aGlzLmdldCRzaXplKCkpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uS2V5RXJyb3IoXCJwb3AgZnJvbSBhbiBlbXB0eSBzZXRcIik7cmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1BcnJheSh0aGlzLnYucG9waXRlbSxbdGhpcy52XSkudlswXX0sJGZsYWdzOntOb0FyZ3M6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC5cXG5SYWlzZXMgS2V5RXJyb3IgaWYgdGhlIHNldCBpcyBlbXB0eS5cIn0scmVtb3ZlOnskbWV0aChhKXtjb25zdCBiPWMoYSk7aWYodGhpcy52Lm1wJGxvb2t1cChiKSlyZXR1cm4gdGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYiksU2suYnVpbHRpbi5ub25lLm5vbmUkO3Rocm93IG5ldyBTay5idWlsdGluLktleUVycm9yKGEpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsXG4kZG9jOlwiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci5cXG5cXG5JZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlOnskbWV0aChhKXtsZXQgYjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSxhPT57Yj1hO3JldHVybiBiLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUodGhpcyl9LCgpPT5iKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LlxcblxcbihpLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pXCJ9LHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZTp7JG1ldGgoYSl7U2suYnVpbHRpbi5jaGVja0FueVNldChhKXx8KGE9dGhpcy5zZXQkbWFrZV9iYXNldHlwZShhKSk7XG5yZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oYSxhPT50aGlzLnNldCRzeW1tZXRyaWNfZGlmZl91cGRhdGUoYSksKCk9PlNrLmJ1aWx0aW4ubm9uZS5ub25lJCl9LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLlwifSx1bmlvbjp7JG1ldGgoLi4uYSl7Y29uc3QgYj10aGlzLnNldCRjb3B5KCk7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLGE9PmIuc2V0JHVwZGF0ZShhKSksKCk9PmIpfSwkZmxhZ3M6e01pbkFyZ3M6MH0sJHRleHRzaWc6bnVsbCwkZG9jOlwiUmV0dXJuIHRoZSB1bmlvbiBvZiBzZXRzIGFzIGEgbmV3IHNldC5cXG5cXG4oaS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pXCJ9LHVwZGF0ZTp7JG1ldGgoLi4uYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLm1pc2NldmFsLml0ZXJBcnJheShhLFxuYT0+dGhpcy5zZXQkdXBkYXRlKGEpKSwoKT0+U2suYnVpbHRpbi5ub25lLm5vbmUkKX0sJGZsYWdzOntNaW5BcmdzOjB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIG90aGVycy5cIn19LHByb3RvOk9iamVjdC5hc3NpZ24obSx7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2skYXNhcnJheSgpfSxnZXQkc2l6ZSgpe3JldHVybiB0aGlzLnYuc3EkbGVuZ3RoKCl9LHNldCRhZGQoYSl7dGhpcy52Lm1wJGFzc19zdWJzY3JpcHQoYSwhMCl9LHNldCRtYWtlX2Jhc2V0eXBlKGEpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5uZXcgdGhpcy5zayRidWlsdGluQmFzZShhKSl9LHNldCRkaXNjYXJkKGEpe3JldHVybiB0aGlzLnYucG9wJGl0ZW0oYSl9LHNldCRjbGVhcigpe3RoaXMudj1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKX0sc2V0JGNvcHkoKXtjb25zdCBhPVxubmV3IHRoaXMuc2skYnVpbHRpbkJhc2U7YS52PXRoaXMudi5kaWN0JGNvcHkoKTtyZXR1cm4gYX0sc2V0JGRpZmZlcmVuY2VfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGRpc2NhcmQoYSl9KX0sc2V0JGludGVyc2VjdGlvbihhKXtjb25zdCBiPW5ldyB0aGlzLnNrJGJ1aWx0aW5CYXNlO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc3EkY29udGFpbnMoYSkmJmIuc2V0JGFkZChhKX0pLCgpPT5iKX0sc2V0JGludGVyc2VjdGlvbl9tdWx0aSguLi5hKXtpZighYS5sZW5ndGgpcmV0dXJuIHRoaXMuc2V0JGNvcHkoKTtsZXQgYj10aGlzO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5pdGVyQXJyYXkoYSxhPT5Tay5taXNjZXZhbC5jaGFpbihiLnNldCRpbnRlcnNlY3Rpb24oYSksYT0+e2I9YX0pKSwoKT0+Yil9LFxuc2V0JGlzc3Vic2V0KGEpe2NvbnN0IGI9dGhpcy5nZXQkc2l6ZSgpLGM9YS5nZXQkc2l6ZSgpO2lmKGI+YylyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtmb3IobGV0IGI9dGhpcy50cCRpdGVyKCksYz1iLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09YztjPWIudHAkaXRlcm5leHQoKSlpZighYS5zcSRjb250YWlucyhjKSlyZXR1cm4gU2suYnVpbHRpbi5ib29sLmZhbHNlJDtyZXR1cm4gU2suYnVpbHRpbi5ib29sLnRydWUkfSxzZXQkc3ltbWV0cmljX2RpZmZfdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3ZvaWQgMD09PXRoaXMuc2V0JGRpc2NhcmQoYSkmJnRoaXMuc2V0JGFkZChhKX0pfSxzZXQkdXBkYXRlKGEpe3JldHVybiBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoYSksYT0+e3RoaXMuc2V0JGFkZChhKX0pfSxzd2FwJGJvZGllcyhhKXt0aGlzLnY9YS52fX0pfSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5zZXRcIixcblNrLmJ1aWx0aW4uc2V0KTtxPVNrLmJ1aWx0aW4uc2V0LnByb3RvdHlwZTtTay5idWlsdGluLmZyb3plbnNldD1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwiZnJvemVuc2V0XCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtTay5hc3NlcnRzLmFzc2VydChBcnJheS5pc0FycmF5KGEpJiZ0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mcm96ZW5zZXQsXCJiYWQgY2FsbCB0byBmcm96ZW4gc2V0IC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBBcnJheSBhbmQgJ25ldydcIik7Y29uc3QgYj1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSksYi5wdXNoKCEwKTt0aGlzLnY9bmV3IFNrLmJ1aWx0aW4uZGljdChiKTt0aGlzLmluJHJlcHI9ITF9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19udW1iZXI6ITAsdHAkYXNfc2VxdWVuY2Vfb3JfbWFwcGluZzohMCx0cCRkb2M6XCJmcm96ZW5zZXQoKSAtPiBlbXB0eSBmcm96ZW5zZXQgb2JqZWN0XFxuZnJvemVuc2V0KGl0ZXJhYmxlKSAtPiBmcm96ZW5zZXQgb2JqZWN0XFxuXFxuQnVpbGQgYW4gaW1tdXRhYmxlIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy5cIixcbnRwJGhhc2goKXtsZXQgYT0xOTI3ODY4MjM3O2NvbnN0IGI9dGhpcy5zayRhc2FycmF5KCk7YSo9Yi5sZW5ndGgrMTtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKyl7Y29uc3QgZT1Tay5hYnN0ci5vYmplY3RIYXNoKGJbY10pO2FePTM2NDQ3OTgxNjcqKGVeZTw8MTZeODk4Njk3NDcpfXJldHVybiA2OTA2OSphKzkwNzEzMzkyM30sdHAkbmV3KGEsYil7aWYodGhpcyE9PVNrLmJ1aWx0aW4uZnJvemVuc2V0LnByb3RvdHlwZSlyZXR1cm4gdGhpcy4kc3VidHlwZV9uZXcoYSxiKTtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwiZnJvemVuc2V0XCIsYik7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwiZnJvemVuc2V0XCIsYSwwLDEpO2E9YVswXTtyZXR1cm4gdm9pZCAwIT09YSYmYS5vYiR0eXBlPT09U2suYnVpbHRpbi5mcm96ZW5zZXQ/YTpTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC5hcnJheUZyb21JdGVyYWJsZShhLCEwKSxhPT5hLmxlbmd0aD9uZXcgU2suYnVpbHRpbi5mcm96ZW5zZXQoYSk6XG5Tay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQpfSwkcjpxLiRyLHRwJGl0ZXI6cS50cCRpdGVyLHRwJHJpY2hjb21wYXJlOnEudHAkcmljaGNvbXBhcmUsbmIkc3VidHJhY3Q6cS5uYiRzdWJ0cmFjdCxuYiRhbmQ6cS5uYiRhbmQsbmIkb3I6cS5uYiRvcixuYiR4b3I6cS5uYiR4b3Isc3EkbGVuZ3RoOnEuc3EkbGVuZ3RoLHNxJGNvbnRhaW5zOnEuc3EkY29udGFpbnN9LG1ldGhvZHM6e2NvcHk6T2JqZWN0LmFzc2lnbih7fSxxLmNvcHkuZCRkZWYseyRtZXRoKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3I9PT10aGlzLnNrJGJ1aWx0aW5CYXNlP3RoaXM6bmV3IFNrLmJ1aWx0aW4uZnJvemVuc2V0KHRoaXMuc2skYXNhcnJheSgpKX19KSxkaWZmZXJlbmNlOnEuZGlmZmVyZW5jZS5kJGRlZixpbnRlcnNlY3Rpb246cS5pbnRlcnNlY3Rpb24uZCRkZWYsaXNkaXNqb2ludDpxLmlzZGlzam9pbnQuZCRkZWYsaXNzdWJzZXQ6cS5pc3N1YnNldC5kJGRlZixpc3N1cGVyc2V0OnEuaXNzdXBlcnNldC5kJGRlZixcbnN5bW1ldHJpY19kaWZmZXJlbmNlOnEuc3ltbWV0cmljX2RpZmZlcmVuY2UuZCRkZWYsdW5pb246cS51bmlvbi5kJGRlZn0scHJvdG86T2JqZWN0LmFzc2lnbih7JHN1YnR5cGVfbmV3KGEsYil7Y29uc3QgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4oU2suYnVpbHRpbi5mcm96ZW5zZXQucHJvdG90eXBlLnRwJG5ldyhhKSxhPT57Yy52PWEudjtyZXR1cm4gY30pfX0sbSl9KTtTay5idWlsdGluLmZyb3plbnNldC4kZW1wdHlzZXQ9T2JqZWN0LmNyZWF0ZShTay5idWlsdGluLmZyb3plbnNldC5wcm90b3R5cGUse3Y6e3ZhbHVlOm5ldyBTay5idWlsdGluLmRpY3QoW10pLGVudW1lcmFibGU6ITB9LGluJHJlcHI6e3ZhbHVlOiExLGVudW1lcmFibGU6ITB9fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5mcm96ZW5zZXRcIixTay5idWlsdGluLmZyb3plbnNldCk7dmFyIGI9U2suYWJzdHIuYnVpbGRJdGVyYXRvckNsYXNzKFwic2V0X2l0ZXJhdG9yXCIsXG57Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy4kaW5kZXg9MDt0aGlzLiRzZXE9YS5zayRhc2FycmF5KCk7dGhpcy4kb3JpZz1hfSxpdGVybmV4dDpTay5nZW5lcmljLml0ZXJOZXh0V2l0aEFycmF5Q2hlY2tTaXplLG1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJMZW5ndGhIaW50V2l0aEFycmF5TWV0aG9kRGVmfSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ucHJpbnQ9ZnVuY3Rpb24oYSxjKXtsZXQgW2IsZSxmXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcInByaW50XCIsW1wic2VwXCIsXCJlbmRcIixcImZpbGVcIixcImZsdXNoXCJdLFtdLGMpO2lmKHZvaWQgMD09PWJ8fFNrLmJ1aWx0aW4uY2hlY2tOb25lKGIpKWI9XCIgXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGIpKWI9Yi4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGIpKTtpZih2b2lkIDA9PT1lfHxTay5idWlsdGluLmNoZWNrTm9uZShlKSllPVwiXFxuXCI7ZWxzZSBpZihTay5idWlsdGluLmNoZWNrU3RyaW5nKGUpKWU9ZS4kanNzdHIoKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcImVuZCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCBcIitTay5hYnN0ci50eXBlTmFtZShlKSk7bGV0IGw7aWYodm9pZCAwIT09ZiYmIVNrLmJ1aWx0aW4uY2hlY2tOb25lKGYpJiYobD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGYsU2suYnVpbHRpbi5zdHIuJHdyaXRlKSx2b2lkIDA9PT1sKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIidcIitTay5hYnN0ci50eXBlTmFtZShmKStcIicgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dyaXRlJ1wiKTtjb25zdCBoPW5ldyBTay5idWlsdGluLnN0cihhLm1hcChhPT4obmV3IFNrLmJ1aWx0aW4uc3RyKGEpKS50b1N0cmluZygpKS5qb2luKGIpK2UpO1xuaWYodm9pZCAwIT09bClTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkobCxbaF0pO2Vsc2UgcmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKFNrLmltcG9ydE1vZHVsZShcInN5c1wiLCExLCEwKSxhPT4obD1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEuJGQuc3Rkb3V0LFNrLmJ1aWx0aW4uc3RyLiR3cml0ZSkpJiZTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkobCxbaF0pKX07U2suYnVpbHRpbi5wcmludC5jb19mYXN0Y2FsbD0xfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4ubW9kdWxlPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJtb2R1bGVcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLiRkPXt9fSxzbG90czp7dHAkZG9jOlwiQ3JlYXRlIGEgbW9kdWxlIG9iamVjdC5cXG5cXG5UaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOyB0aGUgb3B0aW9uYWwgZG9jIGFyZ3VtZW50IGNhbiBoYXZlIGFueSB0eXBlLlwiLHRwJGdldGF0dHIoYSxjKXt2YXIgYj10aGlzLiRkW2EuJG1hbmdsZWRdO1xuaWYodm9pZCAwIT09YilyZXR1cm4gYjtiPXRoaXMub2IkdHlwZS4kdHlwZUxvb2t1cChhKTtpZih2b2lkIDAhPT1iKXtjb25zdCBhPWIudHAkZGVzY3JfZ2V0O3JldHVybiBhP2EuY2FsbChiLHRoaXMsdGhpcy5vYiR0eXBlLGMpOmJ9Y29uc3QgZT10aGlzLiRkLl9fZ2V0YXR0cl9fO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGI9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShlLFthXSksYT0+e2lmKCEoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IpKXRocm93IGE7fSksYz9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sdHAkc2V0YXR0cjpTay5nZW5lcmljLnNldEF0dHIsdHAkbmV3OlNrLmdlbmVyaWMubmV3LHRwJGluaXQoYSxjKXtjb25zdCBbYixlXT1Tay5hYnN0ci5jb3B5S2V5d29yZHNUb05hbWVkQXJncyhcIm1vZHVsZVwiLFtcIm5hbWVcIixcImRvY1wiXSxhLGMsW1NrLmJ1aWx0aW4ubm9uZS5ub25lJF0pO1xuU2suYnVpbHRpbi5weUNoZWNrVHlwZShcIm1vZHVsZVwiLFwic3RyaW5nXCIsYik7dGhpcy5pbml0JGRpY3QoYixlKX0sJHIoKXtsZXQgYT10aGlzLmdldCRuYW1lKCk7aWYodm9pZCAwIT09YSl7dmFyIGM9dGhpcy5nZXQkbW9kX3JlcHJmKCk7aWYodm9pZCAwIT09YylyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KGMsW3RoaXNdKX1hPXZvaWQgMD09PWE/XCInPydcIjphO2M9dGhpcy5mcm9tJGZpbGUoKTtjPXZvaWQgMD09PWM/dGhpcy5lbXB0eV9vciRsb2FkZXIoKTpjO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8bW9kdWxlIFwiK2ErYytcIj5cIil9fSxnZXRzZXRzOntfX2RpY3RfXzp7JGdldCgpe3JldHVybiBuZXcgU2suYnVpbHRpbi5tYXBwaW5ncHJveHkodGhpcy4kZCl9fX0sbWV0aG9kczp7X19kaXJfXzp7JG1ldGgoKXtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kZGljdCk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tNYXBwaW5nKGEpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIl9fZGljdF9fIGlzIG5vdCBhIGRpY3Rpb25hcnlcIik7XG5jb25zdCBjPWEubXAkbG9va3VwKFNrLmJ1aWx0aW4uc3RyLiRkaXIpO3JldHVybiB2b2lkIDAhPT1jP1NrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheShjLFtdKTpuZXcgU2suYnVpbHRpbi5saXN0KFNrLm1pc2NldmFsLmFycmF5RnJvbUl0ZXJhYmxlKGEpKX0sJGZsYWdzOntOb0FyZ3M6ITB9LCRkb2M6XCJfX2Rpcl9fKCkgLT4gbGlzdFxcbnNwZWNpYWxpemVkIGRpcigpIGltcGxlbWVudGF0aW9uXCJ9fSxwcm90bzp7aW5pdCRkaWN0KGEsYyl7dGhpcy4kZC5fX25hbWVfXz1hO3RoaXMuJGQuX19kb2NfXz1jO3RoaXMuJGQuX19wYWNrYWdlX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19zcGVjX189U2suYnVpbHRpbi5ub25lLm5vbmUkO3RoaXMuJGQuX19sb2FkZXJfXz1Tay5idWlsdGluLm5vbmUubm9uZSR9LHNrJGF0dHJFcnJvcigpe2NvbnN0IGE9dGhpcy5nZXQkbmFtZSgpO3JldHVybiB2b2lkIDA9PT1hP1wibW9kdWxlXCI6XCJtb2R1bGUgXCIrYX0sZ2V0JG5hbWUoKXtjb25zdCBhPVxudGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRuYW1lKTtyZXR1cm4gYSYmU2subWlzY2V2YWwub2JqZWN0UmVwcihhKX0sZnJvbSRmaWxlKCl7Y29uc3QgYT10aGlzLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJGZpbGUpO3JldHVybiBhJiZcIiBmcm9tIFwiK1NrLm1pc2NldmFsLm9iamVjdFJlcHIoYSl9LGVtcHR5X29yJGxvYWRlcigpe2lmKHRoaXMuJGpzJiZ0aGlzLiRqcy5pbmNsdWRlcyhcIiRidWlsdGlubW9kdWxlXCIpKXJldHVyblwiIChidWlsdC1pbilcIjtjb25zdCBhPXRoaXMudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbG9hZGVyKTtyZXR1cm4gdm9pZCAwPT09YXx8U2suYnVpbHRpbi5jaGVja05vbmUoYSk/XCJcIjpcIiAoXCIrU2subWlzY2V2YWwub2JqZWN0UmVwcihhKStcIilcIn0sZ2V0JG1vZF9yZXByZigpe2NvbnN0IGE9dGhpcy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRsb2FkZXIpO3JldHVybiBhJiZhLnRwJGdldGF0dHIodGhpcy5zdHIkbW9kX3JlcHIpfSxcbnN0ciRtb2RfcmVwcjpuZXcgU2suYnVpbHRpbi5zdHIoXCJtb2R1bGVfcmVwclwiKX19KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLm1vZHVsZVwiLFNrLmJ1aWx0aW4ubW9kdWxlKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0cnVjdHNlcV90eXBlcz17fTtTay5idWlsdGluLm1ha2Vfc3RydWN0c2VxPWZ1bmN0aW9uKGEsYyxiLGUpe2NvbnN0IGY9YStcIi5cIitjLGw9W107YT1bXTtmb3IobGV0IGMgaW4gYilsLnB1c2goYyksYS5wdXNoKGJbY10pO2I9e307Zm9yKGxldCBjPTA7YzxsLmxlbmd0aDtjKyspYltsW2NdXT17JGdldCgpe3JldHVybiB0aGlzLnZbY119LCRkb2M6YVtjXX07dmFyIGg9U2suYWJzdHIuYnVpbGROYXRpdmVDbGFzcyhmLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCgoQXJyYXkuaXNBcnJheShhKXx8dm9pZCAwPT09YSkmJnRoaXMgaW5zdGFuY2VvZiBoKTtTay5idWlsdGluLnR1cGxlLmNhbGwodGhpcyxhKX0sYmFzZTpTay5idWlsdGluLnR1cGxlLFxuc2xvdHM6e3RwJG5ldyhhLGIpe1NrLmFic3RyLmNoZWNrT25lQXJnKGYsYSxiKTtiPVtdO2E9YVswXTtmb3IobGV0IGM9U2suYWJzdHIuaXRlcihhKSxkPWMudHAkaXRlcm5leHQoKTt2b2lkIDAhPT1kO2Q9Yy50cCRpdGVybmV4dCgpKWIucHVzaChkKTtpZihiLmxlbmd0aCE9bC5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKGYrXCIoKSB0YWtlcyBhIFwiK2wubGVuZ3RoK1wiLXNlcXVlbmNlIChcIitiLmxlbmd0aCtcIi1zZXF1ZW5jZSBnaXZlbilcIik7cmV0dXJuIG5ldyBoKGIpfSx0cCRkb2M6ZT9lOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCwkcigpe3ZhciBhO2lmKDA9PT10aGlzLnYubGVuZ3RoKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZitcIigpXCIpO3ZhciBiPVtdO2ZvcihhPTA7YTx0aGlzLnYubGVuZ3RoOysrYSliW2FdPWxbYV0rXCI9XCIrU2subWlzY2V2YWwub2JqZWN0UmVwcih0aGlzLnZbYV0pO2E9Yi5qb2luKFwiLCBcIik7MT09PXRoaXMudi5sZW5ndGgmJihhKz1cblwiLFwiKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGYrXCIoXCIrYStcIilcIil9fSxtZXRob2RzOntfX3JlZHVjZV9fOnskbWV0aCgpe3Rocm93IG5ldyBTay5idWlsdGluLk5vdEltcGxlbWVudGVkRXJyb3IoXCJfX3JlZHVjZV9fIGlzIG5vdCBpbXBsZW1lbnRlZFwiKTt9LCRmbGFnczp7Tm9BcmdzOiEwfX19LGdldHNldHM6Yixwcm90bzp7bnVtX3NlcXVlbmNlX2ZpZWxkczpuZXcgU2suYnVpbHRpbi5pbnRfKGwubGVuZ3RoKX19KTtyZXR1cm4gaH07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlX3N0cnVjdHNlcVwiLFNrLmJ1aWx0aW4ubWFrZV9zdHJ1Y3RzZXEpfSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZ2VuZXJhdG9yPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImdlbmVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsO2lmKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFkIGludGVybmFsIGNhbGwgdG8gZ2VuZXJhdG9yLCB1c2UgJ25ldydcIik7XG50aGlzLmZ1bmNfY29kZT1hO3RoaXMuZnVuY19nbG9iYWxzPWN8fG51bGw7dGhpcy5naSRydW5uaW5nPSExO3RoaXMuZ2kkcmVzdW1lYXQ9MDt0aGlzLmdpJHNlbnR2YWx1ZT12b2lkIDA7dGhpcy5naSRsb2NhbHM9e307dGhpcy5naSRjZWxscz17fTtpZigwPGIubGVuZ3RoKWZvcihjPTA7YzxhLmNvX3Zhcm5hbWVzLmxlbmd0aDsrK2MpdGhpcy5naSRsb2NhbHNbYS5jb192YXJuYW1lc1tjXV09YltjXTtpZih2b2lkIDAhPT1mKWZvcihsIGluIGYpZVtsXT1mW2xdO3RoaXMuZnVuY19jbG9zdXJlPWV9fSxzbG90czp7JHIoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKFwiPGdlbmVyYXRvciBvYmplY3QgXCIrdGhpcy5mdW5jX2NvZGUuY29fbmFtZS52K1wiPlwiKX19LGl0ZXJuZXh0KGEsYyl7dmFyIGI9dGhpczt0aGlzLmdpJHJ1bm5pbmc9ITA7dm9pZCAwPT09YyYmKGM9U2suYnVpbHRpbi5ub25lLm5vbmUkKTt0aGlzLmdpJHNlbnR2YWx1ZT1jO2M9W3RoaXNdO3RoaXMuZnVuY19jbG9zdXJlJiZcbmMucHVzaCh0aGlzLmZ1bmNfY2xvc3VyZSk7cmV0dXJuIGZ1bmN0aW9uIGwoYyl7aWYoYyBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pe2lmKGEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5TdXNwZW5zaW9uKGwsYyk7Yz1Tay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9Yi5naSRydW5uaW5nPSExO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWMpO2lmKGMhPT1Tay5idWlsdGluLm5vbmUubm9uZSQpcmV0dXJuIGIuZ2kkcmVzdW1lYXQ9Y1swXSxjPWNbMV19KHRoaXMuZnVuY19jb2RlLmFwcGx5KHRoaXMuZnVuY19nbG9iYWxzLGMpKX0sbWV0aG9kczp7c2VuZDp7JG1ldGgoYSl7cmV0dXJuIHRoaXMudHAkaXRlcm5leHQoITAsYSl9LCRmbGFnczp7T25lQXJnOiEwfSwkZG9jOlwic2VuZChhcmcpIC0+IHNlbmQgJ2FyZycgaW50byBnZW5lcmF0b3IsXFxucmV0dXJuIG5leHQgeWllbGRlZCB2YWx1ZSBvciByYWlzZSBTdG9wSXRlcmF0aW9uLlwifX19KTtcblNrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZ2VuZXJhdG9yXCIsU2suYnVpbHRpbi5nZW5lcmF0b3IpO1NrLmJ1aWx0aW4ubWFrZUdlbmVyYXRvcj1mdW5jdGlvbihhLGMpe3ZhciBiLGU9bmV3IFNrLmJ1aWx0aW4uZ2VuZXJhdG9yKG51bGwsbnVsbCxudWxsKTtlLnRwJGl0ZXJuZXh0PWE7Zm9yKGIgaW4gYyljLmhhc093blByb3BlcnR5KGIpJiYoZVtiXT1jW2JdKTtyZXR1cm4gZX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yXCIsU2suYnVpbHRpbi5tYWtlR2VuZXJhdG9yKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLmZpbGU9ZnVuY3Rpb24oYSxjLGIpe3ZhciBlO2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmlsZSkpcmV0dXJuIG5ldyBTay5idWlsdGluLmZpbGUoYSxjLGIpO3RoaXMubW9kZT1jO3RoaXMubmFtZT1Tay5mZmkucmVtYXBUb0pzKGEpO3RoaXMuY2xvc2VkPSExO2lmKFwiL2Rldi9zdGRvdXRcIj09PXRoaXMubmFtZSl0aGlzLmRhdGEkPVxuU2suYnVpbHRpbi5ub25lLm5vbmUkLHRoaXMuZmlsZW5vPTE7ZWxzZSBpZihcIi9kZXYvc3RkaW5cIj09PXRoaXMubmFtZSl0aGlzLmZpbGVubz0wO2Vsc2UgaWYoXCIvZGV2L3N0ZGVyclwiPT09dGhpcy5uYW1lKXRoaXMuZmlsZW5vPTI7ZWxzZXtpZihcIndcIj09PVNrLmZmaS5yZW1hcFRvSnModGhpcy5tb2RlKSl0aGlzLmZpbGVubz1Tay5idWlsdGluLmZpbGUuY3VycmVudEZpbGVubysrO2Vsc2UgZm9yKGUgaW4gdGhpcy5maWxlbm89U2suaW5Ccm93c2VyPzEwOjExLHRoaXMuZGF0YSQ9U2sucmVhZChhLnYpLHRoaXMubGluZUxpc3Q9dGhpcy5kYXRhJC5zcGxpdChcIlxcblwiKSx0aGlzLmxpbmVMaXN0PXRoaXMubGluZUxpc3Quc2xpY2UoMCwtMSksdGhpcy5saW5lTGlzdCl0aGlzLmxpbmVMaXN0W2VdKz1cIlxcblwiO3RoaXMuY3VycmVudExpbmU9MH10aGlzLnBvcyQ9MDtTay5maWxlb3BlbiYmMTA8PXRoaXMuZmlsZW5vJiZTay5maWxlb3Blbih0aGlzKTtyZXR1cm4gdGhpc307U2suYnVpbHRpbi5maWxlLmN1cnJlbnRGaWxlbm89XG4xMjtTay5hYnN0ci5zZXRVcEluaGVyaXRhbmNlKFwiZmlsZVwiLFNrLmJ1aWx0aW4uZmlsZSxTay5idWlsdGluLm9iamVjdCk7U2suYWJzdHIuc2V0VXBCdWlsdGluTXJvKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS4kcj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoXCI8XCIrKHRoaXMuY2xvc2VkP1wiY2xvc2VkXCI6XCJvcGVuXCIpK1wiZmlsZSAnXCIrdGhpcy5uYW1lK1wiJywgbW9kZSAnXCIrU2suZmZpLnJlbWFwVG9Kcyh0aGlzLm1vZGUpK1wiJz5cIil9O1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHAkaXRlcj1mdW5jdGlvbigpe3ZhciBhPXt0cCRpdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LCRvYmo6dGhpcywkaW5kZXg6dGhpcy5jdXJyZW50TGluZSwkbGluZXM6dGhpcy5saW5lTGlzdCx0cCRpdGVybmV4dDpmdW5jdGlvbigpe2lmKCEoYS4kaW5kZXg+PWEuJGxpbmVzLmxlbmd0aCkpcmV0dXJuIG5ldyBTay5idWlsdGluLnN0cihhLiRsaW5lc1thLiRpbmRleCsrXSl9fTtcbnJldHVybiBhfTtTay5hYnN0ci5zZXRVcFNsb3RzKFNrLmJ1aWx0aW4uZmlsZSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5fX2VudGVyX189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gYX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuX19leGl0X189bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXtyZXR1cm4gU2subWlzY2V2YWwuY2FsbHNpbUFycmF5KFNrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2UsW2FdKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuY2xvc2U9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhKXthLmNsb3NlZD0hMDtyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5mbHVzaD1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe30pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUuZmlsZW5vPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlsZW5vfSk7XG5Tay5idWlsdGluLmZpbGUucHJvdG90eXBlLmlzYXR0eT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEpe3JldHVybiExfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5yZWFkPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXt2YXIgYj1hLmRhdGEkLmxlbmd0aDtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTt2YXIgZT12b2lkIDA9PT1jP2I6U2suZmZpLnJlbWFwVG9KcyhjKTtlPW5ldyBTay5idWlsdGluLnN0cihhLmRhdGEkLnN1YnN0cihhLnBvcyQsZSkpO2EucG9zJD12b2lkIDA9PT1jP2I6YS5wb3MkK1NrLmZmaS5yZW1hcFRvSnMoYyk7YS5wb3MkPj1iJiYoYS5wb3MkPWIpO3JldHVybiBlfSk7U2suYnVpbHRpbi5maWxlLiRyZWFkbGluZT1mdW5jdGlvbihhLGMsYil7aWYoMD09PWEuZmlsZW5vKXthPVNrLmZmaS5yZW1hcFRvSnMoYik7YT1Tay5pbnB1dGZ1bihhP1xuYTpcIlwiKTtpZihhIGluc3RhbmNlb2YgUHJvbWlzZXx8YSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGEudGhlbil7dmFyIGU9bmV3IFNrLm1pc2NldmFsLlN1c3BlbnNpb247ZS5yZXN1bWU9ZnVuY3Rpb24oKXtpZihlLmRhdGEuZXJyb3IpdGhyb3cgZS5kYXRhLmVycm9yO3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoZS5kYXRhLnJlc3VsdCl9O2UuZGF0YT17dHlwZTpcIlNrLnByb21pc2VcIixwcm9taXNlOmF9O3JldHVybiBlfXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9Yz1cIlwiO2EuY3VycmVudExpbmU8YS5saW5lTGlzdC5sZW5ndGgmJihjPWEubGluZUxpc3RbYS5jdXJyZW50TGluZV0sYS5jdXJyZW50TGluZSsrKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGMpfTtTay5idWlsdGluLmZpbGUucHJvdG90eXBlLnJlYWRsaW5lPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjKXtyZXR1cm4gU2suYnVpbHRpbi5maWxlLiRyZWFkbGluZShhLGMsdm9pZCAwKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUucmVhZGxpbmVzPVxubmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe2lmKDA9PT1hLmZpbGVubylyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uTm90SW1wbGVtZW50ZWRFcnJvcihcInJlYWRsaW5lcyBpbnMndCBpbXBsZW1lbnRlZCBiZWNhdXNlIHRoZSB3ZWIgZG9lc24ndCBzdXBwb3J0IEN0cmwrRFwiKTt2YXIgYj1bXTtmb3IoYz1hLmN1cnJlbnRMaW5lO2M8YS5saW5lTGlzdC5sZW5ndGg7YysrKWIucHVzaChuZXcgU2suYnVpbHRpbi5zdHIoYS5saW5lTGlzdFtjXSkpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS5zZWVrPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSxjLGIpe2M9U2suZmZpLnJlbWFwVG9KcyhjKTt2b2lkIDA9PT1iJiYoYj0wKTswPT09Yj9hLnBvcyQ9YzoxPT1iP2EucG9zJD1hLmRhdGEkLmxlbmd0aCtjOjI9PWImJihhLnBvcyQ9YS5kYXRhJC5sZW5ndGgrYyk7cmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJH0pO1xuU2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS50ZWxsPW5ldyBTay5idWlsdGluLmZ1bmMoZnVuY3Rpb24oYSl7cmV0dXJuIFNrLmZmaS5yZW1hcFRvUHkoYS5wb3MkKX0pO1NrLmJ1aWx0aW4uZmlsZS5wcm90b3R5cGUudHJ1bmNhdGU9bmV3IFNrLmJ1aWx0aW4uZnVuYyhmdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuZmFpbCgpfSk7U2suYnVpbHRpbi5maWxlLnByb3RvdHlwZS53cml0ZT1uZXcgU2suYnVpbHRpbi5mdW5jKGZ1bmN0aW9uKGEsYyl7dmFyIGI9U2suZmZpLnJlbWFwVG9KcyhhLm1vZGUpO1NrLmZmaS5yZW1hcFRvSnMoYyk7aWYoXCJ3XCI9PT1ifHxcIndiXCI9PT1ifHxcImFcIj09PWJ8fFwiYWJcIj09PWIpaWYoU2suZmlsZXdyaXRlKXtpZihhLmNsb3NlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZVwiKTsxPT09YS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmZpbGV3cml0ZShhLGMpfWVsc2UgMT09PVxuYS5maWxlbm8/U2sub3V0cHV0KFNrLmZmaS5yZW1hcFRvSnMoYykpOlNrLmFzc2VydHMuZmFpbCgpO3JldHVybiBTay5idWlsdGluLm5vbmUubm9uZSR9KTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLmZpbGVcIixTay5idWlsdGluLmZpbGUpfSxmdW5jdGlvbihtLHEpe1NrLmZmaT1Tay5mZml8fHt9O1NrLmZmaS5yZW1hcFRvUHk9ZnVuY3Rpb24oYSl7dmFyIGM7aWYobnVsbD09PWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYSlyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO2lmKGEub2IkdHlwZXx8YSBpbnN0YW5jZW9mIFNrLm1pc2NldmFsLlN1c3BlbnNpb24pcmV0dXJuIGE7aWYoXCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXt2YXIgYj1bXTtmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGFbY10pKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4ubGlzdChiKX1pZihcIm9iamVjdFwiPT09dHlwZW9mIGEpe2I9XG5bXTtmb3IoYyBpbiBhKWIucHVzaChTay5mZmkucmVtYXBUb1B5KGMpKSxiLnB1c2goU2suZmZpLnJlbWFwVG9QeShhW2NdKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLmRpY3QoYil9aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLmFzc2skKGEpO2lmKFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmJvb2woYSk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBTay5idWlsdGluLm5vbmUubm9uZSQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpcmV0dXJuIG5ldyBTay5idWlsdGluLmZ1bmMoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIHJlbWFwIHR5cGUgXCIrdHlwZW9mIGEpfTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkucmVtYXBUb1B5XCIsU2suZmZpLnJlbWFwVG9QeSk7U2suZmZpLnJlbWFwVG9Kcz1mdW5jdGlvbihhKXt2YXIgYyxcbmI7aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZGljdCl7dmFyIGU9e307YS4kaXRlbXMoKS5mb3JFYWNoKChbYSxjXSk9PntiPVNrLmZmaS5yZW1hcFRvSnMoYSk7ZVtiXT1Tay5mZmkucmVtYXBUb0pzKGMpfSk7cmV0dXJuIGV9aWYoYSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4ubGlzdHx8YSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpe2U9W107Zm9yKGM9MDtjPGEudi5sZW5ndGg7KytjKWUucHVzaChTay5mZmkucmVtYXBUb0pzKGEudltjXSkpO3JldHVybiBlfWlmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmJvb2wpcmV0dXJuIGEudj8hMDohMTtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhfHxcImJvb2xlYW5cIj09PXR5cGVvZiBhfHxcInN0cmluZ1wiPT09dHlwZW9mIGEpcmV0dXJuIGE7XG5pZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5yZW1hcFRvSnNcIixTay5mZmkucmVtYXBUb0pzKTtTay5mZmkuY2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/YTpmdW5jdGlvbigpe3JldHVybiBTay5taXNjZXZhbC5hcHBseShhLHZvaWQgMCx2b2lkIDAsdm9pZCAwLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9fTtTay5leHBvcnRTeW1ib2woXCJTay5mZmkuY2FsbGJhY2tcIixTay5mZmkuY2FsbGJhY2spO1NrLmZmaS5zdGR3cmFwPWZ1bmN0aW9uKGEsYyl7YT1uZXcgYTthLnY9YztyZXR1cm4gYX07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnN0ZHdyYXBcIixTay5mZmkuc3Rkd3JhcCk7U2suZmZpLmJhc2ljd3JhcD1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5pbnRffHxhIGluc3RhbmNlb2YgU2suYnVpbHRpbi5mbG9hdF98fGEgaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gU2suYnVpbHRpbi5hc251bSQoYSk7XG5pZihcIm51bWJlclwiPT09dHlwZW9mIGF8fFwiYm9vbGVhblwiPT09dHlwZW9mIGEpcmV0dXJuIGE7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKXJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSk7U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCB0eXBlIGZvciBiYXNpY3dyYXBcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS5iYXNpY3dyYXBcIixTay5mZmkuYmFzaWN3cmFwKTtTay5mZmkudW53cmFwbz1mdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKXJldHVybiBhLnZ9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmZmaS51bndyYXBvXCIsU2suZmZpLnVud3JhcG8pO1NrLmZmaS51bndyYXBuPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YT9udWxsOmEudn07U2suZXhwb3J0U3ltYm9sKFwiU2suZmZpLnVud3JhcG5cIixTay5mZmkudW53cmFwbil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsZSl7YT12b2lkIDA9PT1hP2E6U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coYSk7Yj12b2lkIDA9PT1cbmI/YjpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhiKTtlPXZvaWQgMD09PWU/ZTpTay5taXNjZXZhbC5hc0luZGV4T3JUaHJvdyhlKTtpZih2b2lkIDA9PT1iJiZ2b2lkIDA9PT1lKWI9YSxhPTAsZT0xO2Vsc2UgaWYodm9pZCAwPT09ZSllPTE7ZWxzZSBpZigwPT09ZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm9cIik7Y29uc3QgZD1bXTtpZihcIm51bWJlclwiPT09dHlwZW9mIGEmJlwibnVtYmVyXCI9PT10eXBlb2YgYiYmXCJudW1iZXJcIj09PXR5cGVvZiBlKWlmKDA8ZSlmb3IodmFyIGY9YTtmPGI7Zis9ZSlkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhmKSk7ZWxzZSBmb3IoZj1hO2Y+YjtmKz1lKWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGYpKTtlbHNle2E9Zj1KU0JJLkJpZ0ludChhKTtlPUpTQkkuQmlnSW50KGUpO2I9SlNCSS5CaWdJbnQoYik7aWYoSlNCSS5ncmVhdGVyVGhhbihlLEpTQkkuX19aRVJPKSlmb3IoO0pTQkkubGVzc1RoYW4oZixcbmIpOylkLnB1c2gobmV3IFNrLmJ1aWx0aW4uaW50XyhjKGYpKSksZj1KU0JJLmFkZChmLGUpO2Vsc2UgZm9yKDtKU0JJLmdyZWF0ZXJUaGFuKGYsYik7KWQucHVzaChuZXcgU2suYnVpbHRpbi5pbnRfKGMoZikpKSxmPUpTQkkuYWRkKGYsZSk7YT1jKGEpO2U9YyhlKTtiPWMoYil9cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhhLGIsZSxkKX1mdW5jdGlvbiBjKGEpe3JldHVybiBKU0JJLmxlc3NUaGFuKGEsSlNCSS5fX01BWF9TQUZFKSYmSlNCSS5ncmVhdGVyVGhhbihhLEpTQkkuX19NSU5fU0FGRSk/SlNCSS50b051bWJlcihhKTphfVNrLmJ1aWx0aW4ucmFuZ2VfPVNrLmFic3RyLmJ1aWxkTmF0aXZlQ2xhc3MoXCJyYW5nZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLnN0YXJ0PWE7dGhpcy5zdG9wPWI7dGhpcy5zdGVwPWM7dGhpcy52PWR9LHNsb3RzOnt0cCRnZXRhdHRyOlNrLmdlbmVyaWMuZ2V0QXR0cix0cCRhc19zZXF1ZW5jZV9vcl9tYXBwaW5nOiEwLFxudHAkZG9jOlwicmFuZ2Uoc3RvcCkgLT4gcmFuZ2Ugb2JqZWN0XFxucmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkgLT4gcmFuZ2Ugb2JqZWN0XFxuXFxuUmV0dXJuIGFuIG9iamVjdCB0aGF0IHByb2R1Y2VzIGEgc2VxdWVuY2Ugb2YgaW50ZWdlcnMgZnJvbSBzdGFydCAoaW5jbHVzaXZlKVxcbnRvIHN0b3AgKGV4Y2x1c2l2ZSkgYnkgc3RlcC4gIHJhbmdlKGksIGopIHByb2R1Y2VzIGksIGkrMSwgaSsyLCAuLi4sIGotMS5cXG5zdGFydCBkZWZhdWx0cyB0byAwLCBhbmQgc3RvcCBpcyBvbWl0dGVkISAgcmFuZ2UoNCkgcHJvZHVjZXMgMCwgMSwgMiwgMy5cXG5UaGVzZSBhcmUgZXhhY3RseSB0aGUgdmFsaWQgaW5kaWNlcyBmb3IgYSBsaXN0IG9mIDQgZWxlbWVudHMuXFxuV2hlbiBzdGVwIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGluY3JlbWVudCAob3IgZGVjcmVtZW50KS5cIix0cCRuZXcoYixjKXtTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmFuZ2VcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyYW5nZVwiLFxuYiwxLDMpO3JldHVybiBhKGJbMF0sYlsxXSxiWzJdKX0sJHIoKXtsZXQgYT1cInJhbmdlKFwiK3RoaXMuc3RhcnQrXCIsIFwiK3RoaXMuc3RvcDsxIT10aGlzLnN0ZXAmJihhKz1cIiwgXCIrdGhpcy5zdGVwKTtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uc3RyKGErXCIpXCIpfSx0cCRyaWNoY29tcGFyZShhLGIpe2lmKFwiRXFcIiE9PWImJlwiTm90RXFcIiE9PWJ8fGEub2IkdHlwZSE9PVNrLmJ1aWx0aW4ucmFuZ2VfKXJldHVybiBTay5idWlsdGluLk5vdEltcGxlbWVudGVkLk5vdEltcGxlbWVudGVkJDthPW5ldyBTay5idWlsdGluLmxpc3QoYS52KTtyZXR1cm4obmV3IFNrLmJ1aWx0aW4ubGlzdCh0aGlzLnYpKS50cCRyaWNoY29tcGFyZShhLGIpfSx0cCRpdGVyKCl7cmV0dXJuIG5ldyBiKHRoaXMpfSxuYiRib29sKCl7cmV0dXJuIDAhPT10aGlzLnYubGVuZ3RofSxzcSRjb250YWlucyhhKXtjb25zdCBiPXRoaXMudjtmb3IobGV0IGM9MDtjPGIubGVuZ3RoO2MrKylpZihTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxcbmJbY10sXCJFcVwiKSlyZXR1cm4hMDtyZXR1cm4hMX0sc3EkbGVuZ3RoKCl7cmV0dXJuIHRoaXMudi5sZW5ndGh9LG1wJHN1YnNjcmlwdChhKXtpZihTay5taXNjZXZhbC5pc0luZGV4KGEpKXthPVNrLm1pc2NldmFsLmFzSW5kZXhTaXplZChhKTswPmEmJihhPXRoaXMudi5sZW5ndGgrYSk7aWYoMD5hfHxhPj10aGlzLnYubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLkluZGV4RXJyb3IoXCJyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZbYV19aWYoYS5jb25zdHJ1Y3Rvcj09PVNrLmJ1aWx0aW4uc2xpY2Upe2NvbnN0IGI9W10sYz10aGlzLnY7YS5zc3NpdGVyJChjLmxlbmd0aCxhPT57Yi5wdXNoKGNbYV0pfSk7bGV0IHtzdGFydDpkLHN0b3A6ZSxzdGVwOmZ9PWEuc2xpY2UkaW5kaWNlcyhjLmxlbmd0aCk7ZD1Tay5taXNjZXZhbC5hc0luZGV4KGNbZF0pfHx0aGlzLnN0YXJ0O2U9U2subWlzY2V2YWwuYXNJbmRleChjW2VdKXx8dGhpcy5zdG9wO2Y9XG5cIm51bWJlclwiPT09dHlwZW9mIHRoaXMuc3RlcD9mKnRoaXMuc3RlcDpKU0JJLm11bHRpcGx5KHRoaXMuc3RlcCxKU0JJLkJpZ0ludChmKSk7cmV0dXJuIG5ldyBTay5idWlsdGluLnJhbmdlXyhkLGUsZixiKX10aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJyYW5nZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3Igc2xpY2VzLCBub3QgXCIrU2suYWJzdHIudHlwZU5hbWUoYSkpO319LGdldHNldHM6e3N0YXJ0OnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGFydCl9fSxzdGVwOnskZ2V0KCl7cmV0dXJuIG5ldyBTay5idWlsdGluLmludF8odGhpcy5zdGVwKX19LHN0b3A6eyRnZXQoKXtyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLnN0b3ApfX19LG1ldGhvZHM6e19fcmV2ZXJzZWRfXzp7JG1ldGgoKXtyZXR1cm4gbmV3IGUodGhpcyl9LCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yLlwifSxcbmNvdW50OnskbWV0aChhKXtsZXQgYj0wO2ZvcihsZXQgYz0wO2M8dGhpcy52Lmxlbmd0aDtjKyspU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2NdLFwiRXFcIikmJmIrKztyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uaW50XyhiKX0sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWVcIn0saW5kZXg6eyRtZXRoKGEpe2ZvcihsZXQgYj0wO2I8dGhpcy52Lmxlbmd0aDtiKyspaWYoU2subWlzY2V2YWwucmljaENvbXBhcmVCb29sKGEsdGhpcy52W2JdLFwiRXFcIikpcmV0dXJuIG5ldyBTay5idWlsdGluLmludF8oYik7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVmFsdWVFcnJvcihTay5taXNjZXZhbC5vYmplY3RSZXByKGEpK1wiaXMgbm90IGluIHJhbmdlXCIpO30sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcInJhbmdlb2JqZWN0LmluZGV4KHZhbHVlLCBbc3RhcnQsIFtzdG9wXV0pIC0+IGludGVnZXIgLS0gcmV0dXJuIGluZGV4IG9mIHZhbHVlLlxcblJhaXNlIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LlwifX0sXG5wcm90bzp7c2skYXNhcnJheSgpe3JldHVybiB0aGlzLnYuc2xpY2UoMCl9fSxmbGFnczp7c2skYWNjZXB0YWJsZV9hc19iYXNlX2NsYXNzOiExfX0pO3ZhciBiPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX2l0ZXJhdG9yXCIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMuJGluZGV4PTA7dGhpcy4kc2VxPWEudn0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4KytdfSxtZXRob2RzOntfX2xlbmd0aF9oaW50X186U2suZ2VuZXJpYy5pdGVyTGVuZ3RoSGludFdpdGhBcnJheU1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KSxlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInJhbmdlX3JldmVyc2VpdGVyYXRvclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRzZXE9YS52O3RoaXMuJGluZGV4PXRoaXMuJHNlcS5sZW5ndGgtMX0saXRlcm5leHQoKXtyZXR1cm4gdGhpcy4kc2VxW3RoaXMuJGluZGV4LS1dfSxcbm1ldGhvZHM6e19fbGVuZ3RoX2hpbnRfXzpTay5nZW5lcmljLml0ZXJSZXZlcnNlTGVuZ3RoSGludE1ldGhvZERlZn0sZmxhZ3M6e3NrJGFjY2VwdGFibGVfYXNfYmFzZV9jbGFzczohMX19KTtTay5idWlsdGluLnJhbmdlPVNrLmJ1aWx0aW4ueHJhbmdlPWZ1bmN0aW9uKGIsYyxlKXtiPWEoYixjLGUpO3JldHVybiBuZXcgU2suYnVpbHRpbi5saXN0KGIudil9fSxmdW5jdGlvbihtLHEpe1NrLmJ1aWx0aW4uZW51bWVyYXRlPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImVudW1lcmF0ZVwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZW51bWVyYXRlKSl0aHJvdyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdlbnVtZXJhdGUnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvclwiKTt0aGlzLiRpdGVyYWJsZT1hO3RoaXMuJGluZGV4PWM7cmV0dXJuIHRoaXN9LGl0ZXJuZXh0KGEpe2NvbnN0IGM9U2subWlzY2V2YWwuY2hhaW4odGhpcy4kaXRlcmFibGUudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwIT09YSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW25ldyBTay5idWlsdGluLmludF8odGhpcy4kaW5kZXgrKyksYV0pfSk7cmV0dXJuIGE/YzpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coYyl9LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYW4gZW51bWVyYXRlIG9iamVjdC5cXG5cXG4gIGl0ZXJhYmxlXFxuICAgIGFuIG9iamVjdCBzdXBwb3J0aW5nIGl0ZXJhdGlvblxcblxcblRoZSBlbnVtZXJhdGUgb2JqZWN0IHlpZWxkcyBwYWlycyBjb250YWluaW5nIGEgY291bnQgKGZyb20gc3RhcnQsIHdoaWNoXFxuZGVmYXVsdHMgdG8gemVybykgYW5kIGEgdmFsdWUgeWllbGRlZCBieSB0aGUgaXRlcmFibGUgYXJndW1lbnQuXFxuXFxuZW51bWVyYXRlIGlzIHVzZWZ1bCBmb3Igb2J0YWluaW5nIGFuIGluZGV4ZWQgbGlzdDpcXG4gICAgKDAsIHNlcVswXSksICgxLCBzZXFbMV0pLCAoMiwgc2VxWzJdKSwgLi4uXCIsdHAkbmV3KGEsYyl7bGV0IFtiLFxuZV09U2suYWJzdHIuY29weUtleXdvcmRzVG9OYW1lZEFyZ3MoXCJlbnVtZXJhdGVcIixbXCJpdGVyYWJsZVwiLFwic3RhcnRcIl0sYSxjLFtuZXcgU2suYnVpbHRpbi5pbnRfKDApXSk7Yj1Tay5hYnN0ci5pdGVyKGIpO2U9U2subWlzY2V2YWwuYXNJbmRleE9yVGhyb3coZSk7aWYodGhpcz09PVNrLmJ1aWx0aW4uZW51bWVyYXRlLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZW51bWVyYXRlKGIsZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmVudW1lcmF0ZS5jYWxsKGEsYixlKTtyZXR1cm4gYX19fSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5lbnVtZXJhdGVcIixTay5idWlsdGluLmVudW1lcmF0ZSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5maWx0ZXJfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcImZpbHRlclwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVyYWJsZT1jfSxpdGVybmV4dChhKXtjb25zdCBjPVxuU2subWlzY2V2YWwuaXRlckZvcih0aGlzLiRpdGVyYWJsZSxhPT5Tay5taXNjZXZhbC5jaGFpbih0aGlzLmNoZWNrJGZpbHRlcihhKSxhPT5hP25ldyBTay5taXNjZXZhbC5CcmVhayhhKTp2b2lkIDApKTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX0sc2xvdHM6e3RwJGRvYzpcIlJldHVybiBhbiBpdGVyYXRvciB5aWVsZGluZyB0aG9zZSBpdGVtcyBvZiBpdGVyYWJsZSBmb3Igd2hpY2ggZnVuY3Rpb24oaXRlbSlcXG5pcyB0cnVlLiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIHRydWUuXCIsdHAkbmV3KGEsYyl7bGV0IFtiLGVdPVNrLmFic3RyLmNvcHlLZXl3b3Jkc1RvTmFtZWRBcmdzKFwiZmlsdGVyXCIsW1wicHJlZGljYXRlXCIsXCJpdGVyYWJsZVwiXSxhLGMsW10pO2I9U2suYnVpbHRpbi5jaGVja05vbmUoYik/bnVsbDpiO2U9U2suYWJzdHIuaXRlcihlKTtpZih0aGlzPT09U2suYnVpbHRpbi5maWx0ZXJfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmlsdGVyXyhiLFxuZSk7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLmZpbHRlcl8uY2FsbChhLGIsZSk7cmV0dXJuIGF9fSxwcm90bzp7Y2hlY2skZmlsdGVyKGEpe2xldCBjO2M9bnVsbD09PXRoaXMuJGZ1bmM/YTpTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkodGhpcy4kZnVuYyxbYV0pO3JldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGI9PlNrLm1pc2NldmFsLmlzVHJ1ZShiKT9hOnZvaWQgMCl9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uZmlsdGVyX1wiLFNrLmJ1aWx0aW4uZmlsdGVyXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5tYXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcIm1hcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhLGMpe3RoaXMuJGZ1bmM9YTt0aGlzLiRpdGVycz1jfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksXG5hPT57aWYodm9pZCAwPT09YSlyZXR1cm4gbmV3IFNrLm1pc2NldmFsLkJyZWFrKCEwKTtjLnB1c2goYSl9KSksYT0+YT92b2lkIDA6U2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KHRoaXMuJGZ1bmMsYykpO3JldHVybiBhP2I6U2subWlzY2V2YWwucmV0cnlPcHRpb25hbFN1c3BlbnNpb25PclRocm93KGIpfSxzbG90czp7dHAkZG9jOlwibWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tXFx4M2UgbWFwIG9iamVjdFxcblxcbk1ha2UgYW4gaXRlcmF0b3IgdGhhdCBjb21wdXRlcyB0aGUgZnVuY3Rpb24gdXNpbmcgYXJndW1lbnRzIGZyb21cXG5lYWNoIG9mIHRoZSBpdGVyYWJsZXMuICBTdG9wcyB3aGVuIHRoZSBzaG9ydGVzdCBpdGVyYWJsZSBpcyBleGhhdXN0ZWQuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ubWFwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJtYXBcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJtYXBcIixhLDIpO2M9YVswXTtjb25zdCBiPVxuW107Zm9yKGxldCBjPTE7YzxhLmxlbmd0aDtjKyspYi5wdXNoKFNrLmFic3RyLml0ZXIoYVtjXSkpO2lmKHRoaXM9PT1Tay5idWlsdGluLm1hcF8ucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5tYXBfKGMsYik7YT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtTay5idWlsdGluLm1hcF8uY2FsbChhLGMsYik7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4ubWFwX1wiLFNrLmJ1aWx0aW4ubWFwXyl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi5yZXZlcnNlZD1Tay5hYnN0ci5idWlsZEl0ZXJhdG9yQ2xhc3MoXCJyZXZlcnNlZFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpZHg9YS5zcSRsZW5ndGgoKS0xO3RoaXMuJHNlcT1hO3JldHVybiB0aGlzfSxpdGVybmV4dChhKXtpZighKDA+dGhpcy4kaWR4KSl7dmFyIGM9U2subWlzY2V2YWwudHJ5Q2F0Y2goKCk9PlNrLmFic3RyLm9iamVjdEdldEl0ZW0odGhpcy4kc2VxLG5ldyBTay5idWlsdGluLmludF8odGhpcy4kaWR4LS0pLFxuYSksYT0+e2lmKGEgaW5zdGFuY2VvZiBTay5idWlsdGluLkluZGV4RXJyb3IpdGhpcy4kaWR4PS0xO2Vsc2UgdGhyb3cgYTt9KTtyZXR1cm4gYT9jOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhjKX19LHNsb3RzOnt0cCRkb2M6XCJSZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gc2VxdWVuY2UuXCIsdHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlJiZTay5hYnN0ci5jaGVja05vS3dhcmdzKFwicmV2ZXJzZWRcIixjKTtTay5hYnN0ci5jaGVja0FyZ3NMZW4oXCJyZXZlcnNlZFwiLGEsMSwxKTthPWFbMF07Yz1Tay5hYnN0ci5sb29rdXBTcGVjaWFsKGEsU2suYnVpbHRpbi5zdHIuJHJldmVyc2VkKTtpZih2b2lkIDAhPT1jKXJldHVybiBTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoYyxbXSk7aWYoIVNrLmJ1aWx0aW4uY2hlY2tTZXF1ZW5jZShhKXx8dm9pZCAwPT09U2suYWJzdHIubG9va3VwU3BlY2lhbChhLFxuU2suYnVpbHRpbi5zdHIuJGxlbikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwiJ1wiK1NrLmFic3RyLnR5cGVOYW1lKGEpK1wiJyBvYmplY3QgaXMgbm90IGEgc2VxdWVuY2VcIik7aWYodGhpcz09PVNrLmJ1aWx0aW4ucmV2ZXJzZWQucHJvdG90eXBlKXJldHVybiBuZXcgU2suYnVpbHRpbi5yZXZlcnNlZChhKTtjPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4ucmV2ZXJzZWQuY2FsbChjLGEpO3JldHVybiBjfX0sbWV0aG9kczp7X19sZW5ndGhfaGludF9fOnskbWV0aDpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLiRpZHg/bmV3IFNrLmJ1aWx0aW4uaW50Xyh0aGlzLiRpZHgpOm5ldyBTay5idWlsdGluLmludF8oMCl9LCRmbGFnczp7Tm9BcmdzOiEwfX19fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbi56aXBfPVNrLmFic3RyLmJ1aWxkSXRlcmF0b3JDbGFzcyhcInppcFwiLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihhKXt0aGlzLiRpdGVycz1hOzA9PT1hLmxlbmd0aCYmXG4odGhpcy50cCRpdGVybmV4dD0oKT0+e30pfSxpdGVybmV4dChhKXtjb25zdCBjPVtdLGI9U2subWlzY2V2YWwuY2hhaW4oU2subWlzY2V2YWwuaXRlckFycmF5KHRoaXMuJGl0ZXJzLGI9PlNrLm1pc2NldmFsLmNoYWluKGIudHAkaXRlcm5leHQoYSksYT0+e2lmKHZvaWQgMD09PWEpcmV0dXJuIG5ldyBTay5taXNjZXZhbC5CcmVhayghMCk7Yy5wdXNoKGEpfSkpLGE9PmE/dm9pZCAwOm5ldyBTay5idWlsdGluLnR1cGxlKGMpKTtyZXR1cm4gYT9iOlNrLm1pc2NldmFsLnJldHJ5T3B0aW9uYWxTdXNwZW5zaW9uT3JUaHJvdyhiKX0sc2xvdHM6e3RwJGRvYzpcInppcChpdGVyMSBbLGl0ZXIyIFsuLi5dXSkgLS1cXHgzZSB6aXAgb2JqZWN0XFxuXFxuUmV0dXJuIGEgemlwIG9iamVjdCB3aG9zZSAuX19uZXh0X18oKSBtZXRob2QgcmV0dXJucyBhIHR1cGxlIHdoZXJlXFxudGhlIGktdGggZWxlbWVudCBjb21lcyBmcm9tIHRoZSBpLXRoIGl0ZXJhYmxlIGFyZ3VtZW50LiAgVGhlIC5fX25leHRfXygpXFxubWV0aG9kIGNvbnRpbnVlcyB1bnRpbCB0aGUgc2hvcnRlc3QgaXRlcmFibGUgaW4gdGhlIGFyZ3VtZW50IHNlcXVlbmNlXFxuaXMgZXhoYXVzdGVkIGFuZCB0aGVuIGl0IHJhaXNlcyBTdG9wSXRlcmF0aW9uLlwiLFxudHAkbmV3KGEsYyl7dGhpcz09PVNrLmJ1aWx0aW4uemlwXy5wcm90b3R5cGUmJlNrLmFic3RyLmNoZWNrTm9Ld2FyZ3MoXCJ6aXBcIixjKTtjPVtdO2ZvcihsZXQgYj0wO2I8YS5sZW5ndGg7YisrKXRyeXtjLnB1c2goU2suYWJzdHIuaXRlcihhW2JdKSl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uVHlwZUVycm9yKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcInppcCBhcmd1bWVudCAjXCIrKGIrMSkrXCIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvblwiKTt0aHJvdyBlO31pZih0aGlzPT09U2suYnVpbHRpbi56aXBfLnByb3RvdHlwZSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uemlwXyhjKTthPW5ldyB0aGlzLmNvbnN0cnVjdG9yO1NrLmJ1aWx0aW4uemlwXy5jYWxsKGEsYyk7cmV0dXJuIGF9fX0pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmJ1aWx0aW4uemlwX1wiLFNrLmJ1aWx0aW4uemlwXyl9LGZ1bmN0aW9uKG0scSl7dmFyIGE9e1RfRU5ETUFSS0VSOjAsVF9OQU1FOjEsXG5UX05VTUJFUjoyLFRfU1RSSU5HOjMsVF9ORVdMSU5FOjQsVF9JTkRFTlQ6NSxUX0RFREVOVDo2LFRfTFBBUjo3LFRfUlBBUjo4LFRfTFNRQjo5LFRfUlNRQjoxMCxUX0NPTE9OOjExLFRfQ09NTUE6MTIsVF9TRU1JOjEzLFRfUExVUzoxNCxUX01JTlVTOjE1LFRfU1RBUjoxNixUX1NMQVNIOjE3LFRfVkJBUjoxOCxUX0FNUEVSOjE5LFRfTEVTUzoyMCxUX0dSRUFURVI6MjEsVF9FUVVBTDoyMixUX0RPVDoyMyxUX1BFUkNFTlQ6MjQsVF9MQlJBQ0U6MjUsVF9SQlJBQ0U6MjYsVF9FUUVRVUFMOjI3LFRfTk9URVFVQUw6MjgsVF9MRVNTRVFVQUw6MjksVF9HUkVBVEVSRVFVQUw6MzAsVF9USUxERTozMSxUX0NJUkNVTUZMRVg6MzIsVF9MRUZUU0hJRlQ6MzMsVF9SSUdIVFNISUZUOjM0LFRfRE9VQkxFU1RBUjozNSxUX1BMVVNFUVVBTDozNixUX01JTkVRVUFMOjM3LFRfU1RBUkVRVUFMOjM4LFRfU0xBU0hFUVVBTDozOSxUX1BFUkNFTlRFUVVBTDo0MCxUX0FNUEVSRVFVQUw6NDEsVF9WQkFSRVFVQUw6NDIsXG5UX0NJUkNVTUZMRVhFUVVBTDo0MyxUX0xFRlRTSElGVEVRVUFMOjQ0LFRfUklHSFRTSElGVEVRVUFMOjQ1LFRfRE9VQkxFU1RBUkVRVUFMOjQ2LFRfRE9VQkxFU0xBU0g6NDcsVF9ET1VCTEVTTEFTSEVRVUFMOjQ4LFRfQVQ6NDksVF9BVEVRVUFMOjUwLFRfUkFSUk9XOjUxLFRfRUxMSVBTSVM6NTIsVF9PUDo1MyxUX0FXQUlUOjU0LFRfQVNZTkM6NTUsVF9FUlJPUlRPS0VOOjU2LFRfTlRfT0ZGU0VUOjI1NixUX05fVE9LRU5TOjYwLFRfQ09NTUVOVDo1NyxUX05MOjU4LFRfRU5DT0RJTkc6NTl9O209e1wiIT1cIjphLlRfTk9URVFVQUwsXCIlXCI6YS5UX1BFUkNFTlQsXCIlPVwiOmEuVF9QRVJDRU5URVFVQUwsXCImXCI6YS5UX0FNUEVSLFwiJj1cIjphLlRfQU1QRVJFUVVBTCxcIihcIjphLlRfTFBBUixcIilcIjphLlRfUlBBUixcIipcIjphLlRfU1RBUixcIioqXCI6YS5UX0RPVUJMRVNUQVIsXCIqKj1cIjphLlRfRE9VQkxFU1RBUkVRVUFMLFwiKj1cIjphLlRfU1RBUkVRVUFMLFwiK1wiOmEuVF9QTFVTLFwiKz1cIjphLlRfUExVU0VRVUFMLFxuXCIsXCI6YS5UX0NPTU1BLFwiLVwiOmEuVF9NSU5VUyxcIi09XCI6YS5UX01JTkVRVUFMLFwiLT5cIjphLlRfUkFSUk9XLFwiLlwiOmEuVF9ET1QsXCIuLi5cIjphLlRfRUxMSVBTSVMsXCIvXCI6YS5UX1NMQVNILFwiLy9cIjphLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjphLlRfRE9VQkxFU0xBU0hFUVVBTCxcIi89XCI6YS5UX1NMQVNIRVFVQUwsXCI6XCI6YS5UX0NPTE9OLFwiO1wiOmEuVF9TRU1JLFwiPFwiOmEuVF9MRVNTLFwiPDxcIjphLlRfTEVGVFNISUZULFwiPDw9XCI6YS5UX0xFRlRTSElGVEVRVUFMLFwiPD1cIjphLlRfTEVTU0VRVUFMLFwiPVwiOmEuVF9FUVVBTCxcIj09XCI6YS5UX0VRRVFVQUwsXCI+XCI6YS5UX0dSRUFURVIsXCI+PVwiOmEuVF9HUkVBVEVSRVFVQUwsXCI+PlwiOmEuVF9SSUdIVFNISUZULFwiPj49XCI6YS5UX1JJR0hUU0hJRlRFUVVBTCxcIkBcIjphLlRfQVQsXCJAPVwiOmEuVF9BVEVRVUFMLFwiW1wiOmEuVF9MU1FCLFwiXVwiOmEuVF9SU1FCLFwiXlwiOmEuVF9DSVJDVU1GTEVYLFwiXj1cIjphLlRfQ0lSQ1VNRkxFWEVRVUFMLFwie1wiOmEuVF9MQlJBQ0UsXG5cInxcIjphLlRfVkJBUixcInw9XCI6YS5UX1ZCQVJFUVVBTCxcIn1cIjphLlRfUkJSQUNFLFwiflwiOmEuVF9USUxERX07dmFyIGM9e307KGZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIGEpY1thW2JdXT1ifSkoKTtbXCJ0b2tfbmFtZVwiLFwiSVNURVJNSU5BTFwiLFwiSVNOT05URVJNSU5BTFwiLFwiSVNFT0ZcIl0uY29uY2F0KE9iamVjdC5rZXlzKGMpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXX0pKTtTay50b2tlbj17fTtTay50b2tlbi50b2tlbnM9YTtTay50b2tlbi50b2tfbmFtZT1jO1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTPW07U2sudG9rZW4uSVNURVJNSU5BTD1mdW5jdGlvbihiKXtyZXR1cm4gYjxhLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU05PTlRFUk1JTkFMPWZ1bmN0aW9uKGIpe3JldHVybiBiPj1hLlRfTlRfT0ZGU0VUfTtTay50b2tlbi5JU0VPRj1mdW5jdGlvbihiKXtyZXR1cm4gYj09YS5UX0VORE1BUktFUn07U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW5cIixTay50b2tlbik7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4udG9rZW5zXCIsXG5Tay50b2tlbi50b2tlbnMpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLnRva19uYW1lXCIsU2sudG9rZW4udG9rX25hbWUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTXCIpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnRva2VuLklTVEVSTUlOQUxcIixTay50b2tlbi5JU1RFUk1JTkFMKTtTay5leHBvcnRTeW1ib2woXCJTay50b2tlbi5JU05PTlRFUk1JTkFMXCIsU2sudG9rZW4uSVNOT05URVJNSU5BTCk7U2suZXhwb3J0U3ltYm9sKFwiU2sudG9rZW4uSVNFT0ZcIixTay50b2tlbi5JU0VPRil9LGZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gYShhLGIsYyxkLGUpe3RoaXMudHlwZT1hO3RoaXMuc3RyaW5nPWI7dGhpcy5zdGFydD1jO3RoaXMuZW5kPWQ7dGhpcy5saW5lPWV9ZnVuY3Rpb24gYyhhKXtyZXR1cm5cIihcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCJ8XCIpK1wiKVwifWZ1bmN0aW9uIGIoYSl7cmV0dXJuIGMuYXBwbHkobnVsbCxhcmd1bWVudHMpK1xuXCI/XCJ9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGYoKXtyZXR1cm5cIiBGUiBSRiBCciBCUiBGciByIEIgUiBiIGJSIGYgcmIgckIgRiBSZiBVIHJGIHUgUkIgYnIgZlIgZnIgcmYgUmJcIi5zcGxpdChcIiBcIil9ZnVuY3Rpb24gbChhKXthP2RlbGV0ZSBTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFU1tcIjw+XCJdOlNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW1wiPD5cIl09U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUw7dD1PYmplY3Qua2V5cyhTay50b2tlbi5FWEFDVF9UT0tFTl9UWVBFUykuc29ydCgpO3Y9Yy5hcHBseSh0aGlzLHQucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYSYmay50ZXN0KGEpP2EucmVwbGFjZShuLFwiXFxcXCQmXCIpOmF9KSk7Qj1jKFwiXFxcXHI/XFxcXG5cIix2KX12YXIgaD1Tay50b2tlbi50b2tlbnM7Y29uc3QgZD1Tay5idWlsdGluLlN5bnRheEVycm9yLGc9U2suYnVpbHRpbi5TeW50YXhFcnJvcjtcbmEucHJvdG90eXBlLmV4YWN0X3R5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlPT1oLlRfT1AmJnRoaXMuc3RyaW5nIGluIFNrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTP1NrLnRva2VuLkVYQUNUX1RPS0VOX1RZUEVTW3RoaXMuc3RyaW5nXTp0aGlzLnR5cGV9O3ZhciBuPS9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxrPVJlZ0V4cChuLnNvdXJjZSk7Y29uc3QgcD1mdW5jdGlvbigpe3ZhciBhPWMoXCJbQS1aXVwiLFwiW2Etel1cIixcIltcXFxcdXsxMEI5OX0tXFxcXHV7MTBCOUN9XFxcXHV7MTEyQTl9XFxcXHV7MTE1REN9LVxcXFx1ezExNUREfVxcXFx1MDM0RlxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTE3QjQtXFxcXHUxN0I1XFxcXHUyMDY1XFxcXHUzMTY0XFxcXHVGRkEwXFxcXHVGRkYwLVxcXFx1RkZGOFxcXFx1e0UwMDAwfVxcXFx1e0UwMDAyfS1cXFxcdXtFMDAxRn1cXFxcdXtFMDA4MH0tXFxcXHV7RTAwRkZ9XFxcXHV7RTAxRjB9LVxcXFx1e0UwRkZGfVxcXFx1ezExMkE5fVxcXFx1MDBEN11cIixcIltcXFxcdTAyQjAtXFxcXHUwMkMxXFxcXHUwMkM2LVxcXFx1MDJEMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAyRUNcXFxcdTAyRUVcXFxcdTAzNzRcXFxcdTAzN0FcXFxcdTA1NTlcXFxcdTA2RTUtXFxcXHUwNkU2XFxcXHUwN0Y0LVxcXFx1MDdGNVxcXFx1MDk3MVxcXFx1MUM3OC1cXFxcdTFDN0RcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxREZELVxcXFx1MURGRlxcXFx1MkUyRlxcXFx1MzBGQ1xcXFx1QTY3RlxcXFx1QTY5Qy1cXFxcdUE2OURcXFxcdUE3MTctXFxcXHVBNzFGXFxcXHVBNzg4XFxcXHVBN0Y4LVxcXFx1QTdGOVxcXFx1QUI1Qy1cXFxcdUFCNUZcXFxcdUZGNzBcXFxcdUZGOUUtXFxcXHVGRjlGXFxcXHV7MTZGOTN9LVxcXFx1ezE2RjlGfVxcXFx1MDJEMC1cXFxcdTAyRDFcXFxcdTA2NDBcXFxcdTA3RkFcXFxcdTBFNDZcXFxcdTBFQzZcXFxcdTE4NDNcXFxcdTFBQTdcXFxcdTFDN0JcXFxcdTMwMDVcXFxcdTMwMzEtXFxcXHUzMDM1XFxcXHUzMDlELVxcXFx1MzA5RVxcXFx1MzBGQy1cXFxcdTMwRkVcXFxcdUEwMTVcXFxcdUE2MENcXFxcdUE5Q0ZcXFxcdUE5RTZcXFxcdUFBNzBcXFxcdUFBRERcXFxcdUFBRjMtXFxcXHVBQUY0XFxcXHVGRjcwXFxcXHV7MTZCNDJ9LVxcXFx1ezE2QjQzfVxcXFx1ezE2RkUwfS1cXFxcdXsxNkZFMX1cXFxcdTAyQjAtXFxcXHUwMkI4XFxcXHUwMkMwLVxcXFx1MDJDMVxcXFx1MDJFMC1cXFxcdTAyRTRcXFxcdTAzN0FcXFxcdTFEMkMtXFxcXHUxRDZBXFxcXHUxRDc4XFxcXHUxRDlCLVxcXFx1MURCRlxcXFx1MjA3MVxcXFx1MjA3RlxcXFx1MjA5MC1cXFxcdTIwOUNcXFxcdTJDN0MtXFxcXHUyQzdEXFxcXHVBNjlDLVxcXFx1QTY5RFxcXFx1QTc3MFxcXFx1QTdGOC1cXFxcdUE3RjlcXFxcdUFCNUMtXFxcXHVBQjVGXFxcXHVGRjlFLVxcXFx1RkY5RlxcXFx1MDJCMlxcXFx1MUQ2MlxcXFx1MURBNFxcXFx1MURBOFxcXFx1MjA3MVxcXFx1MkM3Q1xcXFx1MkUxOC1cXFxcdTJFMTlcXFxcdTJFMkZdXCIsXG5cIltcXFxcdTIxMzUtXFxcXHUyMTM4XFxcXHV7MUVFMDB9LVxcXFx1ezFFRTAzfVxcXFx1ezFFRTA1fS1cXFxcdXsxRUUxRn1cXFxcdXsxRUUyMX0tXFxcXHV7MUVFMjJ9XFxcXHV7MUVFMjR9XFxcXHV7MUVFMjd9XFxcXHV7MUVFMjl9LVxcXFx1ezFFRTMyfVxcXFx1ezFFRTM0fS1cXFxcdXsxRUUzN31cXFxcdXsxRUUzOX1cXFxcdXsxRUUzQn1cXFxcdXsxRUU0Mn1cXFxcdXsxRUU0N31cXFxcdXsxRUU0OX1cXFxcdXsxRUU0Qn1cXFxcdXsxRUU0RH0tXFxcXHV7MUVFNEZ9XFxcXHV7MUVFNTF9LVxcXFx1ezFFRTUyfVxcXFx1ezFFRTU0fVxcXFx1ezFFRTU3fVxcXFx1ezFFRTU5fVxcXFx1ezFFRTVCfVxcXFx1ezFFRTVEfVxcXFx1ezFFRTVGfVxcXFx1ezFFRTYxfS1cXFxcdXsxRUU2Mn1cXFxcdXsxRUU2NH1cXFxcdXsxRUU2N30tXFxcXHV7MUVFNkF9XFxcXHV7MUVFNkN9LVxcXFx1ezFFRTcyfVxcXFx1ezFFRTc0fS1cXFxcdXsxRUU3N31cXFxcdXsxRUU3OX0tXFxcXHV7MUVFN0N9XFxcXHV7MUVFN0V9XFxcXHV7MUVFODB9LVxcXFx1ezFFRTg5fVxcXFx1ezFFRThCfS1cXFxcdXsxRUU5Qn1cXFxcdXsxRUVBMX0tXFxcXHV7MUVFQTN9XFxcXHV7MUVFQTV9LVxcXFx1ezFFRUE5fVxcXFx1ezFFRUFCfS1cXFxcdXsxRUVCQn1cXFxcdTMwMDZcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RjkwMC1cXFxcdUZBNkRcXFxcdUZBNzAtXFxcXHVGQUQ5XFxcXHV7MTcwMDB9LVxcXFx1ezE4N0YxfVxcXFx1ezE4ODAwfS1cXFxcdXsxOEFGMn1cXFxcdXsxQjE3MH0tXFxcXHV7MUIyRkJ9XFxcXHV7MjAwMDB9LVxcXFx1ezJBNkQ2fVxcXFx1ezJBNzAwfS1cXFxcdXsyQjczNH1cXFxcdXsyQjc0MH0tXFxcXHV7MkI4MUR9XFxcXHV7MkI4MjB9LVxcXFx1ezJDRUExfVxcXFx1ezJDRUIwfS1cXFxcdXsyRUJFMH1cXFxcdXsyRjgwMH0tXFxcXHV7MkZBMUR9XFxcXHVBQUMwXFxcXHVBQUMyXFxcXHVGRTIwLVxcXFx1RkUyRlxcXFx1ezEwRDIyfS1cXFxcdXsxMEQyM31cXFxcdXsxMTM1RH1cXFxcdTAwQUFcXFxcdTAwQkFcXFxcdTM0MDAtXFxcXHU0REI1XFxcXHU0RTAwLVxcXFx1OUZFRlxcXFx1RkEwRS1cXFxcdUZBMEZcXFxcdUZBMTFcXFxcdUZBMTMtXFxcXHVGQTE0XFxcXHVGQTFGXFxcXHVGQTIxXFxcXHVGQTIzLVxcXFx1RkEyNFxcXFx1RkEyNy1cXFxcdUZBMjlcXFxcdXsyMDAwMH0tXFxcXHV7MkE2RDZ9XFxcXHV7MkE3MDB9LVxcXFx1ezJCNzM0fVxcXFx1ezJCNzQwfS1cXFxcdXsyQjgxRH1cXFxcdXsyQjgyMH0tXFxcXHV7MkNFQTF9XFxcXHV7MkNFQjB9LVxcXFx1ezJFQkUwfVxcXFx1MTE1Ri1cXFxcdTExNjBcXFxcdTMxNjRcXFxcdUZGQTBcXFxcdTA2NzNcXFxcdTE3QTMtXFxcXHUxN0E0XFxcXHUwRTQwLVxcXFx1MEU0NFxcXFx1MEVDMC1cXFxcdTBFQzRcXFxcdTE5QjUtXFxcXHUxOUI3XFxcXHUxOUJBXFxcXHVBQUI1LVxcXFx1QUFCNlxcXFx1QUFCOVxcXFx1QUFCQi1cXFxcdUFBQkNdXCIsXG5cIltcXFxcdTMwMDdcXFxcdTMwMjEtXFxcXHUzMDI5XFxcXHUzMDM4LVxcXFx1MzAzQVxcXFx1MjE3MC1cXFxcdTIxN0ZcXFxcdTIxNjAtXFxcXHUyMTZGXVwiLFwiX1wiLFwiW1xcXFx1MTg4NS1cXFxcdTE4ODZcXFxcdTIxMThcXFxcdTIxMkVcXFxcdTMwOUItXFxcXHUzMDlDXVwiKSxiPWMoYSxcIltcXFxcdTEwNEEtXFxcXHUxMDRCXFxcXHUxMDJCLVxcXFx1MTAyQ1xcXFx1MTAyRC1cXFxcdTEwMzBcXFxcdTEwMzFcXFxcdTEwMzItXFxcXHUxMDM2XFxcXHUxMDM4XFxcXHUxMDNCLVxcXFx1MTAzQ1xcXFx1MTAzRC1cXFxcdTEwM0VcXFxcdTEwNTYtXFxcXHUxMDU3XFxcXHUxMDU4LVxcXFx1MTA1OVxcXFx1MTA1RS1cXFxcdTEwNjBcXFxcdTEwNjJcXFxcdTEwNjctXFxcXHUxMDY4XFxcXHUxMDcxLVxcXFx1MTA3NFxcXFx1MTA4MlxcXFx1MTA4My1cXFxcdTEwODRcXFxcdTEwODUtXFxcXHUxMDg2XFxcXHUxMDlDXFxcXHUxMDlEXFxcXHUxMDM3XFxcXHUxMDM5LVxcXFx1MTAzQVxcXFx1MTA4Ny1cXFxcdTEwOENcXFxcdTEwOERcXFxcdTEwOEZcXFxcdTEwOUEtXFxcXHUxMDlCXFxcXHVBOUU1XFxcXHVBQTdCXFxcXHVBQTdDXFxcXHVBQTdEXFxcXHVBOUU2XFxcXHVBQTcwXFxcXHUxMDRBLVxcXFx1MTA0Ql1cIixcIltcXFxcdTA5MDNcXFxcdTA5M0JcXFxcdTA5M0UtXFxcXHUwOTQwXFxcXHUwOTQ5LVxcXFx1MDk0Q1xcXFx1MDk0RS1cXFxcdTA5NEZcXFxcdTA5ODItXFxcXHUwOTgzXFxcXHUwOUJFLVxcXFx1MDlDMFxcXFx1MDlDNy1cXFxcdTA5QzhcXFxcdTA5Q0ItXFxcXHUwOUNDXFxcXHUwOUQ3XFxcXHUwQTAzXFxcXHUwQTNFLVxcXFx1MEE0MFxcXFx1MEE4M1xcXFx1MEFCRS1cXFxcdTBBQzBcXFxcdTBBQzlcXFxcdTBBQ0ItXFxcXHUwQUNDXFxcXHUwQjAyLVxcXFx1MEIwM1xcXFx1MEIzRVxcXFx1MEI0MFxcXFx1MEI0Ny1cXFxcdTBCNDhcXFxcdTBCNEItXFxcXHUwQjRDXFxcXHUwQjU3XFxcXHUwQkJFLVxcXFx1MEJCRlxcXFx1MEJDMS1cXFxcdTBCQzJcXFxcdTBCQzYtXFxcXHUwQkM4XFxcXHUwQkNBLVxcXFx1MEJDQ1xcXFx1MEJEN1xcXFx1MEMwMS1cXFxcdTBDMDNcXFxcdTBDNDEtXFxcXHUwQzQ0XFxcXHUwQzgyLVxcXFx1MEM4M1xcXFx1MENCRVxcXFx1MENDMC1cXFxcdTBDQzRcXFxcdTBDQzctXFxcXHUwQ0M4XFxcXHUwQ0NBLVxcXFx1MENDQlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEMDItXFxcXHUwRDAzXFxcXHUwRDNFLVxcXFx1MEQ0MFxcXFx1MEQ0Ni1cXFxcdTBENDhcXFxcdTBENEEtXFxcXHUwRDRDXFxcXHUwRDU3XFxcXHUwRDgyLVxcXFx1MEQ4M1xcXFx1MERDRi1cXFxcdTBERDFcXFxcdTBERDgtXFxcXHUwRERGXFxcXHUwREYyLVxcXFx1MERGM1xcXFx1MEY3RlxcXFx1MTAyQi1cXFxcdTEwMkNcXFxcdTEwMzFcXFxcdTEwMzhcXFxcdTEwM0ItXFxcXHUxMDNDXFxcXHUxMDU2LVxcXFx1MTA1N1xcXFx1MTA2MlxcXFx1MTA2Ny1cXFxcdTEwNjhcXFxcdTEwODMtXFxcXHUxMDg0XFxcXHUxMDlDXFxcXHUxN0I2XFxcXHUxN0JFLVxcXFx1MTdDNVxcXFx1MTdDNy1cXFxcdTE3QzhcXFxcdTE5MjMtXFxcXHUxOTI2XFxcXHUxOTI5LVxcXFx1MTkyQlxcXFx1MTkzMC1cXFxcdTE5MzFcXFxcdTE5MzMtXFxcXHUxOTM4XFxcXHUxQTE5LVxcXFx1MUExQVxcXFx1MUE1NVxcXFx1MUE1N1xcXFx1MUE2MVxcXFx1MUE2My1cXFxcdTFBNjRcXFxcdTFBNkQtXFxcXHUxQTcyXFxcXHUxQjA0XFxcXHUxQjM1XFxcXHUxQjNCXFxcXHUxQjNELVxcXFx1MUI0MVxcXFx1MUI0M1xcXFx1MUI4MlxcXFx1MUJBMVxcXFx1MUJBNi1cXFxcdTFCQTdcXFxcdTFCRTdcXFxcdTFCRUEtXFxcXHUxQkVDXFxcXHUxQkVFXFxcXHUxQzI0LVxcXFx1MUMyQlxcXFx1MUMzNC1cXFxcdTFDMzVcXFxcdTFDRjItXFxcXHUxQ0YzXFxcXHVBODIzLVxcXFx1QTgyNFxcXFx1QTgyN1xcXFx1QTg4MC1cXFxcdUE4ODFcXFxcdUE4QjQtXFxcXHVBOEMzXFxcXHVBOTUyXFxcXHVBOTgzXFxcXHVBOUI0LVxcXFx1QTlCNVxcXFx1QTlCQS1cXFxcdUE5QkJcXFxcdUE5QkQtXFxcXHVBOUJGXFxcXHVBQTJGLVxcXFx1QUEzMFxcXFx1QUEzMy1cXFxcdUFBMzRcXFxcdUFBNERcXFxcdUFBRUJcXFxcdUFBRUUtXFxcXHVBQUVGXFxcXHVBQUY1XFxcXHVBQkUzLVxcXFx1QUJFNFxcXFx1QUJFNi1cXFxcdUFCRTdcXFxcdUFCRTktXFxcXHVBQkVBXFxcXHV7MTEwMDB9XFxcXHV7MTEwMDJ9XFxcXHV7MTEwODJ9XFxcXHV7MTEwQjB9LVxcXFx1ezExMEIyfVxcXFx1ezExMEI3fS1cXFxcdXsxMTBCOH1cXFxcdXsxMTEyQ31cXFxcdXsxMTE0NX0tXFxcXHV7MTExNDZ9XFxcXHV7MTExODJ9XFxcXHV7MTExQjN9LVxcXFx1ezExMUI1fVxcXFx1ezExMUJGfVxcXFx1ezExMjJDfS1cXFxcdXsxMTIyRX1cXFxcdXsxMTIzMn0tXFxcXHV7MTEyMzN9XFxcXHV7MTEyRTB9LVxcXFx1ezExMkUyfVxcXFx1ezExMzAyfS1cXFxcdXsxMTMwM31cXFxcdXsxMTMzRX0tXFxcXHV7MTEzM0Z9XFxcXHV7MTEzNDF9LVxcXFx1ezExMzQ0fVxcXFx1ezExMzQ3fS1cXFxcdXsxMTM0OH1cXFxcdXsxMTM0Qn0tXFxcXHV7MTEzNEN9XFxcXHV7MTEzNTd9XFxcXHV7MTEzNjJ9LVxcXFx1ezExMzYzfVxcXFx1ezExNDM1fS1cXFxcdXsxMTQzN31cXFxcdXsxMTQ0MH0tXFxcXHV7MTE0NDF9XFxcXHV7MTE0NDV9XFxcXHV7MTE0QjB9LVxcXFx1ezExNEIyfVxcXFx1ezExNEI5fVxcXFx1ezExNEJCfS1cXFxcdXsxMTRCRX1cXFxcdXsxMTRDMX1cXFxcdXsxMTVBRn0tXFxcXHV7MTE1QjF9XFxcXHV7MTE1Qjh9LVxcXFx1ezExNUJCfVxcXFx1ezExNUJFfVxcXFx1ezExNjMwfS1cXFxcdXsxMTYzMn1cXFxcdXsxMTYzQn0tXFxcXHV7MTE2M0N9XFxcXHV7MTE2M0V9XFxcXHV7MTE2QUN9XFxcXHV7MTE2QUV9LVxcXFx1ezExNkFGfVxcXFx1ezExNzIwfS1cXFxcdXsxMTcyMX1cXFxcdXsxMTcyNn1cXFxcdXsxMTgyQ30tXFxcXHV7MTE4MkV9XFxcXHV7MTE4Mzh9XFxcXHV7MTFBMzl9XFxcXHV7MTFBNTd9LVxcXFx1ezExQTU4fVxcXFx1ezExQTk3fVxcXFx1ezExQzJGfVxcXFx1ezExQzNFfVxcXFx1ezExQ0E5fVxcXFx1ezExQ0IxfVxcXFx1ezExQ0I0fVxcXFx1ezExRDhBfS1cXFxcdXsxMUQ4RX1cXFxcdXsxMUQ5M30tXFxcXHV7MTFEOTR9XFxcXHV7MTFEOTZ9XFxcXHV7MTFFRjV9LVxcXFx1ezExRUY2fVxcXFx1ezE2RjUxfS1cXFxcdXsxNkY3RX1cXFxcdTBGM0UtXFxcXHUwRjNGXFxcXHUxMDg3LVxcXFx1MTA4Q1xcXFx1MTA4RlxcXFx1MTA5QS1cXFxcdTEwOUJcXFxcdTFCNDRcXFxcdTFCQUFcXFxcdTFDRTFcXFxcdTFDRjdcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHVBOTUzXFxcXHVBOUMwXFxcXHVBQTdCXFxcXHVBQTdEXFxcXHVBQkVDXFxcXHV7MTExQzB9XFxcXHV7MTEyMzV9XFxcXHV7MTEzNER9XFxcXHV7MTE2QjZ9XFxcXHV7MUQxNkR9LVxcXFx1ezFEMTcyfVxcXFx1MDlCRVxcXFx1MDlEN1xcXFx1MEIzRVxcXFx1MEI1N1xcXFx1MEJCRVxcXFx1MEJEN1xcXFx1MENDMlxcXFx1MENENS1cXFxcdTBDRDZcXFxcdTBEM0VcXFxcdTBENTdcXFxcdTBEQ0ZcXFxcdTBEREZcXFxcdTMwMkUtXFxcXHUzMDJGXFxcXHV7MTEzM0V9XFxcXHV7MTEzNTd9XFxcXHV7MTE0QjB9XFxcXHV7MTE0QkR9XFxcXHV7MTE1QUZ9XFxcXHV7MUQxNjV9XFxcXHV7MUQxNkV9LVxcXFx1ezFEMTcyfV1cIixcblwiW1xcXFx1ezFEN0NFfS1cXFxcdXsxRDdGRn1cXFxcdUZGMTAtXFxcXHVGRjE5XVwiLFwiXFxcXHUyMDQwXCIsXCJbXFxcXHUwMEI3XFxcXHUwMzg3XFxcXHUxMzY5LVxcXFx1MTM3MVxcXFx1MTlEQV1cIik7aWYoITE9PT1SZWdFeHAoKS51bmljb2RlKXJldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIsXCJ1XCIpO2E9YyhcIltBLVpdXCIsXCJbYS16XVwiLFwiX1wiKTtiPWMoYSxcIlswLTldXCIpO3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK2ErXCIrXCIrYitcIiokXCIpfSgpOyhmdW5jdGlvbihhKXtyZXR1cm4gYy5hcHBseShudWxsLGFyZ3VtZW50cykrXCIqXCJ9KShcIlxcXFxcXFxcXFxcXHI/XFxcXG5bIFxcXFxmXFxcXHRdKlwiKTtiKFwiI1teXFxcXHJcXFxcbl0qXCIpO209YyhcIlswLTldKD86Xz9bMC05XSkqXFxcXC4oPzpbMC05XSg/Ol8/WzAtOV0pKik/XCIsXCJcXFxcLlswLTldKD86Xz9bMC05XSkqXCIpK2IoXCJbZUVdWy0rXT9bMC05XSg/Ol8/WzAtOV0pKlwiKTt2YXIgdT1jKG0sXCJbMC05XSg/Ol8/WzAtOV0pKltlRV1bLStdP1swLTldKD86Xz9bMC05XSkqXCIpLEE9YyhcIlswLTldKD86Xz9bMC05XSkqW2pKXVwiLFxudStcIltqSl1cIik7bT1jLmFwcGx5KG51bGwsZigpKTtxPWMobStcIicnJ1wiLG0rJ1wiXCJcIicpO2MobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKidcIixtKydcIlteXFxcXG5cIlxcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuXCJcXFxcXFxcXF0qKSpcIicpO3ZhciB0LHYsQjtsKCEwKTtTay50b2tlbi5zZXR1cFRva2Vucz1sO3ZhciBEPWMobStcIidbXlxcXFxuJ1xcXFxcXFxcXSooPzpcXFxcXFxcXC5bXlxcXFxuJ1xcXFxcXFxcXSopKlwiK2MoXCInXCIsXCJcXFxcXFxcXFxcXFxyP1xcXFxuXCIpLG0rJ1wiW15cXFxcblwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXFxcXG5cIlxcXFxcXFxcXSopKicrYygnXCInLFwiXFxcXFxcXFxcXFxccj9cXFxcblwiKSksRT1jKFwiXFxcXFxcXFxcXFxccj9cXFxcbnwkXCIsXCIjW15cXFxcclxcXFxuXSpcIixxKSxGPXt9O209ZigpO2ZvcihsZXQgYSBvZiBtKUZbYStcIidcIl09XCJeW14nXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteJ1xcXFxcXFxcXSopKidcIixGW2ErJ1wiJ109J15bXlwiXFxcXFxcXFxdKig/OlxcXFxcXFxcLlteXCJcXFxcXFxcXF0qKSpcIicsRlthK1wiJycnXCJdPVwiXlteJ1xcXFxcXFxcXSooPzooPzpcXFxcXFxcXC58Jyg/IScnKSlbXidcXFxcXFxcXF0qKSonJydcIixcbkZbYSsnXCJcIlwiJ109J15bXlwiXFxcXFxcXFxdKig/Oig/OlxcXFxcXFxcLnxcIig/IVwiXCIpKVteXCJcXFxcXFxcXF0qKSpcIlwiXCInO2xldCBNPVtdLFY9W107Zm9yKGxldCBhIG9mIG0pTS5wdXNoKGErJ1wiJyksTS5wdXNoKGErXCInXCIpLFYucHVzaChhKydcIlwiXCInKSxWLnB1c2goYStcIicnJ1wiKTtTay5fdG9rZW5pemU9ZnVuY3Rpb24oYixmLGssbil7dmFyIGw9U2suX19mdXR1cmVfXy5weXRob24zP1wiXCI6XCIoPzpMPylcIjtsPWMoXCIwW3hYXSg/Ol8/WzAtOWEtZkEtRl0pK1wiK2wsXCIwW2JCXSg/Ol8/WzAxXSkrXCIrbCxTay5fX2Z1dHVyZV9fLnNpbGVudF9vY3RhbF9saXRlcmFsP1wiMChbb09dPykoPzpfP1swLTddKStcIitsOlwiMChbb09dKSg/Ol8/WzAtN10pK1wiK2wsXCIoPzowKD86Xz8wKSp8WzEtOV0oPzpfP1swLTldKSopXCIrbCk7bD1jKEEsdSxsKTtsPVwiWyBcXFxcZlxcXFx0XSpcIitjKEUsbCxCLEQsXCJcXFxcdytcIik7bD1uZXcgUmVnRXhwKGwpO3ZhciBtPTAsdD0wLHE9MCx2PVwiXCIseT0wLEc9bnVsbCxMPVswXSxILFQ9dm9pZCAwLFxuWD12b2lkIDAsSSxSO3ZvaWQgMCE9PWsmJihcInV0Zi04LXNpZ1wiPT1rJiYoaz1cInV0Zi04XCIpLG4obmV3IGEoaC5UX0VOQ09ESU5HLGssWzAsMF0sWzAsMF0sXCJcIikpKTtmb3IodmFyIEM9az1cIlwiOzspe3RyeXtrPUMsQz1mKCl9Y2F0Y2goTyl7Qz1cIlwifW0rPTE7dmFyIHc9MCxOPUMubGVuZ3RoO2lmKHYpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RyaW5nXCIsYixYWzBdLFhbMV0pO1QubGFzdEluZGV4PTA7dmFyIHI9VC5leGVjKEMpO2lmKHIpdz1JPXJbMF0ubGVuZ3RoLG4obmV3IGEoaC5UX1NUUklORyx2K0Muc3Vic3RyaW5nKDAsSSksWCxbbSxJXSxHK0MpKSx2PVwiXCIseT0wLEc9bnVsbDtlbHNle3kmJlwiXFxcXFxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMikmJlwiXFxcXFxcclxcblwiIT09Qy5zdWJzdHJpbmcoQy5sZW5ndGgtMyk/KG4obmV3IGEoaC5UX0VSUk9SVE9LRU4sditDLFgsW20sQy5sZW5ndGhdLEcpKSx2PVwiXCIsRz1udWxsKToodis9QyxHKz1DKTtjb250aW51ZX19ZWxzZSBpZigwIT1cbnR8fHEpe2lmKCFDKXRocm93IG5ldyBkKFwiRU9GIGluIG11bHRpLWxpbmUgc3RhdGVtZW50XCIsYixtLDApO3E9MH1lbHNle2lmKCFDKWJyZWFrO2ZvcihIPTA7dzxOOyl7aWYoXCIgXCI9PUNbd10pSCs9MTtlbHNlIGlmKFwiXFx0XCI9PUNbd10pSD04Kk1hdGguZmxvb3IoSC84KzEpO2Vsc2UgaWYoXCJcXGZcIj09Q1t3XSlIPTA7ZWxzZSBicmVhazt3Kz0xfWlmKHc9PU4pYnJlYWs7aWYoZShcIiNcXHJcXG5cIixDW3ddKSl7aWYoXCIjXCI9PUNbd10pe0g9Qy5zdWJzdHJpbmcodyk7Zm9yKE49SC5sZW5ndGg7MDxOJiYtMSE9PVwiXFxyXFxuXCIuaW5kZXhPZihILmNoYXJBdChOLTEpKTstLU4pO049SC5zdWJzdHJpbmcoMCxOKTtuKG5ldyBhKGguVF9DT01NRU5ULE4sW20sd10sW20sdytOLmxlbmd0aF0sQykpO3crPU4ubGVuZ3RofW4obmV3IGEoaC5UX05MLEMuc3Vic3RyaW5nKHcpLFttLHddLFttLEMubGVuZ3RoXSxDKSk7Y29udGludWV9SD5MW0wubGVuZ3RoLTFdJiYoTC5wdXNoKEgpLG4obmV3IGEoaC5UX0lOREVOVCxcbkMuc3Vic3RyaW5nKHcpLFttLDBdLFttLHddLEMpKSk7Zm9yKDtIPExbTC5sZW5ndGgtMV07KXtpZighZShMLEgpKXRocm93IG5ldyBnKFwidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsXCIsYixtLHcpO0w9TC5zbGljZSgwLC0xKTtuKG5ldyBhKGguVF9ERURFTlQsXCJcIixbbSx3XSxbbSx3XSxDKSl9fWZvcig7dzxOOyl7Zm9yKEg9Qy5jaGFyQXQodyk7XCIgXCI9PT1IfHxcIlxcZlwiPT09SHx8XCJcXHRcIj09PUg7KXcrPTEsSD1DLmNoYXJBdCh3KTtpZihSPWwuZXhlYyhDLnN1YnN0cmluZyh3KSkpe2lmKEg9dyxJPUgrUlsxXS5sZW5ndGgsUj1bbSxIXSxyPVttLEldLHc9SSxIIT1JKXtJPUMuc3Vic3RyaW5nKEgsSSk7dmFyIHo9Q1tIXTtpZihlKFwiMDEyMzQ1Njc4OVwiLHopfHxcIi5cIj09eiYmXCIuXCIhPUkmJlwiLi4uXCIhPUkpbihuZXcgYShoLlRfTlVNQkVSLEksUixyLEMpKTtlbHNlIGlmKGUoXCJcXHJcXG5cIix6KSkwPHQ/bihuZXcgYShoLlRfTkwsSSxSLHIsQykpOlxubihuZXcgYShoLlRfTkVXTElORSxJLFIscixDKSk7ZWxzZSBpZihcIiNcIj09eiluKG5ldyBhKGguVF9DT01NRU5ULEksUixyLEMpKTtlbHNlIGlmKGUoVixJKSlpZihUPVJlZ0V4cChGW0ldKSxyPVQuZXhlYyhDLnN1YnN0cmluZyh3KSkpdz1yWzBdLmxlbmd0aCt3LEk9Qy5zdWJzdHJpbmcoSCx3KSxuKG5ldyBhKGguVF9TVFJJTkcsSSxSLFttLHddLEMpKTtlbHNle1g9W20sSF07dj1DLnN1YnN0cmluZyhIKTtHPUM7YnJlYWt9ZWxzZSBpZihlKE0seil8fGUoTSxJLnN1YnN0cmluZygwLDIpKXx8ZShNLEkuc3Vic3RyaW5nKDAsMykpKWlmKFwiXFxuXCI9PUlbSS5sZW5ndGgtMV0pe1g9W20sSF07VD1SZWdFeHAoRlt6XXx8RltJWzFdXXx8RltJWzJdXSk7dj1DLnN1YnN0cmluZyhIKTt5PTE7Rz1DO2JyZWFrfWVsc2UgbihuZXcgYShoLlRfU1RSSU5HLEksUixyLEMpKTtlbHNlIEg9ei5ub3JtYWxpemUoXCJORktDXCIpLHAudGVzdChIKT9uKG5ldyBhKGguVF9OQU1FLEksUixyLEMpKTpcIlxcXFxcIj09XG56P3E9MTooZShcIihbe1wiLHopP3QrPTE6ZShcIildfVwiLHopJiYtLXQsbihuZXcgYShoLlRfT1AsSSxSLHIsQykpKX19ZWxzZSBuKG5ldyBhKGguVF9FUlJPUlRPS0VOLENbd10sW20sd10sW20sdysxXSxDKSksdys9MX19ayYmIWUoXCJcXHJcXG5cIixrW2subGVuZ3RoLTFdKSYmbihuZXcgYShoLlRfTkVXTElORSxcIlwiLFttLTEsay5sZW5ndGhdLFttLTEsay5sZW5ndGgrMV0sXCJcIikpO2Zvcih2YXIgWiBpbiBMLnNsaWNlKDEpKW4obmV3IGEoaC5UX0RFREVOVCxcIlwiLFttLDBdLFttLDBdLFwiXCIpKTtuKG5ldyBhKGguVF9FTkRNQVJLRVIsXCJcIixbbSwwXSxbbSwwXSxcIlwiKSl9O1NrLmV4cG9ydFN5bWJvbChcIlNrLl90b2tlbml6ZVwiLFNrLl90b2tlbml6ZSl9LGZ1bmN0aW9uKG0scSl7U2suT3BNYXA9e1wiKFwiOlNrLnRva2VuLnRva2Vucy5UX0xQQVIsXCIpXCI6U2sudG9rZW4udG9rZW5zLlRfUlBBUixcIltcIjpTay50b2tlbi50b2tlbnMuVF9MU1FCLFwiXVwiOlNrLnRva2VuLnRva2Vucy5UX1JTUUIsXCI6XCI6U2sudG9rZW4udG9rZW5zLlRfQ09MT04sXG5cIixcIjpTay50b2tlbi50b2tlbnMuVF9DT01NQSxcIjtcIjpTay50b2tlbi50b2tlbnMuVF9TRU1JLFwiK1wiOlNrLnRva2VuLnRva2Vucy5UX1BMVVMsXCItXCI6U2sudG9rZW4udG9rZW5zLlRfTUlOVVMsXCIqXCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUixcIi9cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSCxcInxcIjpTay50b2tlbi50b2tlbnMuVF9WQkFSLFwiJlwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSLFwiPFwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1MsXCI+XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUixcIj1cIjpTay50b2tlbi50b2tlbnMuVF9FUVVBTCxcIi5cIjpTay50b2tlbi50b2tlbnMuVF9ET1QsXCIlXCI6U2sudG9rZW4udG9rZW5zLlRfUEVSQ0VOVCxcImBcIjpTay50b2tlbi50b2tlbnMuVF9CQUNLUVVPVEUsXCJ7XCI6U2sudG9rZW4udG9rZW5zLlRfTEJSQUNFLFwifVwiOlNrLnRva2VuLnRva2Vucy5UX1JCUkFDRSxcIkBcIjpTay50b2tlbi50b2tlbnMuVF9BVCxcIkA9XCI6U2sudG9rZW4udG9rZW5zLlRfQVRFUVVBTCxcblwiPT1cIjpTay50b2tlbi50b2tlbnMuVF9FUUVRVUFMLFwiIT1cIjpTay50b2tlbi50b2tlbnMuVF9OT1RFUVVBTCxcIjw+XCI6U2sudG9rZW4udG9rZW5zLlRfTk9URVFVQUwsXCI8PVwiOlNrLnRva2VuLnRva2Vucy5UX0xFU1NFUVVBTCxcIj49XCI6U2sudG9rZW4udG9rZW5zLlRfR1JFQVRFUkVRVUFMLFwiflwiOlNrLnRva2VuLnRva2Vucy5UX1RJTERFLFwiXlwiOlNrLnRva2VuLnRva2Vucy5UX0NJUkNVTUZMRVgsXCI8PFwiOlNrLnRva2VuLnRva2Vucy5UX0xFRlRTSElGVCxcIj4+XCI6U2sudG9rZW4udG9rZW5zLlRfUklHSFRTSElGVCxcIioqXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU1RBUixcIis9XCI6U2sudG9rZW4udG9rZW5zLlRfUExVU0VRVUFMLFwiLT1cIjpTay50b2tlbi50b2tlbnMuVF9NSU5FUVVBTCxcIio9XCI6U2sudG9rZW4udG9rZW5zLlRfU1RBUkVRVUFMLFwiLz1cIjpTay50b2tlbi50b2tlbnMuVF9TTEFTSEVRVUFMLFwiJT1cIjpTay50b2tlbi50b2tlbnMuVF9QRVJDRU5URVFVQUwsXCImPVwiOlNrLnRva2VuLnRva2Vucy5UX0FNUEVSRVFVQUwsXG5cInw9XCI6U2sudG9rZW4udG9rZW5zLlRfVkJBUkVRVUFMLFwiXj1cIjpTay50b2tlbi50b2tlbnMuVF9DSVJDVU1GTEVYRVFVQUwsXCI8PD1cIjpTay50b2tlbi50b2tlbnMuVF9MRUZUU0hJRlRFUVVBTCxcIj4+PVwiOlNrLnRva2VuLnRva2Vucy5UX1JJR0hUU0hJRlRFUVVBTCxcIioqPVwiOlNrLnRva2VuLnRva2Vucy5UX0RPVUJMRVNUQVJFUVVBTCxcIi8vXCI6U2sudG9rZW4udG9rZW5zLlRfRE9VQkxFU0xBU0gsXCIvLz1cIjpTay50b2tlbi50b2tlbnMuVF9ET1VCTEVTTEFTSEVRVUFMLFwiLT5cIjpTay50b2tlbi50b2tlbnMuVF9SQVJST1csXCIuLi5cIjpTay50b2tlbi50b2tlbnMuVF9FTExJUFNJU307U2suUGFyc2VUYWJsZXM9e3N5bTp7YW5kX2V4cHI6MjU3LGFuZF90ZXN0OjI1OCxhbm5hc3NpZ246MjU5LGFyZ2xpc3Q6MjYwLGFyZ3VtZW50OjI2MSxhcml0aF9leHByOjI2Mixhc3NlcnRfc3RtdDoyNjMsYXN5bmNfZnVuY2RlZjoyNjQsYXN5bmNfc3RtdDoyNjUsYXRvbToyNjYsYXRvbV9leHByOjI2NyxcbmF1Z2Fzc2lnbjoyNjgsYnJlYWtfc3RtdDoyNjksY2xhc3NkZWY6MjcwLGNvbXBfZm9yOjI3MSxjb21wX2lmOjI3Mixjb21wX2l0ZXI6MjczLGNvbXBfb3A6Mjc0LGNvbXBhcmlzb246Mjc1LGNvbXBvdW5kX3N0bXQ6Mjc2LGNvbnRpbnVlX3N0bXQ6Mjc3LGRlYnVnZ2VyX3N0bXQ6Mjc4LGRlY29yYXRlZDoyNzksZGVjb3JhdG9yOjI4MCxkZWNvcmF0b3JzOjI4MSxkZWxfc3RtdDoyODIsZGljdG9yc2V0bWFrZXI6MjgzLGRvdHRlZF9hc19uYW1lOjI4NCxkb3R0ZWRfYXNfbmFtZXM6Mjg1LGRvdHRlZF9uYW1lOjI4NixlbmNvZGluZ19kZWNsOjI4NyxldmFsX2lucHV0OjI4OCxleGNlcHRfY2xhdXNlOjI4OSxleHByOjI5MCxleHByX3N0bXQ6MjkxLGV4cHJsaXN0OjI5MixmYWN0b3I6MjkzLGZpbGVfaW5wdXQ6Mjk0LGZsb3dfc3RtdDoyOTUsZm9yX3N0bXQ6Mjk2LGZ1bmNkZWY6Mjk3LGdsb2JhbF9zdG10OjI5OCxpZl9zdG10OjI5OSxpbXBvcnRfYXNfbmFtZTozMDAsaW1wb3J0X2FzX25hbWVzOjMwMSxcbmltcG9ydF9mcm9tOjMwMixpbXBvcnRfbmFtZTozMDMsaW1wb3J0X3N0bXQ6MzA0LGxhbWJkZWY6MzA1LGxhbWJkZWZfbm9jb25kOjMwNixub25sb2NhbF9zdG10OjMwNyxub3RfdGVzdDozMDgsb3JfdGVzdDozMDkscGFyYW1ldGVyczozMTAscGFzc19zdG10OjMxMSxwb3dlcjozMTIscHJpbnRfc3RtdDozMTMscmFpc2Vfc3RtdDozMTQscmV0dXJuX3N0bXQ6MzE1LHNoaWZ0X2V4cHI6MzE2LHNpbXBsZV9zdG10OjMxNyxzaW5nbGVfaW5wdXQ6MjU2LHNsaWNlb3A6MzE4LHNtYWxsX3N0bXQ6MzE5LHN0YXJfZXhwcjozMjAsc3RtdDozMjEsc3Vic2NyaXB0OjMyMixzdWJzY3JpcHRsaXN0OjMyMyxzdWl0ZTozMjQsdGVybTozMjUsdGVzdDozMjYsdGVzdF9ub2NvbmQ6MzI3LHRlc3RsaXN0OjMyOCx0ZXN0bGlzdF9jb21wOjMyOSx0ZXN0bGlzdF9zdGFyX2V4cHI6MzMwLHRmcGRlZjozMzEsdHJhaWxlcjozMzIsdHJ5X3N0bXQ6MzMzLHR5cGVkYXJnc2xpc3Q6MzM0LHZhcmFyZ3NsaXN0OjMzNSxcbnZmcGRlZjozMzYsd2hpbGVfc3RtdDozMzcsd2l0aF9pdGVtOjMzOCx3aXRoX3N0bXQ6MzM5LHhvcl9leHByOjM0MCx5aWVsZF9hcmc6MzQxLHlpZWxkX2V4cHI6MzQyLHlpZWxkX3N0bXQ6MzQzfSxudW1iZXIyc3ltYm9sOnsyNTY6XCJzaW5nbGVfaW5wdXRcIiwyNTc6XCJhbmRfZXhwclwiLDI1ODpcImFuZF90ZXN0XCIsMjU5OlwiYW5uYXNzaWduXCIsMjYwOlwiYXJnbGlzdFwiLDI2MTpcImFyZ3VtZW50XCIsMjYyOlwiYXJpdGhfZXhwclwiLDI2MzpcImFzc2VydF9zdG10XCIsMjY0OlwiYXN5bmNfZnVuY2RlZlwiLDI2NTpcImFzeW5jX3N0bXRcIiwyNjY6XCJhdG9tXCIsMjY3OlwiYXRvbV9leHByXCIsMjY4OlwiYXVnYXNzaWduXCIsMjY5OlwiYnJlYWtfc3RtdFwiLDI3MDpcImNsYXNzZGVmXCIsMjcxOlwiY29tcF9mb3JcIiwyNzI6XCJjb21wX2lmXCIsMjczOlwiY29tcF9pdGVyXCIsMjc0OlwiY29tcF9vcFwiLDI3NTpcImNvbXBhcmlzb25cIiwyNzY6XCJjb21wb3VuZF9zdG10XCIsMjc3OlwiY29udGludWVfc3RtdFwiLDI3ODpcImRlYnVnZ2VyX3N0bXRcIixcbjI3OTpcImRlY29yYXRlZFwiLDI4MDpcImRlY29yYXRvclwiLDI4MTpcImRlY29yYXRvcnNcIiwyODI6XCJkZWxfc3RtdFwiLDI4MzpcImRpY3RvcnNldG1ha2VyXCIsMjg0OlwiZG90dGVkX2FzX25hbWVcIiwyODU6XCJkb3R0ZWRfYXNfbmFtZXNcIiwyODY6XCJkb3R0ZWRfbmFtZVwiLDI4NzpcImVuY29kaW5nX2RlY2xcIiwyODg6XCJldmFsX2lucHV0XCIsMjg5OlwiZXhjZXB0X2NsYXVzZVwiLDI5MDpcImV4cHJcIiwyOTE6XCJleHByX3N0bXRcIiwyOTI6XCJleHBybGlzdFwiLDI5MzpcImZhY3RvclwiLDI5NDpcImZpbGVfaW5wdXRcIiwyOTU6XCJmbG93X3N0bXRcIiwyOTY6XCJmb3Jfc3RtdFwiLDI5NzpcImZ1bmNkZWZcIiwyOTg6XCJnbG9iYWxfc3RtdFwiLDI5OTpcImlmX3N0bXRcIiwzMDA6XCJpbXBvcnRfYXNfbmFtZVwiLDMwMTpcImltcG9ydF9hc19uYW1lc1wiLDMwMjpcImltcG9ydF9mcm9tXCIsMzAzOlwiaW1wb3J0X25hbWVcIiwzMDQ6XCJpbXBvcnRfc3RtdFwiLDMwNTpcImxhbWJkZWZcIiwzMDY6XCJsYW1iZGVmX25vY29uZFwiLDMwNzpcIm5vbmxvY2FsX3N0bXRcIixcbjMwODpcIm5vdF90ZXN0XCIsMzA5Olwib3JfdGVzdFwiLDMxMDpcInBhcmFtZXRlcnNcIiwzMTE6XCJwYXNzX3N0bXRcIiwzMTI6XCJwb3dlclwiLDMxMzpcInByaW50X3N0bXRcIiwzMTQ6XCJyYWlzZV9zdG10XCIsMzE1OlwicmV0dXJuX3N0bXRcIiwzMTY6XCJzaGlmdF9leHByXCIsMzE3Olwic2ltcGxlX3N0bXRcIiwzMTg6XCJzbGljZW9wXCIsMzE5Olwic21hbGxfc3RtdFwiLDMyMDpcInN0YXJfZXhwclwiLDMyMTpcInN0bXRcIiwzMjI6XCJzdWJzY3JpcHRcIiwzMjM6XCJzdWJzY3JpcHRsaXN0XCIsMzI0Olwic3VpdGVcIiwzMjU6XCJ0ZXJtXCIsMzI2OlwidGVzdFwiLDMyNzpcInRlc3Rfbm9jb25kXCIsMzI4OlwidGVzdGxpc3RcIiwzMjk6XCJ0ZXN0bGlzdF9jb21wXCIsMzMwOlwidGVzdGxpc3Rfc3Rhcl9leHByXCIsMzMxOlwidGZwZGVmXCIsMzMyOlwidHJhaWxlclwiLDMzMzpcInRyeV9zdG10XCIsMzM0OlwidHlwZWRhcmdzbGlzdFwiLDMzNTpcInZhcmFyZ3NsaXN0XCIsMzM2OlwidmZwZGVmXCIsMzM3Olwid2hpbGVfc3RtdFwiLDMzODpcIndpdGhfaXRlbVwiLDMzOTpcIndpdGhfc3RtdFwiLFxuMzQwOlwieG9yX2V4cHJcIiwzNDE6XCJ5aWVsZF9hcmdcIiwzNDI6XCJ5aWVsZF9leHByXCIsMzQzOlwieWllbGRfc3RtdFwifSxkZmFzOnsyNTY6W1tbWzEsMV0sWzIsMV0sWzMsMl1dLFtbMCwxXV0sW1syLDFdXV0sezI6MSw0OjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMjU3OltbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNTg6W1tbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsXG4zNToxLDM4OjEsNDM6MX1dLDI1OTpbW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHs0ODoxfV0sMjYwOltbW1s1MSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s1MSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MSw1MzoxfV0sMjYxOltbW1s0OSwxXSxbMTUsMl0sWzUzLDJdXSxbWzUwLDJdLFs1NCwzXSxbMCwxXV0sW1s0OSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyNjI6W1tbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyNjM6W1tbWzI0LDFdXSxbWzQ5LFxuMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLHsyNDoxfV0sMjY0OltbW1sxMCwxXV0sW1s1NiwyXV0sW1swLDJdXV0sezEwOjF9XSwyNjU6W1tbWzEwLDFdXSxbWzU3LDJdLFs1NiwyXSxbNTgsMl1dLFtbMCwyXV1dLHsxMDoxfV0sMjY2OltbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDI1OjEsMzM6MSwzNToxLDM4OjF9XSwyNjc6W1tbWzI5LDFdLFs2NSwyXV0sW1s2NSwyXV0sW1s2NiwyXSxbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyNToxLDI5OjEsMzM6MSwzNToxLDM4OjF9XSwyNjg6W1tbWzY3LDFdLFs2OCwxXSxbNjksMV0sXG5bNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLHs2NzoxLDY4OjEsNjk6MSw3MDoxLDcxOjEsNzI6MSw3MzoxLDc0OjEsNzU6MSw3NjoxLDc3OjEsNzg6MSw3OToxfV0sMjY5OltbW1szOSwxXV0sW1swLDFdXV0sezM5OjF9XSwyNzA6W1tbWzEzLDFdXSxbWzI1LDJdXSxbWzQ4LDNdLFszNSw0XV0sW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLHsxMzoxfV0sMjcxOltbW1sxMCwxXSxbMzQsMl1dLFtbMzQsMl1dLFtbODIsM11dLFtbODMsNF1dLFtbODQsNV1dLFtbODUsNl0sWzAsNV1dLFtbMCw2XV1dLHsxMDoxLDM0OjF9XSwyNzI6W1tbWzM3LDFdXSxbWzg2LDJdXSxbWzg1LDNdLFswLDJdXSxbWzAsM11dXSx7Mzc6MX1dLDI3MzpbW1tbODcsMV0sWzU0LDFdXSxbWzAsMV1dXSx7MTA6MSwzNDoxLDM3OjF9XSwyNzQ6W1tbWzg4LDFdLFs4OSwxXSxcbls4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSx7ODoxLDgzOjEsODg6MSw4OToxLDkwOjEsOTE6MSw5MjoxLDkzOjEsOTQ6MX1dLDI3NTpbW1tbOTUsMV1dLFtbOTYsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjc2OltbW1s5NywxXSxbOTgsMV0sWzU4LDFdLFs5OSwxXSxbNTcsMV0sWzEwMCwxXSxbNTYsMV0sWzEwMSwxXSxbMTAyLDFdXSxbWzAsMV1dXSx7NDoxLDEwOjEsMTM6MSwyMDoxLDIxOjEsMzQ6MSwzNzoxLDQxOjEsNDI6MX1dLDI3NzpbW1tbNDAsMV1dLFtbMCwxXV1dLHs0MDoxfV0sMjc4OltbW1sxNywxXV0sW1swLDFdXV0sezE3OjF9XSwyNzk6W1tbWzEwMywxXV0sW1s1NiwyXSxbMTA0LDJdLFs5OSwyXV0sW1swLDJdXV0sezQxOjF9XSwyODA6W1tbWzQxLDFdXSxcbltbMTA1LDJdXSxbWzIsNF0sWzM1LDNdXSxbWzYxLDVdLFs4MSw2XV0sW1swLDRdXSxbWzIsNF1dLFtbNjEsNV1dXSx7NDE6MX1dLDI4MTpbW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLHs0MToxfV0sMjgyOltbW1syNywxXV0sW1s4MiwyXV0sW1swLDJdXV0sezI3OjF9XSwyODM6W1tbWzQ5LDFdLFsxMDcsMl0sWzUzLDNdXSxbWzQ4LDRdLFs1NCw1XSxbNTIsNl0sWzAsMV1dLFtbNTQsNV0sWzUyLDZdLFswLDJdXSxbWzk1LDddXSxbWzQ5LDddXSxbWzAsNV1dLFtbNDksOF0sWzEwNyw4XSxbMCw2XV0sW1s1NCw1XSxbNTIsOV0sWzAsN11dLFtbNTIsNl0sWzAsOF1dLFtbNDksMTBdLFs1MywxMV0sWzAsOV1dLFtbNDgsMTJdXSxbWzk1LDEzXV0sW1s0OSwxM11dLFtbNTIsOV0sWzAsMTNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxLDUzOjF9XSwyODQ6W1tbWzEwNSwxXV0sW1sxMDgsXG4yXSxbMCwxXV0sW1syNSwzXV0sW1swLDNdXV0sezI1OjF9XSwyODU6W1tbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLHsyNToxfV0sMjg2OltbW1syNSwxXV0sW1sxMTAsMF0sWzAsMV1dXSx7MjU6MX1dLDI4NzpbW1tbMjUsMV1dLFtbMCwxXV1dLHsyNToxfV0sMjg4OltbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjg5OltbW1sxMTMsMV1dLFtbNDksMl0sWzAsMV1dLFtbMTA4LDNdLFs1MiwzXSxbMCwyXV0sW1s0OSw0XV0sW1swLDRdXV0sezExMzoxfV0sMjkwOltbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sezY6MSw3OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDI5MTpbW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsXG40XSxbNjIsNF1dLFtbMTE2LDVdLFs2Miw1XV0sW1swLDRdXSxbWzUwLDNdLFswLDVdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMjkyOltbW1s5NSwxXSxbMTA3LDFdXSxbWzUyLDJdLFswLDFdXSxbWzk1LDFdLFsxMDcsMV0sWzAsMl1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE1OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTM6W1tbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwyOTQ6W1tbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSx7MjoxLDQ6MSw1OjEsNjoxLDc6MSw4OjEsOToxLDEwOjEsMTE6MSwxMjoxLDEzOjEsMTQ6MSwxNToxLDE2OjEsXG4xNzoxLDE4OjEsMTk6MSwyMDoxLDIxOjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzQ6MSwzNToxLDM2OjEsMzc6MSwzODoxLDM5OjEsNDA6MSw0MToxLDQyOjEsNDM6MSwxMTI6MX1dLDI5NTpbW1tbMTIyLDFdLFsxMjMsMV0sWzEyNCwxXSxbMTI1LDFdLFsxMjYsMV1dLFtbMCwxXV1dLHs1OjEsMjM6MSwzMToxLDM5OjEsNDA6MX1dLDI5NjpbW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sezM0OjF9XSwyOTc6W1tbWzQsMV1dLFtbMjUsMl1dLFtbMTI4LDNdXSxbWzQ4LDRdLFsxMjksNV1dLFtbODAsNl1dLFtbNDksN11dLFtbMCw2XV0sW1s0OCw0XV1dLHs0OjF9XSwyOTg6W1tbWzI2LDFdXSxbWzI1LDJdXSxbWzUyLDFdLFswLDJdXV0sezI2OjF9XSwyOTk6W1tbWzM3LDFdXSxbWzQ5LDJdXSxcbltbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFsxMzAsMV0sWzAsNF1dLFtbNDgsNl1dLFtbODAsN11dLFtbMCw3XV1dLHszNzoxfV0sMzAwOltbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLHsyNToxfV0sMzAxOltbW1sxMzEsMV1dLFtbNTIsMl0sWzAsMV1dLFtbMTMxLDFdLFswLDJdXV0sezI1OjF9XSwzMDI6W1tbWzM2LDFdXSxbWzEwNSwyXSxbMTksM10sWzExMCwzXV0sW1szMiw0XV0sW1sxMDUsMl0sWzE5LDNdLFszMiw0XSxbMTEwLDNdXSxbWzEzMiw1XSxbMTUsNV0sWzM1LDZdXSxbWzAsNV1dLFtbMTMyLDddXSxbWzYxLDVdXV0sezM2OjF9XSwzMDM6W1tbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sezMyOjF9XSwzMDQ6W1tbWzEzNCwxXSxbMTM1LDFdXSxbWzAsMV1dXSx7MzI6MSwzNjoxfV0sMzA1OltbW1sxNCwxXV0sW1s0OCwyXSxbMTM2LDNdXSxbWzQ5LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNjpbW1tbMTQsMV1dLFxuW1s0OCwyXSxbMTM2LDNdXSxbWzg2LDRdXSxbWzQ4LDJdXSxbWzAsNF1dXSx7MTQ6MX1dLDMwNzpbW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSx7MTg6MX1dLDMwODpbW1tbOCwxXSxbMTM3LDJdXSxbWzQ2LDJdXSxbWzAsMl1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMwOTpbW1tbMTM4LDFdXSxbWzEzOSwwXSxbMCwxXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzEwOltbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSx7MzU6MX1dLDMxMTpbW1tbMjgsMV1dLFtbMCwxXV1dLHsyODoxfV0sMzEyOltbW1sxNDEsMV1dLFtbNTMsMl0sWzAsMV1dLFtbMTIwLDNdXSxbWzAsM11dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjU6MSwyOToxLDMzOjEsXG4zNToxLDM4OjF9XSwzMTM6W1tbWzE2LDFdXSxbWzQ5LDJdLFsxNDIsM10sWzAsMV1dLFtbNTIsNF0sWzAsMl1dLFtbNDksNV1dLFtbNDksMl0sWzAsNF1dLFtbNTIsNl0sWzAsNV1dLFtbNDksN11dLFtbNTIsOF0sWzAsN11dLFtbNDksN10sWzAsOF1dXSx7MTY6MX1dLDMxNDpbW1tbNSwxXV0sW1s0OSwyXSxbMCwxXV0sW1szNiwzXSxbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbNTIsNV0sWzAsNF1dLFtbNDksNl1dLFtbMCw2XV1dLHs1OjF9XSwzMTU6W1tbWzIzLDFdXSxbWzExMSwyXSxbMCwxXV0sW1swLDJdXV0sezIzOjF9XSwzMTY6W1tbWzE0MywxXV0sW1sxNDQsMF0sWzE0MiwwXSxbMCwxXV1dLHs2OjEsNzoxLDk6MSwxMToxLDEyOjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMTc6W1tbWzE0NSwxXV0sW1syLDJdLFsxNDYsM11dLFtbMCwyXV0sW1sxNDUsMV0sWzIsMl1dXSx7NToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSxcbjE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMxODpbW1tbNDgsMV1dLFtbNDksMl0sWzAsMV1dLFtbMCwyXV1dLHs0ODoxfV0sMzE5OltbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLHs1OjEsNjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE1OjEsMTY6MSwxNzoxLDE4OjEsMTk6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNToxLDM2OjEsMzg6MSwzOToxLDQwOjEsNDM6MX1dLDMyMDpbW1tbMTUsMV1dLFtbOTUsMl1dLFtbMCwyXV1dLHsxNToxfV0sMzIxOltbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSx7NDoxLDU6MSw2OjEsNzoxLFxuODoxLDk6MSwxMDoxLDExOjEsMTI6MSwxMzoxLDE0OjEsMTU6MSwxNjoxLDE3OjEsMTg6MSwxOToxLDIwOjEsMjE6MSwyMjoxLDIzOjEsMjQ6MSwyNToxLDI2OjEsMjc6MSwyODoxLDI5OjEsMzA6MSwzMToxLDMyOjEsMzM6MSwzNDoxLDM1OjEsMzY6MSwzNzoxLDM4OjEsMzk6MSw0MDoxLDQxOjEsNDI6MSw0MzoxfV0sMzIyOltbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyMzpbW1tbMTU4LDFdXSxbWzUyLDJdLFswLDFdXSxbWzE1OCwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjEsNDg6MX1dLDMyNDpbW1tbMSwxXSxbMiwyXV0sXG5bWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLHsyOjEsNToxLDY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE2OjEsMTc6MSwxODoxLDE5OjEsMjI6MSwyMzoxLDI0OjEsMjU6MSwyNjoxLDI3OjEsMjg6MSwyOToxLDMwOjEsMzE6MSwzMjoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsMzk6MSw0MDoxLDQzOjF9XSwzMjU6W1tbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsMF0sWzQxLDBdLFsxNjMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI2OltbW1s4NCwxXSxbMTY0LDJdXSxbWzM3LDNdLFswLDFdXSxbWzAsMl1dLFtbODQsNF1dLFtbMTI3LDVdXSxbWzQ5LDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMyNzpbW1tbMTY1LFxuMV0sWzg0LDFdXSxbWzAsMV1dXSx7NjoxLDc6MSw4OjEsOToxLDExOjEsMTI6MSwxNDoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLDM1OjEsMzg6MSw0MzoxfV0sMzI4OltbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMjk6W1tbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTU6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzMDpbW1tbNDksMV0sWzEwNywxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMTA3LDFdLFswLDJdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxNToxLDE5OjEsXG4yMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzODoxLDQzOjF9XSwzMzE6W1tbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSx7MjU6MX1dLDMzMjpbW1tbMzUsMV0sWzExMCwyXSxbMzgsM11dLFtbNjEsNF0sWzgxLDVdXSxbWzI1LDRdXSxbWzE2Niw2XV0sW1swLDRdXSxbWzYxLDRdXSxbWzY0LDRdXV0sezM1OjEsMzg6MSwxMTA6MX1dLDMzMzpbW1tbMjAsMV1dLFtbNDgsMl1dLFtbODAsM11dLFtbMTY3LDRdLFsxNjgsNV1dLFtbNDgsNl1dLFtbNDgsN11dLFtbODAsOF1dLFtbODAsOV1dLFtbMTY3LDRdLFsxMjcsMTBdLFsxNjgsNV0sWzAsOF1dLFtbMCw5XV0sW1s0OCwxMV1dLFtbODAsMTJdXSxbWzE2OCw1XSxbMCwxMl1dXSx7MjA6MX1dLDMzNDpbW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsXG41XV0sW1s0OSwxMF1dLFtbMTUsMTFdLFsxNjksMl0sWzUzLDNdLFswLDddXSxbWzUyLDEyXSxbMCw4XV0sW1s1MCwxM10sWzUyLDVdLFswLDldXSxbWzUyLDddLFswLDEwXV0sW1sxNjksMTRdLFs1MiwxNV0sWzAsMTFdXSxbWzAsMTJdXSxbWzQ5LDRdXSxbWzUyLDE1XSxbMCwxNF1dLFtbMTY5LDE2XSxbNTMsM10sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSx7MTU6MSwyNToxLDUzOjF9XSwzMzU6W1tbWzE1LDFdLFs1MywyXSxbMTcwLDNdXSxbWzE3MCw1XSxbNTIsNF0sWzAsMV1dLFtbMTcwLDZdXSxbWzUwLDddLFs1Miw4XSxbMCwzXV0sW1s1MywyXSxbMTcwLDldLFswLDRdXSxbWzUyLDRdLFswLDVdXSxbWzUyLDEwXSxbMCw2XV0sW1s0OSwxMV1dLFtbMTUsMTJdLFs1MywyXSxbMTcwLDNdLFswLDhdXSxbWzUwLDEzXSxbNTIsNF0sWzAsOV1dLFtbMCwxMF1dLFtbNTIsOF0sWzAsMTFdXSxbWzUyLDE1XSxbMTcwLDE0XSxbMCwxMl1dLFtbNDksNV1dLFxuW1s1MiwxNV0sWzAsMTRdXSxbWzUzLDJdLFsxNzAsMTZdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sezE1OjEsMjU6MSw1MzoxfV0sMzM2OltbW1syNSwxXV0sW1swLDFdXV0sezI1OjF9XSwzMzc6W1tbWzIxLDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMCw0XV0sW1s0OCw2XV0sW1s4MCw3XV0sW1swLDddXV0sezIxOjF9XSwzMzg6W1tbWzQ5LDFdXSxbWzEwOCwyXSxbMCwxXV0sW1s5NSwzXV0sW1swLDNdXV0sezY6MSw3OjEsODoxLDk6MSwxMToxLDEyOjEsMTQ6MSwxOToxLDIyOjEsMjU6MSwyOToxLDMwOjEsMzM6MSwzNToxLDM4OjEsNDM6MX1dLDMzOTpbW1tbNDIsMV1dLFtbMTcxLDJdXSxbWzQ4LDNdLFs1MiwxXV0sW1s4MCw0XV0sW1swLDRdXV0sezQyOjF9XSwzNDA6W1tbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSx7NjoxLDc6MSw5OjEsMTE6MSwxMjoxLDE5OjEsMjI6MSwyNToxLDI5OjEsMzA6MSwzMzoxLFxuMzU6MSwzODoxLDQzOjF9XSwzNDE6W1tbWzExMSwyXSxbMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLHs2OjEsNzoxLDg6MSw5OjEsMTE6MSwxMjoxLDE0OjEsMTk6MSwyMjoxLDI1OjEsMjk6MSwzMDoxLDMzOjEsMzU6MSwzNjoxLDM4OjEsNDM6MX1dLDM0MjpbW1tbMzEsMV1dLFtbMTc0LDJdLFswLDFdXSxbWzAsMl1dXSx7MzE6MX1dLDM0MzpbW1tbNjIsMV1dLFtbMCwxXV1dLHszMToxfV19LHN0YXRlczpbW1tbMSwxXSxbMiwxXSxbMywyXV0sW1swLDFdXSxbWzIsMV1dXSxbW1s0NCwxXV0sW1s0NSwwXSxbMCwxXV1dLFtbWzQ2LDFdXSxbWzQ3LDBdLFswLDFdXV0sW1tbNDgsMV1dLFtbNDksMl1dLFtbNTAsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzUxLDFdXSxbWzUyLDJdLFswLDFdXSxbWzUxLDFdLFswLDJdXV0sW1tbNDksMV0sWzE1LDJdLFs1MywyXV0sW1s1MCwyXSxbNTQsM10sWzAsMV1dLFtbNDksM11dLFtbMCwzXV1dLFtbWzU1LDFdXSxbWzMwLDBdLFs0MywwXSxcblswLDFdXV0sW1tbMjQsMV1dLFtbNDksMl1dLFtbNTIsM10sWzAsMl1dLFtbNDksNF1dLFtbMCw0XV1dLFtbWzEwLDFdXSxbWzU2LDJdXSxbWzAsMl1dXSxbW1sxMCwxXV0sW1s1NywyXSxbNTYsMl0sWzU4LDJdXSxbWzAsMl1dXSxbW1s2LDFdLFsyNSwxXSxbMzMsMV0sWzksMV0sWzExLDFdLFsxMiwyXSxbMzUsM10sWzM4LDRdLFsxOSwxXSxbNyw1XV0sW1swLDFdXSxbWzU5LDFdLFs2MCw2XV0sW1s2MSwxXSxbNjIsN10sWzYzLDddXSxbWzY0LDFdLFs2Myw4XV0sW1s3LDVdLFswLDVdXSxbWzU5LDFdXSxbWzYxLDFdXSxbWzY0LDFdXV0sW1tbMjksMV0sWzY1LDJdXSxbWzY1LDJdXSxbWzY2LDJdLFswLDJdXV0sW1tbNjcsMV0sWzY4LDFdLFs2OSwxXSxbNzAsMV0sWzcxLDFdLFs3MiwxXSxbNzMsMV0sWzc0LDFdLFs3NSwxXSxbNzYsMV0sWzc3LDFdLFs3OCwxXSxbNzksMV1dLFtbMCwxXV1dLFtbWzM5LDFdXSxbWzAsMV1dXSxbW1sxMywxXV0sW1syNSwyXV0sW1s0OCwzXSxbMzUsNF1dLFxuW1s4MCw1XV0sW1s2MSw2XSxbODEsN11dLFtbMCw1XV0sW1s0OCwzXV0sW1s2MSw2XV1dLFtbWzEwLDFdLFszNCwyXV0sW1szNCwyXV0sW1s4MiwzXV0sW1s4Myw0XV0sW1s4NCw1XV0sW1s4NSw2XSxbMCw1XV0sW1swLDZdXV0sW1tbMzcsMV1dLFtbODYsMl1dLFtbODUsM10sWzAsMl1dLFtbMCwzXV1dLFtbWzg3LDFdLFs1NCwxXV0sW1swLDFdXV0sW1tbODgsMV0sWzg5LDFdLFs4LDJdLFs5MCwxXSxbODgsMV0sWzgzLDFdLFs5MSwxXSxbOTIsM10sWzkzLDFdLFs5NCwxXV0sW1swLDFdXSxbWzgzLDFdXSxbWzgsMV0sWzAsM11dXSxbW1s5NSwxXV0sW1s5NiwwXSxbMCwxXV1dLFtbWzk3LDFdLFs5OCwxXSxbNTgsMV0sWzk5LDFdLFs1NywxXSxbMTAwLDFdLFs1NiwxXSxbMTAxLDFdLFsxMDIsMV1dLFtbMCwxXV1dLFtbWzQwLDFdXSxbWzAsMV1dXSxbW1sxNywxXV0sW1swLDFdXV0sW1tbMTAzLDFdXSxbWzU2LDJdLFsxMDQsMl0sWzk5LDJdXSxbWzAsMl1dXSxbW1s0MSwxXV0sW1sxMDUsXG4yXV0sW1syLDRdLFszNSwzXV0sW1s2MSw1XSxbODEsNl1dLFtbMCw0XV0sW1syLDRdXSxbWzYxLDVdXV0sW1tbMTA2LDFdXSxbWzEwNiwxXSxbMCwxXV1dLFtbWzI3LDFdXSxbWzgyLDJdXSxbWzAsMl1dXSxbW1s0OSwxXSxbMTA3LDJdLFs1MywzXV0sW1s0OCw0XSxbNTQsNV0sWzUyLDZdLFswLDFdXSxbWzU0LDVdLFs1Miw2XSxbMCwyXV0sW1s5NSw3XV0sW1s0OSw3XV0sW1swLDVdXSxbWzQ5LDhdLFsxMDcsOF0sWzAsNl1dLFtbNTQsNV0sWzUyLDldLFswLDddXSxbWzUyLDZdLFswLDhdXSxbWzQ5LDEwXSxbNTMsMTFdLFswLDldXSxbWzQ4LDEyXV0sW1s5NSwxM11dLFtbNDksMTNdXSxbWzUyLDldLFswLDEzXV1dLFtbWzEwNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEwOSwxXV0sW1s1MiwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzExMCwwXSxbMCwxXV1dLFtbWzI1LDFdXSxbWzAsMV1dXSxbW1sxMTEsMV1dLFtbMiwxXSxbMTEyLDJdXSxbWzAsMl1dXSxcbltbWzExMywxXV0sW1s0OSwyXSxbMCwxXV0sW1sxMDgsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzAsNF1dXSxbW1sxMTQsMV1dLFtbMTE1LDBdLFswLDFdXV0sW1tbMTE2LDFdXSxbWzExNywyXSxbNTAsM10sWzExOCw0XSxbMCwxXV0sW1sxMTEsNF0sWzYyLDRdXSxbWzExNiw1XSxbNjIsNV1dLFtbMCw0XV0sW1s1MCwzXSxbMCw1XV1dLFtbWzk1LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbOTUsMV0sWzEwNywxXSxbMCwyXV1dLFtbWzExOSwyXSxbMzAsMV0sWzIyLDFdLFs0MywxXV0sW1sxMjAsMl1dLFtbMCwyXV1dLFtbWzIsMF0sWzExMiwxXSxbMTIxLDBdXSxbWzAsMV1dXSxbW1sxMjIsMV0sWzEyMywxXSxbMTI0LDFdLFsxMjUsMV0sWzEyNiwxXV0sW1swLDFdXV0sW1tbMzQsMV1dLFtbODIsMl1dLFtbODMsM11dLFtbMTExLDRdXSxbWzQ4LDVdXSxbWzgwLDZdXSxbWzEyNyw3XSxbMCw2XV0sW1s0OCw4XV0sW1s4MCw5XV0sW1swLDldXV0sW1tbNCwxXV0sW1syNSxcbjJdXSxbWzEyOCwzXV0sW1s0OCw0XSxbMTI5LDVdXSxbWzgwLDZdXSxbWzQ5LDddXSxbWzAsNl1dLFtbNDgsNF1dXSxbW1syNiwxXV0sW1syNSwyXV0sW1s1MiwxXSxbMCwyXV1dLFtbWzM3LDFdXSxbWzQ5LDJdXSxbWzQ4LDNdXSxbWzgwLDRdXSxbWzEyNyw1XSxbMTMwLDFdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1syNSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbMjUsM11dLFtbMCwzXV1dLFtbWzEzMSwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxMzEsMV0sWzAsMl1dXSxbW1szNiwxXV0sW1sxMDUsMl0sWzE5LDNdLFsxMTAsM11dLFtbMzIsNF1dLFtbMTA1LDJdLFsxOSwzXSxbMzIsNF0sWzExMCwzXV0sW1sxMzIsNV0sWzE1LDVdLFszNSw2XV0sW1swLDVdXSxbWzEzMiw3XV0sW1s2MSw1XV1dLFtbWzMyLDFdXSxbWzEzMywyXV0sW1swLDJdXV0sW1tbMTM0LDFdLFsxMzUsMV1dLFtbMCwxXV1dLFtbWzE0LDFdXSxbWzQ4LDJdLFsxMzYsM11dLFtbNDksNF1dLFtbNDgsXG4yXV0sW1swLDRdXV0sW1tbMTQsMV1dLFtbNDgsMl0sWzEzNiwzXV0sW1s4Niw0XV0sW1s0OCwyXV0sW1swLDRdXV0sW1tbMTgsMV1dLFtbMjUsMl1dLFtbNTIsMV0sWzAsMl1dXSxbW1s4LDFdLFsxMzcsMl1dLFtbNDYsMl1dLFtbMCwyXV1dLFtbWzEzOCwxXV0sW1sxMzksMF0sWzAsMV1dXSxbW1szNSwxXV0sW1s2MSwyXSxbMTQwLDNdXSxbWzAsMl1dLFtbNjEsMl1dXSxbW1syOCwxXV0sW1swLDFdXV0sW1tbMTQxLDFdXSxbWzUzLDJdLFswLDFdXSxbWzEyMCwzXV0sW1swLDNdXV0sW1tbMTYsMV1dLFtbNDksMl0sWzE0MiwzXSxbMCwxXV0sW1s1Miw0XSxbMCwyXV0sW1s0OSw1XV0sW1s0OSwyXSxbMCw0XV0sW1s1Miw2XSxbMCw1XV0sW1s0OSw3XV0sW1s1Miw4XSxbMCw3XV0sW1s0OSw3XSxbMCw4XV1dLFtbWzUsMV1dLFtbNDksMl0sWzAsMV1dLFtbMzYsM10sWzUyLDNdLFswLDJdXSxbWzQ5LDRdXSxbWzUyLDVdLFswLDRdXSxbWzQ5LDZdXSxbWzAsNl1dXSxbW1syMywxXV0sW1sxMTEsXG4yXSxbMCwxXV0sW1swLDJdXV0sW1tbMTQzLDFdXSxbWzE0NCwwXSxbMTQyLDBdLFswLDFdXV0sW1tbMTQ1LDFdXSxbWzIsMl0sWzE0NiwzXV0sW1swLDJdXSxbWzE0NSwxXSxbMiwyXV1dLFtbWzQ4LDFdXSxbWzQ5LDJdLFswLDFdXSxbWzAsMl1dXSxbW1sxNDcsMV0sWzE0OCwxXSxbMTQ5LDFdLFsxNTAsMV0sWzE1MSwxXSxbMTUyLDFdLFsxNTMsMV0sWzE1NCwxXSxbMTU1LDFdLFsxNTYsMV1dLFtbMCwxXV1dLFtbWzE1LDFdXSxbWzk1LDJdXSxbWzAsMl1dXSxbW1sxLDFdLFszLDFdXSxbWzAsMV1dXSxbW1s0OSwxXSxbNDgsMl1dLFtbNDgsMl0sWzAsMV1dLFtbNDksM10sWzE1Nyw0XSxbMCwyXV0sW1sxNTcsNF0sWzAsM11dLFtbMCw0XV1dLFtbWzE1OCwxXV0sW1s1MiwyXSxbMCwxXV0sW1sxNTgsMV0sWzAsMl1dXSxbW1sxLDFdLFsyLDJdXSxbWzAsMV1dLFtbMTU5LDNdXSxbWzEyMSw0XV0sW1sxNjAsMV0sWzEyMSw0XV1dLFtbWzEyMCwxXV0sW1sxNjEsMF0sWzE1LDBdLFsxNjIsXG4wXSxbNDEsMF0sWzE2MywwXSxbMCwxXV1dLFtbWzg0LDFdLFsxNjQsMl1dLFtbMzcsM10sWzAsMV1dLFtbMCwyXV0sW1s4NCw0XV0sW1sxMjcsNV1dLFtbNDksMl1dXSxbW1sxNjUsMV0sWzg0LDFdXSxbWzAsMV1dXSxbW1s0OSwxXV0sW1s1MiwyXSxbMCwxXV0sW1s0OSwxXSxbMCwyXV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTQsMl0sWzUyLDNdLFswLDFdXSxbWzAsMl1dLFtbNDksNF0sWzEwNyw0XSxbMCwzXV0sW1s1MiwzXSxbMCw0XV1dLFtbWzQ5LDFdLFsxMDcsMV1dLFtbNTIsMl0sWzAsMV1dLFtbNDksMV0sWzEwNywxXSxbMCwyXV1dLFtbWzI1LDFdXSxbWzQ4LDJdLFswLDFdXSxbWzQ5LDNdXSxbWzAsM11dXSxbW1szNSwxXSxbMTEwLDJdLFszOCwzXV0sW1s2MSw0XSxbODEsNV1dLFtbMjUsNF1dLFtbMTY2LDZdXSxbWzAsNF1dLFtbNjEsNF1dLFtbNjQsNF1dXSxbW1syMCwxXV0sW1s0OCwyXV0sW1s4MCwzXV0sW1sxNjcsNF0sWzE2OCw1XV0sW1s0OCw2XV0sW1s0OCw3XV0sXG5bWzgwLDhdXSxbWzgwLDldXSxbWzE2Nyw0XSxbMTI3LDEwXSxbMTY4LDVdLFswLDhdXSxbWzAsOV1dLFtbNDgsMTFdXSxbWzgwLDEyXV0sW1sxNjgsNV0sWzAsMTJdXV0sW1tbMTUsMV0sWzE2OSwyXSxbNTMsM11dLFtbMTY5LDRdLFs1Miw1XSxbMCwxXV0sW1s1MCw2XSxbNTIsN10sWzAsMl1dLFtbMTY5LDhdXSxbWzUyLDVdLFswLDRdXSxbWzE2OSw5XSxbNTMsM10sWzAsNV1dLFtbNDksMTBdXSxbWzE1LDExXSxbMTY5LDJdLFs1MywzXSxbMCw3XV0sW1s1MiwxMl0sWzAsOF1dLFtbNTAsMTNdLFs1Miw1XSxbMCw5XV0sW1s1Miw3XSxbMCwxMF1dLFtbMTY5LDE0XSxbNTIsMTVdLFswLDExXV0sW1swLDEyXV0sW1s0OSw0XV0sW1s1MiwxNV0sWzAsMTRdXSxbWzE2OSwxNl0sWzUzLDNdLFswLDE1XV0sW1s1MCwxN10sWzUyLDE1XSxbMCwxNl1dLFtbNDksMTRdXV0sW1tbMTUsMV0sWzUzLDJdLFsxNzAsM11dLFtbMTcwLDVdLFs1Miw0XSxbMCwxXV0sW1sxNzAsNl1dLFtbNTAsN10sWzUyLFxuOF0sWzAsM11dLFtbNTMsMl0sWzE3MCw5XSxbMCw0XV0sW1s1Miw0XSxbMCw1XV0sW1s1MiwxMF0sWzAsNl1dLFtbNDksMTFdXSxbWzE1LDEyXSxbNTMsMl0sWzE3MCwzXSxbMCw4XV0sW1s1MCwxM10sWzUyLDRdLFswLDldXSxbWzAsMTBdXSxbWzUyLDhdLFswLDExXV0sW1s1MiwxNV0sWzE3MCwxNF0sWzAsMTJdXSxbWzQ5LDVdXSxbWzUyLDE1XSxbMCwxNF1dLFtbNTMsMl0sWzE3MCwxNl0sWzAsMTVdXSxbWzUwLDE3XSxbNTIsMTVdLFswLDE2XV0sW1s0OSwxNF1dXSxbW1syNSwxXV0sW1swLDFdXV0sW1tbMjEsMV1dLFtbNDksMl1dLFtbNDgsM11dLFtbODAsNF1dLFtbMTI3LDVdLFswLDRdXSxbWzQ4LDZdXSxbWzgwLDddXSxbWzAsN11dXSxbW1s0OSwxXV0sW1sxMDgsMl0sWzAsMV1dLFtbOTUsM11dLFtbMCwzXV1dLFtbWzQyLDFdXSxbWzE3MSwyXV0sW1s0OCwzXSxbNTIsMV1dLFtbODAsNF1dLFtbMCw0XV1dLFtbWzE3MiwxXV0sW1sxNzMsMF0sWzAsMV1dXSxbW1sxMTEsMl0sXG5bMzYsMV1dLFtbNDksMl1dLFtbMCwyXV1dLFtbWzMxLDFdXSxbWzE3NCwyXSxbMCwxXV0sW1swLDJdXV0sW1tbNjIsMV1dLFtbMCwxXV1dXSxsYWJlbHM6W1swLFwiRU1QVFlcIl0sWzMxNyxudWxsXSxbNCxudWxsXSxbMjc2LG51bGxdLFsxLFwiZGVmXCJdLFsxLFwicmFpc2VcIl0sWzEsXCJUcnVlXCJdLFszLG51bGxdLFsxLFwibm90XCJdLFsxLFwibnVsbFwiXSxbNTUsbnVsbF0sWzIsbnVsbF0sWzI1LG51bGxdLFsxLFwiY2xhc3NcIl0sWzEsXCJsYW1iZGFcIl0sWzE2LG51bGxdLFsxLFwicHJpbnRcIl0sWzEsXCJkZWJ1Z2dlclwiXSxbMSxcIm5vbmxvY2FsXCJdLFs1MixudWxsXSxbMSxcInRyeVwiXSxbMSxcIndoaWxlXCJdLFszMSxudWxsXSxbMSxcInJldHVyblwiXSxbMSxcImFzc2VydFwiXSxbMSxudWxsXSxbMSxcImdsb2JhbFwiXSxbMSxcImRlbFwiXSxbMSxcInBhc3NcIl0sWzU0LG51bGxdLFsxNSxudWxsXSxbMSxcInlpZWxkXCJdLFsxLFwiaW1wb3J0XCJdLFsxLFwiRmFsc2VcIl0sWzEsXCJmb3JcIl0sWzcsbnVsbF0sWzEsXCJmcm9tXCJdLFsxLFxuXCJpZlwiXSxbOSxudWxsXSxbMSxcImJyZWFrXCJdLFsxLFwiY29udGludWVcIl0sWzQ5LG51bGxdLFsxLFwid2l0aFwiXSxbMTQsbnVsbF0sWzMxNixudWxsXSxbMTksbnVsbF0sWzMwOCxudWxsXSxbMSxcImFuZFwiXSxbMTEsbnVsbF0sWzMyNixudWxsXSxbMjIsbnVsbF0sWzI2MSxudWxsXSxbMTIsbnVsbF0sWzM1LG51bGxdLFsyNzEsbnVsbF0sWzMyNSxudWxsXSxbMjk3LG51bGxdLFszMzksbnVsbF0sWzI5NixudWxsXSxbMjYsbnVsbF0sWzI4MyxudWxsXSxbOCxudWxsXSxbMzQyLG51bGxdLFszMjksbnVsbF0sWzEwLG51bGxdLFsyNjYsbnVsbF0sWzMzMixudWxsXSxbNDUsbnVsbF0sWzM4LG51bGxdLFs0MCxudWxsXSxbNTAsbnVsbF0sWzQ2LG51bGxdLFs0MSxudWxsXSxbNDIsbnVsbF0sWzM2LG51bGxdLFs0MyxudWxsXSxbNDgsbnVsbF0sWzQ0LG51bGxdLFszNyxudWxsXSxbMzksbnVsbF0sWzMyNCxudWxsXSxbMjYwLG51bGxdLFsyOTIsbnVsbF0sWzEsXCJpblwiXSxbMzA5LG51bGxdLFsyNzMsXG5udWxsXSxbMzI3LG51bGxdLFsyNzIsbnVsbF0sWzI4LG51bGxdLFsyMSxudWxsXSxbMjcsbnVsbF0sWzI5LG51bGxdLFsxLFwiaXNcIl0sWzMwLG51bGxdLFsyMCxudWxsXSxbMjkwLG51bGxdLFsyNzQsbnVsbF0sWzMzMyxudWxsXSxbMjk5LG51bGxdLFsyNzAsbnVsbF0sWzMzNyxudWxsXSxbMjc5LG51bGxdLFsyNjUsbnVsbF0sWzI4MSxudWxsXSxbMjY0LG51bGxdLFsyODYsbnVsbF0sWzI4MCxudWxsXSxbMzIwLG51bGxdLFsxLFwiYXNcIl0sWzI4NCxudWxsXSxbMjMsbnVsbF0sWzMyOCxudWxsXSxbMCxudWxsXSxbMSxcImV4Y2VwdFwiXSxbMzQwLG51bGxdLFsxOCxudWxsXSxbMzMwLG51bGxdLFsyNjgsbnVsbF0sWzI1OSxudWxsXSxbMzEyLG51bGxdLFsyOTMsbnVsbF0sWzMyMSxudWxsXSxbMjY5LG51bGxdLFsyNzcsbnVsbF0sWzMxNCxudWxsXSxbMzE1LG51bGxdLFszNDMsbnVsbF0sWzEsXCJlbHNlXCJdLFszMTAsbnVsbF0sWzUxLG51bGxdLFsxLFwiZWxpZlwiXSxbMzAwLG51bGxdLFszMDEsXG5udWxsXSxbMjg1LG51bGxdLFszMDMsbnVsbF0sWzMwMixudWxsXSxbMzM1LG51bGxdLFsyNzUsbnVsbF0sWzI1OCxudWxsXSxbMSxcIm9yXCJdLFszMzQsbnVsbF0sWzI2NyxudWxsXSxbMzQsbnVsbF0sWzI2MixudWxsXSxbMzMsbnVsbF0sWzMxOSxudWxsXSxbMTMsbnVsbF0sWzI5NSxudWxsXSxbMjYzLG51bGxdLFsyOTEsbnVsbF0sWzMxMSxudWxsXSxbMzA3LG51bGxdLFszMTMsbnVsbF0sWzI4MixudWxsXSxbMjk4LG51bGxdLFszMDQsbnVsbF0sWzI3OCxudWxsXSxbMzE4LG51bGxdLFszMjIsbnVsbF0sWzUsbnVsbF0sWzYsbnVsbF0sWzQ3LG51bGxdLFsxNyxudWxsXSxbMjQsbnVsbF0sWzMwNSxudWxsXSxbMzA2LG51bGxdLFszMjMsbnVsbF0sWzI4OSxudWxsXSxbMSxcImZpbmFsbHlcIl0sWzMzMSxudWxsXSxbMzM2LG51bGxdLFszMzgsbnVsbF0sWzI1NyxudWxsXSxbMzIsbnVsbF0sWzM0MSxudWxsXV0sa2V5d29yZHM6e0ZhbHNlOjMzLFwibnVsbFwiOjksVHJ1ZTo2LGFuZDo0NyxcbmFzOjEwOCxhc3NlcnQ6MjQsXCJicmVha1wiOjM5LFwiY2xhc3NcIjoxMyxcImNvbnRpbnVlXCI6NDAsXCJkZWJ1Z2dlclwiOjE3LGRlZjo0LGRlbDoyNyxlbGlmOjEzMCxcImVsc2VcIjoxMjcsZXhjZXB0OjExMyxcImZpbmFsbHlcIjoxNjgsXCJmb3JcIjozNCxmcm9tOjM2LGdsb2JhbDoyNixcImlmXCI6MzcsXCJpbXBvcnRcIjozMixcImluXCI6ODMsaXM6OTIsbGFtYmRhOjE0LG5vbmxvY2FsOjE4LG5vdDo4LG9yOjEzOSxwYXNzOjI4LHByaW50OjE2LHJhaXNlOjUsXCJyZXR1cm5cIjoyMyxcInRyeVwiOjIwLFwid2hpbGVcIjoyMSxcIndpdGhcIjo0Mix5aWVsZDozMX0sdG9rZW5zOnswOjExMiwxOjI1LDI6MTEsMzo3LDQ6Miw1OjE1OSw2OjE2MCw3OjM1LDg6NjEsOTozOCwxMDo2NCwxMTo0OCwxMjo1MiwxMzoxNDYsMTQ6NDMsMTU6MzAsMTY6MTUsMTc6MTYyLDE4OjExNSwxOTo0NSwyMDo5NCwyMTo4OSwyMjo1MCwyMzoxMTAsMjQ6MTYzLDI1OjEyLDI2OjU5LDI3OjkwLDI4Ojg4LDI5OjkxLDMwOjkzLDMxOjIyLDMyOjE3MyxcbjMzOjE0NCwzNDoxNDIsMzU6NTMsMzY6NzQsMzc6NzgsMzg6NjgsMzk6NzksNDA6NjksNDE6NzIsNDI6NzMsNDM6NzUsNDQ6NzcsNDU6NjcsNDY6NzEsNDc6MTYxLDQ4Ojc2LDQ5OjQxLDUwOjcwLDUxOjEyOSw1MjoxOSw1NDoyOSw1NToxMH0sc3RhcnQ6MjU2fX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5maWxlbmFtZT1hO3RoaXMuZ3JhbW1hcj1jO3RoaXMucF9mbGFncz0wO3JldHVybiB0aGlzfWZ1bmN0aW9uIGMoYixjKXt2b2lkIDA9PT1jJiYoYz1cImZpbGVfaW5wdXRcIik7Yj1uZXcgYShiLFNrLlBhcnNlVGFibGVzKTtcImZpbGVfaW5wdXRcIj09PWM/Yi5zZXR1cChTay5QYXJzZVRhYmxlcy5zeW0uZmlsZV9pbnB1dCk6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7cmV0dXJuIGJ9YS5GVVRVUkVfUFJJTlRfRlVOQ1RJT049XCJwcmludF9mdW5jdGlvblwiO2EuRlVUVVJFX1VOSUNPREVfTElURVJBTFM9XCJ1bmljb2RlX2xpdGVyYWxzXCI7YS5GVVRVUkVfRElWSVNJT049XG5cImRpdmlzaW9uXCI7YS5GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPVwiYWJzb2x1dGVfaW1wb3J0XCI7YS5GVVRVUkVfV0lUSF9TVEFURU1FTlQ9XCJ3aXRoX3N0YXRlbWVudFwiO2EuRlVUVVJFX05FU1RFRF9TQ09QRVM9XCJuZXN0ZWRfc2NvcGVzXCI7YS5GVVRVUkVfR0VORVJBVE9SUz1cImdlbmVyYXRvcnNcIjthLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTj02NTUzNjthLkNPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTPTEzMTA3MjthLkNPX0ZVVFVSRV9ESVZJU09OPTgxOTI7YS5DT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUPTE2Mzg0O2EuQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UPTMyNzY4O2EucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKGEpe2E9YXx8dGhpcy5ncmFtbWFyLnN0YXJ0O3RoaXMuc3RhY2s9W3tkZmE6dGhpcy5ncmFtbWFyLmRmYXNbYV0sc3RhdGU6MCxub2RlOnt0eXBlOmEsdmFsdWU6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRyZW46W119fV07dGhpcy51c2VkX25hbWVzPXt9fTthLnByb3RvdHlwZS5hZGR0b2tlbj1cbmZ1bmN0aW9uKGEsYyxmKXt2YXIgYixlPXRoaXMuY2xhc3NpZnkoYSxjLGYpO2E6Zm9yKDs7KXt2YXIgZD10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3ZhciBnPWQuZGZhWzBdO3ZhciBuPWdbZC5zdGF0ZV07Zm9yKGI9MDtiPG4ubGVuZ3RoOysrYil7dmFyIGs9bltiXVswXTt2YXIgcD1uW2JdWzFdO3ZhciBtPXRoaXMuZ3JhbW1hci5sYWJlbHNba11bMF07aWYoZT09PWspe1NrLmFzc2VydHMuYXNzZXJ0KDI1Nj5tKTt0aGlzLnNoaWZ0KGEsYyxwLGYpO2ZvcihmPXA7MT09PWdbZl0ubGVuZ3RoJiYwPT09Z1tmXVswXVswXSYmZ1tmXVswXVsxXT09PWY7KXt0aGlzLnBvcCgpO2lmKDA9PT10aGlzLnN0YWNrLmxlbmd0aClyZXR1cm4hMDtkPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV07Zj1kLnN0YXRlO2c9ZC5kZmFbMF19cmV0dXJuITF9aWYoMjU2PD1tJiYoaz10aGlzLmdyYW1tYXIuZGZhc1ttXSxrPWtbMV0say5oYXNPd25Qcm9wZXJ0eShlKSkpe3RoaXMucHVzaChtLFxudGhpcy5ncmFtbWFyLmRmYXNbbV0scCxmKTtjb250aW51ZSBhfX1iOntnPVswLGQuc3RhdGVdO2ZvcihkPW4ubGVuZ3RoO2QtLTspaWYobltkXVswXT09PWdbMF0mJm5bZF1bMV09PT1nWzFdKXtuPSEwO2JyZWFrIGJ9bj0hMX1pZihuKXtpZih0aGlzLnBvcCgpLDA9PT10aGlzLnN0YWNrLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcInRvbyBtdWNoIGlucHV0XCIsdGhpcy5maWxlbmFtZSk7fWVsc2UgdGhyb3cgYT1mWzBdWzBdLG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYmFkIGlucHV0XCIsdGhpcy5maWxlbmFtZSxhLGYpO319O2EucHJvdG90eXBlLmNsYXNzaWZ5PWZ1bmN0aW9uKGIsYyxmKXtpZihiPT09U2sudG9rZW4udG9rZW5zLlRfTkFNRSl7dGhpcy51c2VkX25hbWVzW2NdPSEwO3ZhciBlPXRoaXMuZ3JhbW1hci5rZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eShjKSYmdGhpcy5ncmFtbWFyLmtleXdvcmRzW2NdO1wicHJpbnRcIj09PWMmJih0aGlzLnBfZmxhZ3MmXG5hLkNPX0ZVVFVSRV9QUklOVF9GVU5DVElPTnx8ITA9PT1Tay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uKSYmKGU9ITEpO2lmKGUpcmV0dXJuIGV9ZT10aGlzLmdyYW1tYXIudG9rZW5zLmhhc093blByb3BlcnR5KGIpJiZ0aGlzLmdyYW1tYXIudG9rZW5zW2JdO2lmKCFlKXtjPVwiI1wiK2I7Zm9yKGxldCBhIGluIFNrLnRva2VuLnRva2VucylpZihTay50b2tlbi50b2tlbnNbYV09PWIpe2M9YTticmVha310aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImJhZCB0b2tlbiBcIitjLHRoaXMuZmlsZW5hbWUsZlswXVswXSxmKTt9cmV0dXJuIGV9O2EucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKGEsYyxmLGwpe3ZhciBiPXRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV0uZGZhLGQ9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2QuY2hpbGRyZW4ucHVzaCh7dHlwZTphLHZhbHVlOmMsbGluZW5vOmxbMF1bMF0sY29sX29mZnNldDpsWzBdWzFdLGNoaWxkcmVuOm51bGx9KTtcbnRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTpiLHN0YXRlOmYsbm9kZTpkfX07YS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihhLGMsZixsKXthPXt0eXBlOmEsdmFsdWU6bnVsbCxsaW5lbm86bFswXVswXSxjb2xfb2Zmc2V0OmxbMF1bMV0sY2hpbGRyZW46W119O3RoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09e2RmYTp0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdLmRmYSxzdGF0ZTpmLG5vZGU6dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlfTt0aGlzLnN0YWNrLnB1c2goe2RmYTpjLHN0YXRlOjAsbm9kZTphfSl9O2EucHJvdG90eXBlLnBvcD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc3RhY2sucG9wKCkubm9kZTtpZihhKWlmKDAhPT10aGlzLnN0YWNrLmxlbmd0aCl7dmFyIGM9dGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXS5ub2RlO2MuY2hpbGRyZW4ucHVzaChhKX1lbHNlIHRoaXMucm9vdG5vZGU9YSx0aGlzLnJvb3Rub2RlLnVzZWRfbmFtZXM9XG50aGlzLnVzZWRfbmFtZXN9O1NrLnBhcnNlPWZ1bmN0aW9uKGEsZSl7dmFyIGI9U2sudG9rZW4udG9rZW5zLlRfQ09NTUVOVCxsPVNrLnRva2VuLnRva2Vucy5UX05MLGg9U2sudG9rZW4udG9rZW5zLlRfT1AsZD1Tay50b2tlbi50b2tlbnMuVF9FTkRNQVJLRVIsZz1Tay50b2tlbi50b2tlbnMuVF9FTkNPRElORyxuPSExLGs9YyhhKTtTay5fdG9rZW5pemUoYSxmdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KFwiXFxuXCIpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGErXCJcXG5cIn0pO3JldHVybiBmdW5jdGlvbigpe2lmKDA9PT1iLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5FeGNlcHRpb24oXCJFT0ZcIik7cmV0dXJuIGIucG9wKCl9fShlKSxcInV0Zi04XCIsZnVuY3Rpb24oYSl7dmFyIGM9bnVsbDthLnR5cGUhPT1iJiZhLnR5cGUhPT1sJiZhLnR5cGUhPT1nJiYoYS50eXBlPT09aCYmKGM9U2suT3BNYXBbYS5zdHJpbmddKSxrLmFkZHRva2VuKGN8fGEudHlwZSxhLnN0cmluZyxcblthLnN0YXJ0LGEuZW5kLGEubGluZV0pLGEudHlwZT09PWQmJihuPSEwKSl9KTtpZighbil0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImluY29tcGxldGUgaW5wdXRcIix0aGlzLmZpbGVuYW1lKTtyZXR1cm57Y3N0Omsucm9vdG5vZGUsZmxhZ3M6ay5wX2ZsYWdzfX07U2sucGFyc2VUcmVlRHVtcD1mdW5jdGlvbihhLGMpe3ZhciBiO2M9Y3x8XCJcIjt2YXIgZT1cIlwiK2M7aWYoMjU2PD1hLnR5cGUpZm9yKGUrPVNrLlBhcnNlVGFibGVzLm51bWJlcjJzeW1ib2xbYS50eXBlXStcIlxcblwiLGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoOysrYillKz1Tay5wYXJzZVRyZWVEdW1wKGEuY2hpbGRyZW5bYl0sYytcIiAgXCIpO2Vsc2UgZSs9U2sudG9rZW4udG9rX25hbWVbYS50eXBlXStcIjogXCIrKG5ldyBTay5idWlsdGluLnN0cihhLnZhbHVlKSkuJHIoKS52K1wiXFxuXCI7cmV0dXJuIGV9O1NrLmV4cG9ydFN5bWJvbChcIlNrLlBhcnNlclwiLGEpO1NrLmV4cG9ydFN5bWJvbChcIlNrLnBhcnNlXCIsU2sucGFyc2UpO1xuU2suZXhwb3J0U3ltYm9sKFwiU2sucGFyc2VUcmVlRHVtcFwiLFNrLnBhcnNlVHJlZUR1bXApfSxmdW5jdGlvbihtLHEpe1NrLmFzdG5vZGVzPXt9O1NrLmFzdG5vZGVzLkxvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLlN0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5EZWw9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z0xvYWQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkF1Z1N0b3JlPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5QYXJhbT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQW5kPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Pcj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5TdWI9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1hdE11bHQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkRpdj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTW9kPWZ1bmN0aW9uKCl7fTtcblNrLmFzdG5vZGVzLlBvdz1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTFNoaWZ0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5SU2hpZnQ9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdE9yPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5CaXRYb3I9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkJpdEFuZD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuRmxvb3JEaXY9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkludmVydD1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VQWRkPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5VU3ViPWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5FcT1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90RXE9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkx0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5MdEU9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLkd0PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5HdEU9XG5mdW5jdGlvbigpe307U2suYXN0bm9kZXMuSXM9ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLklzTm90PWZ1bmN0aW9uKCl7fTtTay5hc3Rub2Rlcy5Jbj1mdW5jdGlvbigpe307U2suYXN0bm9kZXMuTm90SW49ZnVuY3Rpb24oKXt9O1NrLmFzdG5vZGVzLk1vZHVsZT1mdW5jdGlvbihhLGMpe3RoaXMuYm9keT1hO3RoaXMuZG9jc3RyaW5nPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkludGVyYWN0aXZlPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByZXNzaW9uPWZ1bmN0aW9uKGEpe3RoaXMuYm9keT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdWl0ZT1mdW5jdGlvbihhKXt0aGlzLmJvZHk9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRnVuY3Rpb25EZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWQmJnZvaWQgMCE9PVxuZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZj1mdW5jdGlvbihhLGMsYixlLGYsbCxoLGQpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1oJiZ2b2lkIDAhPT1oKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5hcmdzPWM7dGhpcy5ib2R5PWI7dGhpcy5kZWNvcmF0b3JfbGlzdD1lO3RoaXMucmV0dXJucz1mO3RoaXMuZG9jc3RyaW5nPWw7dGhpcy5saW5lbm89aDt0aGlzLmNvbF9vZmZzZXQ9ZDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQ2xhc3NEZWY9ZnVuY3Rpb24oYSxjLGIsZSxmLGwsaCxkKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09aCYmdm9pZCAwIT09aCk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZCYmdm9pZCAwIT09ZCk7dGhpcy5uYW1lPWE7dGhpcy5iYXNlcz1jO3RoaXMua2V5d29yZHM9Yjt0aGlzLmJvZHk9ZTt0aGlzLmRlY29yYXRvcl9saXN0PWY7dGhpcy5kb2NzdHJpbmc9bDt0aGlzLmxpbmVubz1oO3RoaXMuY29sX29mZnNldD1kO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SZXR1cm49ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlbGV0ZT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnRhcmdldHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NpZ249XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMudGFyZ2V0cz1hO3RoaXMudmFsdWU9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdWdBc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGFyZ2V0PWE7dGhpcy5vcD1jO3RoaXMudmFsdWU9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ249ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9XG5hO3RoaXMuYW5ub3RhdGlvbj1jO3RoaXMudmFsdWU9Yjt0aGlzLnNpbXBsZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PWw7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkZvcj1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLnRhcmdldD1hO3RoaXMuaXRlcj1jO3RoaXMuYm9keT1iO3RoaXMub3JlbHNlPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuQXN5bmNGb3I9ZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy50YXJnZXQ9YTt0aGlzLml0ZXI9Yzt0aGlzLmJvZHk9Yjt0aGlzLm9yZWxzZT1lO3RoaXMubGluZW5vPWY7dGhpcy5jb2xfb2Zmc2V0PVxubDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2hpbGU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSWY9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMudGVzdD1hO3RoaXMuYm9keT1jO3RoaXMub3JlbHNlPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5pdGVtcz1hO3RoaXMuYm9keT1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkFzeW5jV2l0aD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaXRlbXM9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5SYWlzZT1mdW5jdGlvbihhLGMsYixlLGYsbCl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1sJiZ2b2lkIDAhPT1sKTt0aGlzLmV4Yz1hO3RoaXMuY2F1c2U9Yzt0aGlzLmluc3Q9Yjt0aGlzLnRiYWNrPWU7dGhpcy5saW5lbm89Zjt0aGlzLmNvbF9vZmZzZXQ9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuVHJ5PVxuZnVuY3Rpb24oYSxjLGIsZSxmLGwpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09bCYmdm9pZCAwIT09bCk7dGhpcy5ib2R5PWE7dGhpcy5oYW5kbGVycz1jO3RoaXMub3JlbHNlPWI7dGhpcy5maW5hbGJvZHk9ZTt0aGlzLmxpbmVubz1mO3RoaXMuY29sX29mZnNldD1sO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Bc3NlcnQ9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLnRlc3Q9YTt0aGlzLm1zZz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkltcG9ydD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JbXBvcnRGcm9tPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLm1vZHVsZT1hO3RoaXMubmFtZXM9Yzt0aGlzLmxldmVsPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2xvYmFsPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Ob25sb2NhbD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMubmFtZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHByPWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5QYXNzPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWEmJnZvaWQgMCE9PWEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CcmVhaz1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1cbmEpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTt0aGlzLmxpbmVubz1hO3RoaXMuY29sX29mZnNldD1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Db250aW51ZT1mdW5jdGlvbihhLGMpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1hJiZ2b2lkIDAhPT1hKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7dGhpcy5saW5lbm89YTt0aGlzLmNvbF9vZmZzZXQ9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuUHJpbnQ9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMuZGVzdD1hO3RoaXMudmFsdWVzPWM7dGhpcy5ubD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRlYnVnZ2VyPWZ1bmN0aW9uKGEsYyl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuYSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJvb2xPcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkJpbk9wPWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLmxlZnQ9YTt0aGlzLm9wPWM7dGhpcy5yaWdodD1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlVuYXJ5T3A9XG5mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMub3A9YTt0aGlzLm9wZXJhbmQ9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MYW1iZGE9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmFyZ3M9YTt0aGlzLmJvZHk9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5JZkV4cD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50ZXN0PWE7dGhpcy5ib2R5PWM7dGhpcy5vcmVsc2U9XG5iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkRpY3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmtleXM9YTt0aGlzLnZhbHVlcz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNldD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLmVsdHM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5MaXN0Q29tcD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PVxuZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TZXRDb21wPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7dGhpcy5lbHQ9YTt0aGlzLmdlbmVyYXRvcnM9Yzt0aGlzLmxpbmVubz1iO3RoaXMuY29sX29mZnNldD1lO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5EaWN0Q29tcD1mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy5rZXk9YTt0aGlzLnZhbHVlPWM7dGhpcy5nZW5lcmF0b3JzPWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwPVxuZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdD1hO3RoaXMuZ2VuZXJhdG9ycz1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkF3YWl0PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZD1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9XG5iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5ZaWVsZEZyb209ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZT1hO3RoaXMubGluZW5vPWM7dGhpcy5jb2xfb2Zmc2V0PWI7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbXBhcmU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJnZvaWQgMCE9PWYpO3RoaXMubGVmdD1hO3RoaXMub3BzPWM7dGhpcy5jb21wYXJhdG9ycz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNhbGw9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09ZSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWYmJlxudm9pZCAwIT09Zik7dGhpcy5mdW5jPWE7dGhpcy5hcmdzPWM7dGhpcy5rZXl3b3Jkcz1iO3RoaXMubGluZW5vPWU7dGhpcy5jb2xfb2Zmc2V0PWY7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk51bT1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLm49YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5TdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy5zPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09XG5lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuY29udmVyc2lvbj1jO3RoaXMuZm9ybWF0X3NwZWM9Yjt0aGlzLmxpbmVubz1lO3RoaXMuY29sX29mZnNldD1mO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5Kb2luZWRTdHI9ZnVuY3Rpb24oYSxjLGIpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1jJiZ2b2lkIDAhPT1jKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7dGhpcy52YWx1ZXM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5CeXRlcz1mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnM9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ9XG5mdW5jdGlvbihhLGMsYil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1iKTt0aGlzLnZhbHVlPWE7dGhpcy5saW5lbm89Yzt0aGlzLmNvbF9vZmZzZXQ9YjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuRWxsaXBzaXM9ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YSYmdm9pZCAwIT09YSk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWMmJnZvaWQgMCE9PWMpO3RoaXMubGluZW5vPWE7dGhpcy5jb2xfb2Zmc2V0PWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkNvbnN0YW50PWZ1bmN0aW9uKGEsYyxiKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YyYmdm9pZCAwIT09Yyk7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO3RoaXMudmFsdWU9YTt0aGlzLmxpbmVubz1jO3RoaXMuY29sX29mZnNldD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5BdHRyaWJ1dGU9XG5mdW5jdGlvbihhLGMsYixlLGYpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy52YWx1ZT1hO3RoaXMuYXR0cj1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3Vic2NyaXB0PWZ1bmN0aW9uKGEsYyxiLGUsZil7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1mJiZ2b2lkIDAhPT1mKTt0aGlzLnZhbHVlPWE7dGhpcy5zbGljZT1jO3RoaXMuY3R4PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuU3RhcnJlZD1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO1xudGhpcy52YWx1ZT1hO3RoaXMuY3R4PWM7dGhpcy5saW5lbm89Yjt0aGlzLmNvbF9vZmZzZXQ9ZTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuTmFtZT1mdW5jdGlvbihhLGMsYixlKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09YiYmdm9pZCAwIT09Yik7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWUmJnZvaWQgMCE9PWUpO3RoaXMuaWQ9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkxpc3Q9ZnVuY3Rpb24oYSxjLGIsZSl7U2suYXNzZXJ0cy5hc3NlcnQobnVsbCE9PWImJnZvaWQgMCE9PWIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlR1cGxlPWZ1bmN0aW9uKGEsYyxiLGUpe1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1iJiZ2b2lkIDAhPT1cbmIpO1NrLmFzc2VydHMuYXNzZXJ0KG51bGwhPT1lJiZ2b2lkIDAhPT1lKTt0aGlzLmVsdHM9YTt0aGlzLmN0eD1jO3RoaXMubGluZW5vPWI7dGhpcy5jb2xfb2Zmc2V0PWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLlNsaWNlPWZ1bmN0aW9uKGEsYyxiKXt0aGlzLmxvd2VyPWE7dGhpcy51cHBlcj1jO3RoaXMuc3RlcD1iO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5FeHRTbGljZT1mdW5jdGlvbihhKXt0aGlzLmRpbXM9YTtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuSW5kZXg9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT1hO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYyxiLGUpe3RoaXMudGFyZ2V0PWE7dGhpcy5pdGVyPWM7dGhpcy5pZnM9Yjt0aGlzLmlzX2FzeW5jPWU7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXI9ZnVuY3Rpb24oYSxjLGIsZSxmKXtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZSYmdm9pZCAwIT09XG5lKTtTay5hc3NlcnRzLmFzc2VydChudWxsIT09ZiYmdm9pZCAwIT09Zik7dGhpcy50eXBlPWE7dGhpcy5uYW1lPWM7dGhpcy5ib2R5PWI7dGhpcy5saW5lbm89ZTt0aGlzLmNvbF9vZmZzZXQ9ZjtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJndW1lbnRzXz1mdW5jdGlvbihhLGMsYixlLGYsbCl7dGhpcy5hcmdzPWE7dGhpcy52YXJhcmc9Yzt0aGlzLmt3b25seWFyZ3M9Yjt0aGlzLmt3X2RlZmF1bHRzPWU7dGhpcy5rd2FyZz1mO3RoaXMuZGVmYXVsdHM9bDtyZXR1cm4gdGhpc307U2suYXN0bm9kZXMuYXJnPWZ1bmN0aW9uIGEoYSxjKXt0aGlzLmFyZz1hO3RoaXMuYW5ub3RhdGlvbj1jO3JldHVybiB0aGlzfTtTay5hc3Rub2Rlcy5rZXl3b3JkPWZ1bmN0aW9uKGEsYyl7dGhpcy5hcmc9YTt0aGlzLnZhbHVlPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLmFsaWFzPWZ1bmN0aW9uKGEsYyl7dGhpcy5uYW1lPWE7dGhpcy5hc25hbWU9YztyZXR1cm4gdGhpc307U2suYXN0bm9kZXMud2l0aGl0ZW09XG5mdW5jdGlvbihhLGMpe3RoaXMuY29udGV4dF9leHByPWE7dGhpcy5vcHRpb25hbF92YXJzPWM7cmV0dXJuIHRoaXN9O1NrLmFzdG5vZGVzLk1vZHVsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2R1bGVcIjtTay5hc3Rub2Rlcy5Nb2R1bGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuSW50ZXJhY3RpdmUucHJvdG90eXBlLl9hc3RuYW1lPVwiSW50ZXJhY3RpdmVcIjtTay5hc3Rub2Rlcy5JbnRlcmFjdGl2ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX1dO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhwcmVzc2lvblwiO1NrLmFzdG5vZGVzLkV4cHJlc3Npb24ucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5TdWl0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlN1aXRlXCI7U2suYXN0bm9kZXMuU3VpdGUucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGdW5jdGlvbkRlZlwiO1NrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmLnByb3RvdHlwZS5fZmllbGRzPVtcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0Z1bmN0aW9uRGVmXCI7U2suYXN0bm9kZXMuQXN5bmNGdW5jdGlvbkRlZi5wcm90b3R5cGUuX2ZpZWxkcz1cbltcIm5hbWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcImRlY29yYXRvcl9saXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVjb3JhdG9yX2xpc3R9LFwicmV0dXJuc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnJldHVybnN9LFwiZG9jc3RyaW5nXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZG9jc3RyaW5nfV07U2suYXN0bm9kZXMuQ2xhc3NEZWYucHJvdG90eXBlLl9hc3RuYW1lPVwiQ2xhc3NEZWZcIjtTay5hc3Rub2Rlcy5DbGFzc0RlZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0sXCJiYXNlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJhc2VzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiZGVjb3JhdG9yX2xpc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZWNvcmF0b3JfbGlzdH0sXG5cImRvY3N0cmluZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmRvY3N0cmluZ31dO1NrLmFzdG5vZGVzLlJldHVybi5wcm90b3R5cGUuX2FzdG5hbWU9XCJSZXR1cm5cIjtTay5hc3Rub2Rlcy5SZXR1cm4ucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkRlbGV0ZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJEZWxldGVcIjtTay5hc3Rub2Rlcy5EZWxldGUucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldHN9XTtTay5hc3Rub2Rlcy5Bc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXNzaWduXCI7U2suYXN0bm9kZXMuQXNzaWduLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXRzfSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnQXNzaWduXCI7XG5Tay5hc3Rub2Rlcy5BdWdBc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkFubkFzc2lnbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJBbm5Bc3NpZ25cIjtTay5hc3Rub2Rlcy5Bbm5Bc3NpZ24ucHJvdG90eXBlLl9maWVsZHM9W1widGFyZ2V0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGFyZ2V0fSxcImFubm90YXRpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hbm5vdGF0aW9ufSxcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9LFwic2ltcGxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2ltcGxlfV07U2suYXN0bm9kZXMuRm9yLnByb3RvdHlwZS5fYXN0bmFtZT1cIkZvclwiO1NrLmFzdG5vZGVzLkZvci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0YXJnZXRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YXJnZXR9LFxuXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5Bc3luY0Zvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJBc3luY0ZvclwiO1NrLmFzdG5vZGVzLkFzeW5jRm9yLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaGlsZS5wcm90b3R5cGUuX2FzdG5hbWU9XCJXaGlsZVwiO1NrLmFzdG5vZGVzLldoaWxlLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcImJvZHlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ib2R5fSxcIm9yZWxzZVwiLFxuZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuSWYucHJvdG90eXBlLl9hc3RuYW1lPVwiSWZcIjtTay5hc3Rub2Rlcy5JZi5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ0ZXN0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudGVzdH0sXCJib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYm9keX0sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9XTtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fYXN0bmFtZT1cIldpdGhcIjtTay5hc3Rub2Rlcy5XaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5Bc3luY1dpdGgucHJvdG90eXBlLl9hc3RuYW1lPVwiQXN5bmNXaXRoXCI7U2suYXN0bm9kZXMuQXN5bmNXaXRoLnByb3RvdHlwZS5fZmllbGRzPVtcIml0ZW1zXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlbXN9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtcblNrLmFzdG5vZGVzLlJhaXNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlJhaXNlXCI7U2suYXN0bm9kZXMuUmFpc2UucHJvdG90eXBlLl9maWVsZHM9W1wiZXhjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhjfSxcImNhdXNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2F1c2V9LFwiaW5zdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmluc3R9LFwidGJhY2tcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50YmFja31dO1NrLmFzdG5vZGVzLlRyeS5wcm90b3R5cGUuX2FzdG5hbWU9XCJUcnlcIjtTay5hc3Rub2Rlcy5UcnkucHJvdG90eXBlLl9maWVsZHM9W1wiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwiaGFuZGxlcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5oYW5kbGVyc30sXCJvcmVsc2VcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmVsc2V9LFwiZmluYWxib2R5XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmluYWxib2R5fV07U2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fYXN0bmFtZT1cIkFzc2VydFwiO1xuU2suYXN0bm9kZXMuQXNzZXJ0LnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS50ZXN0fSxcIm1zZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm1zZ31dO1NrLmFzdG5vZGVzLkltcG9ydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbXBvcnRcIjtTay5hc3Rub2Rlcy5JbXBvcnQucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc31dO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiSW1wb3J0RnJvbVwiO1NrLmFzdG5vZGVzLkltcG9ydEZyb20ucHJvdG90eXBlLl9maWVsZHM9W1wibW9kdWxlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubW9kdWxlfSxcIm5hbWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXN9LFwibGV2ZWxcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZXZlbH1dO1NrLmFzdG5vZGVzLkdsb2JhbC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHbG9iYWxcIjtTay5hc3Rub2Rlcy5HbG9iYWwucHJvdG90eXBlLl9maWVsZHM9XG5bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuTm9ubG9jYWwucHJvdG90eXBlLl9hc3RuYW1lPVwiTm9ubG9jYWxcIjtTay5hc3Rub2Rlcy5Ob25sb2NhbC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJuYW1lc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWVzfV07U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2FzdG5hbWU9XCJFeHByXCI7U2suYXN0bm9kZXMuRXhwci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXNzXCI7U2suYXN0bm9kZXMuUGFzcy5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5CcmVhay5wcm90b3R5cGUuX2FzdG5hbWU9XCJCcmVha1wiO1NrLmFzdG5vZGVzLkJyZWFrLnByb3RvdHlwZS5fZmllbGRzPVtdO1NrLmFzdG5vZGVzLkNvbnRpbnVlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbnRpbnVlXCI7U2suYXN0bm9kZXMuQ29udGludWUucHJvdG90eXBlLl9maWVsZHM9XG5bXTtTay5hc3Rub2Rlcy5QcmludC5wcm90b3R5cGUuX2FzdG5hbWU9XCJQcmludFwiO1NrLmFzdG5vZGVzLlByaW50LnByb3RvdHlwZS5fZmllbGRzPVtcImRlc3RcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kZXN0fSxcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc30sXCJubFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5sfV07U2suYXN0bm9kZXMuRGVidWdnZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRGVidWdnZXJcIjtTay5hc3Rub2Rlcy5EZWJ1Z2dlci5wcm90b3R5cGUuX2ZpZWxkcz1bXTtTay5hc3Rub2Rlcy5Cb29sT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQm9vbE9wXCI7U2suYXN0bm9kZXMuQm9vbE9wLnByb3RvdHlwZS5fZmllbGRzPVtcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwidmFsdWVzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWVzfV07U2suYXN0bm9kZXMuQmluT3AucHJvdG90eXBlLl9hc3RuYW1lPVwiQmluT3BcIjtTay5hc3Rub2Rlcy5CaW5PcC5wcm90b3R5cGUuX2ZpZWxkcz1cbltcImxlZnRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sZWZ0fSxcIm9wXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3B9LFwicmlnaHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5yaWdodH1dO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9hc3RuYW1lPVwiVW5hcnlPcFwiO1NrLmFzdG5vZGVzLlVuYXJ5T3AucHJvdG90eXBlLl9maWVsZHM9W1wib3BcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5vcH0sXCJvcGVyYW5kXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BlcmFuZH1dO1NrLmFzdG5vZGVzLkxhbWJkYS5wcm90b3R5cGUuX2FzdG5hbWU9XCJMYW1iZGFcIjtTay5hc3Rub2Rlcy5MYW1iZGEucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ3N9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5JZkV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJZkV4cFwiO1NrLmFzdG5vZGVzLklmRXhwLnByb3RvdHlwZS5fZmllbGRzPVtcInRlc3RcIixcbmZ1bmN0aW9uKGEpe3JldHVybiBhLnRlc3R9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9LFwib3JlbHNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JlbHNlfV07U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJEaWN0XCI7U2suYXN0bm9kZXMuRGljdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5c30sXCJ2YWx1ZXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZXN9XTtTay5hc3Rub2Rlcy5TZXQucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0XCI7U2suYXN0bm9kZXMuU2V0LnByb3RvdHlwZS5fZmllbGRzPVtcImVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHRzfV07U2suYXN0bm9kZXMuTGlzdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiTGlzdENvbXBcIjtTay5hc3Rub2Rlcy5MaXN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5lbHR9LFwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtcblNrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiU2V0Q29tcFwiO1NrLmFzdG5vZGVzLlNldENvbXAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcImdlbmVyYXRvcnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5nZW5lcmF0b3JzfV07U2suYXN0bm9kZXMuRGljdENvbXAucHJvdG90eXBlLl9hc3RuYW1lPVwiRGljdENvbXBcIjtTay5hc3Rub2Rlcy5EaWN0Q29tcC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJrZXlcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rZXl9LFwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0sXCJnZW5lcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VuZXJhdG9yc31dO1NrLmFzdG5vZGVzLkdlbmVyYXRvckV4cC5wcm90b3R5cGUuX2FzdG5hbWU9XCJHZW5lcmF0b3JFeHBcIjtTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHAucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0fSxcblwiZ2VuZXJhdG9yc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmdlbmVyYXRvcnN9XTtTay5hc3Rub2Rlcy5Bd2FpdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBd2FpdFwiO1NrLmFzdG5vZGVzLkF3YWl0LnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJZaWVsZFwiO1NrLmFzdG5vZGVzLllpZWxkLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5ZaWVsZEZyb20ucHJvdG90eXBlLl9hc3RuYW1lPVwiWWllbGRGcm9tXCI7U2suYXN0bm9kZXMuWWllbGRGcm9tLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEudmFsdWV9XTtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNvbXBhcmVcIjtTay5hc3Rub2Rlcy5Db21wYXJlLnByb3RvdHlwZS5fZmllbGRzPVxuW1wibGVmdFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmxlZnR9LFwib3BzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEub3BzfSxcImNvbXBhcmF0b3JzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGFyYXRvcnN9XTtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkNhbGxcIjtTay5hc3Rub2Rlcy5DYWxsLnByb3RvdHlwZS5fZmllbGRzPVtcImZ1bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5mdW5jfSxcImFyZ3NcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hcmdzfSxcImtleXdvcmRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEua2V5d29yZHN9XTtTay5hc3Rub2Rlcy5OdW0ucHJvdG90eXBlLl9hc3RuYW1lPVwiTnVtXCI7U2suYXN0bm9kZXMuTnVtLnByb3RvdHlwZS5fZmllbGRzPVtcIm5cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5ufV07U2suYXN0bm9kZXMuU3RyLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0clwiO1NrLmFzdG5vZGVzLlN0ci5wcm90b3R5cGUuX2ZpZWxkcz1bXCJzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc31dO1xuU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWUucHJvdG90eXBlLl9hc3RuYW1lPVwiRm9ybWF0dGVkVmFsdWVcIjtTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImNvbnZlcnNpb25cIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb252ZXJzaW9ufSxcImZvcm1hdF9zcGVjXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZm9ybWF0X3NwZWN9XTtTay5hc3Rub2Rlcy5Kb2luZWRTdHIucHJvdG90eXBlLl9hc3RuYW1lPVwiSm9pbmVkU3RyXCI7U2suYXN0bm9kZXMuSm9pbmVkU3RyLnByb3RvdHlwZS5fZmllbGRzPVtcInZhbHVlc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlc31dO1NrLmFzdG5vZGVzLkJ5dGVzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJ5dGVzXCI7U2suYXN0bm9kZXMuQnl0ZXMucHJvdG90eXBlLl9maWVsZHM9W1wic1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnN9XTtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVxuXCJOYW1lQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQucHJvdG90eXBlLl9maWVsZHM9W1widmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLkVsbGlwc2lzLnByb3RvdHlwZS5fYXN0bmFtZT1cIkVsbGlwc2lzXCI7U2suYXN0bm9kZXMuRWxsaXBzaXMucHJvdG90eXBlLl9maWVsZHM9W107U2suYXN0bm9kZXMuQ29uc3RhbnQucHJvdG90eXBlLl9hc3RuYW1lPVwiQ29uc3RhbnRcIjtTay5hc3Rub2Rlcy5Db25zdGFudC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQXR0cmlidXRlLnByb3RvdHlwZS5fYXN0bmFtZT1cIkF0dHJpYnV0ZVwiO1NrLmFzdG5vZGVzLkF0dHJpYnV0ZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImF0dHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5hdHRyfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1xuU2suYXN0bm9kZXMuU3Vic2NyaXB0LnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YnNjcmlwdFwiO1NrLmFzdG5vZGVzLlN1YnNjcmlwdC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcInNsaWNlXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2xpY2V9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJTdGFycmVkXCI7U2suYXN0bm9kZXMuU3RhcnJlZC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfSxcImN0eFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmN0eH1dO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9hc3RuYW1lPVwiTmFtZVwiO1NrLmFzdG5vZGVzLk5hbWUucHJvdG90eXBlLl9maWVsZHM9W1wiaWRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5MaXN0LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTGlzdFwiO1NrLmFzdG5vZGVzLkxpc3QucHJvdG90eXBlLl9maWVsZHM9W1wiZWx0c1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmVsdHN9LFwiY3R4XCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3R4fV07U2suYXN0bm9kZXMuVHVwbGUucHJvdG90eXBlLl9hc3RuYW1lPVwiVHVwbGVcIjtTay5hc3Rub2Rlcy5UdXBsZS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJlbHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZWx0c30sXCJjdHhcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHh9XTtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5fYXN0bmFtZT1cIkxvYWRcIjtTay5hc3Rub2Rlcy5Mb2FkLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlN0b3JlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN0b3JlXCI7U2suYXN0bm9kZXMuU3RvcmUucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuRGVsLnByb3RvdHlwZS5fYXN0bmFtZT1cIkRlbFwiO1NrLmFzdG5vZGVzLkRlbC5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnTG9hZFwiO1NrLmFzdG5vZGVzLkF1Z0xvYWQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQXVnU3RvcmUucHJvdG90eXBlLl9hc3RuYW1lPVwiQXVnU3RvcmVcIjtTay5hc3Rub2Rlcy5BdWdTdG9yZS5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5QYXJhbS5wcm90b3R5cGUuX2FzdG5hbWU9XCJQYXJhbVwiO1NrLmFzdG5vZGVzLlBhcmFtLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlNsaWNlLnByb3RvdHlwZS5fYXN0bmFtZT1cIlNsaWNlXCI7U2suYXN0bm9kZXMuU2xpY2UucHJvdG90eXBlLl9maWVsZHM9W1wibG93ZXJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5sb3dlcn0sXCJ1cHBlclwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnVwcGVyfSxcInN0ZXBcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGVwfV07U2suYXN0bm9kZXMuRXh0U2xpY2UucHJvdG90eXBlLl9hc3RuYW1lPVwiRXh0U2xpY2VcIjtcblNrLmFzdG5vZGVzLkV4dFNsaWNlLnByb3RvdHlwZS5fZmllbGRzPVtcImRpbXNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5kaW1zfV07U2suYXN0bm9kZXMuSW5kZXgucHJvdG90eXBlLl9hc3RuYW1lPVwiSW5kZXhcIjtTay5hc3Rub2Rlcy5JbmRleC5wcm90b3R5cGUuX2ZpZWxkcz1bXCJ2YWx1ZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfV07U2suYXN0bm9kZXMuQW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkFuZFwiO1NrLmFzdG5vZGVzLkFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Pci5wcm90b3R5cGUuX2FzdG5hbWU9XCJPclwiO1NrLmFzdG5vZGVzLk9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkFkZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJBZGRcIjtTay5hc3Rub2Rlcy5BZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuU3ViLnByb3RvdHlwZS5fYXN0bmFtZT1cIlN1YlwiO1NrLmFzdG5vZGVzLlN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtcblNrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTXVsdFwiO1NrLmFzdG5vZGVzLk11bHQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNYXRNdWx0XCI7U2suYXN0bm9kZXMuTWF0TXVsdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5EaXYucHJvdG90eXBlLl9hc3RuYW1lPVwiRGl2XCI7U2suYXN0bm9kZXMuRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk1vZC5wcm90b3R5cGUuX2FzdG5hbWU9XCJNb2RcIjtTay5hc3Rub2Rlcy5Nb2QucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuUG93LnByb3RvdHlwZS5fYXN0bmFtZT1cIlBvd1wiO1NrLmFzdG5vZGVzLlBvdy5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MU2hpZnQucHJvdG90eXBlLl9hc3RuYW1lPVwiTFNoaWZ0XCI7U2suYXN0bm9kZXMuTFNoaWZ0LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2FzdG5hbWU9XG5cIlJTaGlmdFwiO1NrLmFzdG5vZGVzLlJTaGlmdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5CaXRPci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRPclwiO1NrLmFzdG5vZGVzLkJpdE9yLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkJpdFhvci5wcm90b3R5cGUuX2FzdG5hbWU9XCJCaXRYb3JcIjtTay5hc3Rub2Rlcy5CaXRYb3IucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuQml0QW5kLnByb3RvdHlwZS5fYXN0bmFtZT1cIkJpdEFuZFwiO1NrLmFzdG5vZGVzLkJpdEFuZC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5GbG9vckRpdi5wcm90b3R5cGUuX2FzdG5hbWU9XCJGbG9vckRpdlwiO1NrLmFzdG5vZGVzLkZsb29yRGl2LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLkludmVydC5wcm90b3R5cGUuX2FzdG5hbWU9XCJJbnZlcnRcIjtTay5hc3Rub2Rlcy5JbnZlcnQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5fYXN0bmFtZT1cblwiTm90XCI7U2suYXN0bm9kZXMuTm90LnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9hc3RuYW1lPVwiVUFkZFwiO1NrLmFzdG5vZGVzLlVBZGQucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2FzdG5hbWU9XCJVU3ViXCI7U2suYXN0bm9kZXMuVVN1Yi5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5FcS5wcm90b3R5cGUuX2FzdG5hbWU9XCJFcVwiO1NrLmFzdG5vZGVzLkVxLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEVxLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEVxXCI7U2suYXN0bm9kZXMuTm90RXEucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuTHQucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRcIjtTay5hc3Rub2Rlcy5MdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5MdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiTHRFXCI7U2suYXN0bm9kZXMuTHRFLnByb3RvdHlwZS5faXNlbnVtPVxuITA7U2suYXN0bm9kZXMuR3QucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RcIjtTay5hc3Rub2Rlcy5HdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5HdEUucHJvdG90eXBlLl9hc3RuYW1lPVwiR3RFXCI7U2suYXN0bm9kZXMuR3RFLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLklzLnByb3RvdHlwZS5fYXN0bmFtZT1cIklzXCI7U2suYXN0bm9kZXMuSXMucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuSXNOb3QucHJvdG90eXBlLl9hc3RuYW1lPVwiSXNOb3RcIjtTay5hc3Rub2Rlcy5Jc05vdC5wcm90b3R5cGUuX2lzZW51bT0hMDtTay5hc3Rub2Rlcy5Jbi5wcm90b3R5cGUuX2FzdG5hbWU9XCJJblwiO1NrLmFzdG5vZGVzLkluLnByb3RvdHlwZS5faXNlbnVtPSEwO1NrLmFzdG5vZGVzLk5vdEluLnByb3RvdHlwZS5fYXN0bmFtZT1cIk5vdEluXCI7U2suYXN0bm9kZXMuTm90SW4ucHJvdG90eXBlLl9pc2VudW09ITA7U2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbi5wcm90b3R5cGUuX2FzdG5hbWU9XG5cImNvbXByZWhlbnNpb25cIjtTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uLnByb3RvdHlwZS5fZmllbGRzPVtcInRhcmdldFwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRhcmdldH0sXCJpdGVyXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXRlcn0sXCJpZnNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pZnN9LFwiaXNfYXN5bmNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5pc19hc3luY31dO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9hc3RuYW1lPVwiRXhjZXB0SGFuZGxlclwiO1NrLmFzdG5vZGVzLkV4Y2VwdEhhbmRsZXIucHJvdG90eXBlLl9maWVsZHM9W1widHlwZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGV9LFwibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYm9keVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJvZHl9XTtTay5hc3Rub2Rlcy5hcmd1bWVudHNfLnByb3RvdHlwZS5fYXN0bmFtZT1cImFyZ3VtZW50c1wiO1NrLmFzdG5vZGVzLmFyZ3VtZW50c18ucHJvdG90eXBlLl9maWVsZHM9XG5bXCJhcmdzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnc30sXCJ2YXJhcmdcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YXJhcmd9LFwia3dvbmx5YXJnc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3b25seWFyZ3N9LFwia3dfZGVmYXVsdHNcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5rd19kZWZhdWx0c30sXCJrd2FyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmt3YXJnfSxcImRlZmF1bHRzXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVmYXVsdHN9XTtTay5hc3Rub2Rlcy5hcmcucHJvdG90eXBlLl9hc3RuYW1lPVwiYXJnXCI7U2suYXN0bm9kZXMuYXJnLnByb3RvdHlwZS5fZmllbGRzPVtcImFyZ1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLmFyZ30sXCJhbm5vdGF0aW9uXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYW5ub3RhdGlvbn1dO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9hc3RuYW1lPVwia2V5d29yZFwiO1NrLmFzdG5vZGVzLmtleXdvcmQucHJvdG90eXBlLl9maWVsZHM9W1wiYXJnXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXJnfSxcblwidmFsdWVcIixmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX1dO1NrLmFzdG5vZGVzLmFsaWFzLnByb3RvdHlwZS5fYXN0bmFtZT1cImFsaWFzXCI7U2suYXN0bm9kZXMuYWxpYXMucHJvdG90eXBlLl9maWVsZHM9W1wibmFtZVwiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9LFwiYXNuYW1lXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXNuYW1lfV07U2suYXN0bm9kZXMud2l0aGl0ZW0ucHJvdG90eXBlLl9hc3RuYW1lPVwid2l0aGl0ZW1cIjtTay5hc3Rub2Rlcy53aXRoaXRlbS5wcm90b3R5cGUuX2ZpZWxkcz1bXCJjb250ZXh0X2V4cHJcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZXh0X2V4cHJ9LFwib3B0aW9uYWxfdmFyc1wiLGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wdGlvbmFsX3ZhcnN9XTtTay5leHBvcnRTeW1ib2woXCJTay5hc3Rub2Rlc1wiLFNrLmFzdG5vZGVzKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLmNfZW5jb2Rpbmc9YTt0aGlzLmNfZmlsZW5hbWU9Yjt0aGlzLmNfZmxhZ3M9XG5jfHwwfWZ1bmN0aW9uIGMoYSl7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YSxcIm5vZGUgbXVzdCBiZSBkZWZpbmVkXCIpO3JldHVybiBudWxsPT09YS5jaGlsZHJlbj8wOmEuY2hpbGRyZW4ubGVuZ3RofWZ1bmN0aW9uIGIoYSxiKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwibm9kZSBtdXN0IGJlIGRlZmluZWRcIik7U2suYXNzZXJ0cy5hc3NlcnQodm9pZCAwIT09YixcImluZGV4IG9mIGNoaWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO3JldHVybiBhLmNoaWxkcmVuW2JdfWZ1bmN0aW9uIGUoYSxiKXtTay5hc3NlcnRzLmFzc2VydChhLnR5cGU9PT1iLFwibm9kZSB3YXNuJ3QgZXhwZWN0ZWQgdHlwZVwiKX1mdW5jdGlvbiBmKGEsYixjKXt0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLGEuY19maWxlbmFtZSxiLmxpbmVubyk7fWZ1bmN0aW9uIGwoYSl7U2suYXNzZXJ0cy5hc3NlcnQoXCJzdHJpbmdcIj09PXR5cGVvZiBhLFwiZXhwZWN0aW5nIHN0cmluZywgZ290IFwiK3R5cGVvZiBhKTtcbnJldHVybiBuZXcgU2suYnVpbHRpbi5zdHIoYSl9ZnVuY3Rpb24gaChhKXt2YXIgZCxlO3N3aXRjaChhLnR5cGUpe2Nhc2Ugci5zaW5nbGVfaW5wdXQ6aWYoYihhLDApLnR5cGU9PT16LlRfTkVXTElORSlicmVhaztlbHNlIHJldHVybiBoKGIoYSwwKSk7Y2FzZSByLmZpbGVfaW5wdXQ6Zm9yKGQ9ZT0wO2Q8YyhhKTsrK2Qpe3ZhciBmPWIoYSxkKTtmLnR5cGU9PT1yLnN0bXQmJihlKz1oKGYpKX1yZXR1cm4gZTtjYXNlIHIuc3RtdDpyZXR1cm4gaChiKGEsMCkpO2Nhc2Ugci5jb21wb3VuZF9zdG10OnJldHVybiAxO2Nhc2Ugci5zaW1wbGVfc3RtdDpyZXR1cm4gTWF0aC5mbG9vcihjKGEpLzIpO2Nhc2Ugci5zdWl0ZTppZigxPT09YyhhKSlyZXR1cm4gaChiKGEsMCkpO2U9MDtmb3IoZD0yO2Q8YyhhKS0xOysrZCllKz1oKGIoYSxkKSk7cmV0dXJuIGU7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJOb24tc3RhdGVtZW50IGZvdW5kXCIpfXJldHVybiAwfWZ1bmN0aW9uIGQoYSxiLGMsZCl7YyBpbnN0YW5jZW9mXG5Tay5idWlsdGluLnN0ciYmKGM9Yy52KTtpZihcIk5vbmVcIj09PWMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIE5vbmVcIixhLmNfZmlsZW5hbWUsZCk7aWYoXCJUcnVlXCI9PT1jfHxcIkZhbHNlXCI9PT1jKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlblwiLGEuY19maWxlbmFtZSxkKTt9ZnVuY3Rpb24gZyhhLGIsYyxlKXt2YXIgZjtTay5hc3NlcnRzLmFzc2VydChjIT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJmMhPT1Tay5hc3Rub2Rlcy5BdWdMb2FkLFwiY29udGV4dCBub3QgQXVnU3RvcmUgb3IgQXVnTG9hZFwiKTt2YXIgaD1mPW51bGw7c3dpdGNoKGIuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOmNhc2UgU2suYXN0bm9kZXMuTmFtZTpjPT09U2suYXN0bm9kZXMuU3RvcmUmJmQoYSxlLGIuYXR0cixlLmxpbmVubyk7Yi5jdHg9YzticmVhaztcbmNhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpiLmN0eD1jO2coYSxiLnZhbHVlLGMsZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yi5jdHg9YzticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3Q6Yi5jdHg9YztmPWIuZWx0czticmVhaztjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOmlmKDA9PT1iLmVsdHMubGVuZ3RoKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgYXNzaWduIHRvICgpXCIsYS5jX2ZpbGVuYW1lLGUubGluZW5vKTtiLmN0eD1jO2Y9Yi5lbHRzO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGFtYmRhOmg9XCJsYW1iZGFcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6aD1cImZ1bmN0aW9uIGNhbGxcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDpjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOmNhc2UgU2suYXN0bm9kZXMuVW5hcnlPcDpoPVwib3BlcmF0b3JcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDpoPVwiZ2VuZXJhdG9yIGV4cHJlc3Npb25cIjtcbmJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuWWllbGQ6aD1cInlpZWxkIGV4cHJlc3Npb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOmg9XCJsaXN0IGNvbXByZWhlbnNpb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6aD1cInNldCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0Q29tcDpoPVwiZGljdCBjb21wcmVoZW5zaW9uXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EaWN0OmNhc2UgU2suYXN0bm9kZXMuU2V0OmNhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmg9XCJsaXRlcmFsXCI7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6aD1cIlRydWUsIEZhbHNlIG9yIE5vbmVcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6aD1cImNvbXBhcmlzb25cIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJlcHI6aD1cInJlcHJcIjticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOmg9XCJjb25kaXRpb25hbCBleHByZXNzaW9uXCI7XG5icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnRcIil9aWYoaCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImNhbid0IFwiKyhjPT09U2suYXN0bm9kZXMuU3RvcmU/XCJhc3NpZ24gdG9cIjpcImRlbGV0ZVwiKStcIiBcIitoLGEuY19maWxlbmFtZSxlLmxpbmVubyk7aWYoZilmb3IoYj0wO2I8Zi5sZW5ndGg7KytiKWcoYSxmW2JdLGMsZSl9ZnVuY3Rpb24gbihhKXtpZih2b2lkIDA9PT1PW2EudHlwZV0pdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEudHlwZSxhLmxpbmVubyk7cmV0dXJuIE9bYS50eXBlXX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIGEudmFsdWU/bmV3IFNrLmJ1aWx0aW4uc3RyKGEudmFsdWUpOm5ldyBTay5idWlsdGluLnN0cihhKX1mdW5jdGlvbiBwKGEsZCl7ZShkLHIuY29tcF9vcCk7aWYoMT09PWMoZCkpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSB6LlRfTEVTUzpyZXR1cm4gU2suYXN0bm9kZXMuTHQ7XG5jYXNlIHouVF9HUkVBVEVSOnJldHVybiBTay5hc3Rub2Rlcy5HdDtjYXNlIHouVF9FUUVRVUFMOnJldHVybiBTay5hc3Rub2Rlcy5FcTtjYXNlIHouVF9MRVNTRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkx0RTtjYXNlIHouVF9HUkVBVEVSRVFVQUw6cmV0dXJuIFNrLmFzdG5vZGVzLkd0RTtjYXNlIHouVF9OT1RFUVVBTDpyZXR1cm4gU2suYXN0bm9kZXMuTm90RXE7Y2FzZSB6LlRfTkFNRTppZihcImluXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5JbjtpZihcImlzXCI9PT1kLnZhbHVlKXJldHVybiBTay5hc3Rub2Rlcy5Jc31lbHNlIGlmKDI9PT1jKGQpJiZiKGQsMCkudHlwZT09PXouVF9OQU1FKXtpZihcImluXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIFNrLmFzdG5vZGVzLk5vdEluO2lmKFwiaXNcIj09PWIoZCwwKS52YWx1ZSlyZXR1cm4gU2suYXN0bm9kZXMuSXNOb3R9U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBjb21wX29wXCIpfWZ1bmN0aW9uIHUoYSxiKXthJiYoYS5saW5lbm89XG5iLmxpbmVubyxhLmNvbF9vZmZzZXQ9Yi5jb2xfb2Zmc2V0LGEuZW5kX2xpbmVubz1iLmVuZF9saW5lbm8sYS5lbmRfY29sX29mZnNldD1iLmVuZF9jb2xfb2Zmc2V0KTtyZXR1cm4gYX1mdW5jdGlvbiBBKGEsZCl7dmFyIGUsZj1bXTtTay5hc3NlcnRzLmFzc2VydChkLnR5cGU9PT1yLnRlc3RsaXN0fHxkLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcnx8ZC50eXBlPT09ci5saXN0bWFrZXJ8fGQudHlwZT09PXIudGVzdGxpc3RfY29tcHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zYWZlfHxkLnR5cGU9PT1yLnRlc3RsaXN0MSxcIm5vZGUgdHlwZSBtdXN0IGJlIGxpc3RsaWtlXCIpO2ZvcihlPTA7ZTxjKGQpO2UrPTIpU2suYXNzZXJ0cy5hc3NlcnQoYihkLGUpLnR5cGU9PT1yLnRlc3R8fGIoZCxlKS50eXBlPT09ci5vbGRfdGVzdHx8YihkLGUpLnR5cGU9PT1yLnN0YXJfZXhwciksZltlLzJdPXcoYSxiKGQsZSkpO3JldHVybiBmfWZ1bmN0aW9uIHQoYSxkKXt2YXIgZjtlKGQsci5zdWl0ZSk7XG52YXIgZz1bXTt2YXIgaz0wO2lmKGIoZCwwKS50eXBlPT09ci5zaW1wbGVfc3RtdCl7ZD1iKGQsMCk7dmFyIHg9YyhkKS0xO2IoZCx4LTEpLnR5cGU9PT16LlRfU0VNSSYmLS14O2ZvcihmPTA7Zjx4O2YrPTIpZ1trKytdPU4oYSxiKGQsZikpfWVsc2UgZm9yKGY9MjtmPGMoZCktMTsrK2Ype3g9YihkLGYpO2UoeCxyLnN0bXQpO3ZhciBuPWgoeCk7aWYoMT09PW4pZ1trKytdPU4oYSx4KTtlbHNlIGZvcih4PWIoeCwwKSxlKHgsci5zaW1wbGVfc3RtdCksbj0wO248Yyh4KTtuKz0yKXtpZigwPT09YyhiKHgsbikpKXtTay5hc3NlcnRzLmFzc2VydChuKzE9PT1jKHgpKTticmVha31nW2srK109TihhLGIoeCxuKSl9fVNrLmFzc2VydHMuYXNzZXJ0KGs9PT1oKGQpKTtyZXR1cm4gZ31mdW5jdGlvbiB2KGEsZCxmKXt2YXIgaDtlKGQsci5leHBybGlzdCk7dmFyIGs9W107Zm9yKGg9MDtoPGMoZCk7aCs9Mil7dmFyIHg9dyhhLGIoZCxoKSk7a1toLzJdPXg7ZiYmZyhhLHgsZixiKGQsaCkpfXJldHVybiBrfVxuZnVuY3Rpb24gQihhLGQpe2E6Zm9yKDs7KXN3aXRjaChkLnR5cGUpe2Nhc2Ugci5pbXBvcnRfYXNfbmFtZTphPW51bGw7dmFyIGU9bChiKGQsMCkudmFsdWUpOzM9PT1jKGQpJiYoYT1iKGQsMikudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMoZSxudWxsPT1hP251bGw6bChhKSk7Y2FzZSByLmRvdHRlZF9hc19uYW1lOmlmKDE9PT1jKGQpKXtkPWIoZCwwKTtjb250aW51ZSBhfWVsc2UgcmV0dXJuIGE9QihhLGIoZCwwKSksU2suYXNzZXJ0cy5hc3NlcnQoIWEuYXNuYW1lKSxhLmFzbmFtZT1sKGIoZCwyKS52YWx1ZSksYTtjYXNlIHIuZG90dGVkX25hbWU6aWYoMT09PWMoZCkpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hbGlhcyhsKGIoZCwwKS52YWx1ZSksbnVsbCk7YT1cIlwiO2ZvcihlPTA7ZTxjKGQpO2UrPTIpYSs9YihkLGUpLnZhbHVlK1wiLlwiO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChhLnN1YnN0cigwLGEubGVuZ3RoLTEpKSxudWxsKTtjYXNlIHouVF9TVEFSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuYWxpYXMobChcIipcIiksXG5udWxsKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwidW5leHBlY3RlZCBpbXBvcnQgbmFtZVwiLGEuY19maWxlbmFtZSxkLmxpbmVubyk7fX1mdW5jdGlvbiBEKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYi50eXBlPT1yLnRlc3RsaXN0X2NvbXB8fGIudHlwZT09ci5hcmd1bWVudCk7cmV0dXJuIGFhKGEsYiwwKX1mdW5jdGlvbiBFKGEsZCl7aWYoYihkLDApLnR5cGU9PT16LlRfTUlOVVMmJjI9PT1jKGQpKXt2YXIgZT1iKGQsMSk7aWYoZS50eXBlPT09ci5mYWN0b3ImJjE9PT1jKGUpJiYoZT1iKGUsMCksZS50eXBlPT09ci5wb3dlciYmMT09PWMoZSkpKXt2YXIgZj1iKGUsMCk7aWYoZi50eXBlPT09ci5hdG9tJiYoZT1iKGYsMCksZS50eXBlPT09ei5UX05VTUJFUikpcmV0dXJuIGUudmFsdWU9XCItXCIrZS52YWx1ZSxSKGEsZil9fWE9dyhhLGIoZCwxKSk7c3dpdGNoKGIoZCwwKS50eXBlKXtjYXNlIHouVF9QTFVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VQWRkLFxuYSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX01JTlVTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuVW5hcnlPcChTay5hc3Rub2Rlcy5VU3ViLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHouVF9USUxERTpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuSW52ZXJ0LGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1Tay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgZmFjdG9yXCIpfWZ1bmN0aW9uIEYoYSxnLGgsayl7dmFyIHgsbixsO2UoZyxyLmFyZ2xpc3QpO2Zvcih4PWw9bj0wO3g8YyhnKTt4Kyspe3ZhciBwPWIoZyx4KTtwLnR5cGU9PXIuYXJndW1lbnQmJigxPT1jKHApP24rKzpiKHAsMSkudHlwZT09ci5jb21wX2Zvcj8obisrLGt8fGYoYSxwLFwiaW52YWxpZCBzeW50YXhcIiksMTxjKGcpJiZmKGEscCxcIkdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZFwiKSk6YihwLDApLnR5cGU9PXouVF9TVEFSP24rKzpsKyspfXZhciBTPVxuW107dmFyIG09W107Zm9yKHg9az1sPW49MDt4PGMoZyk7eCsrKWlmKHA9YihnLHgpLHAudHlwZT09ci5hcmd1bWVudCl7dmFyIEo9YihwLDApO2lmKDE9PWMocCkpe2wmJihrP2YoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnQgdW5wYWNraW5nXCIpOmYoYSxKLFwicG9zaXRpb25hbCBhcmd1bWVudCBmb2xsb3dzIGtleXdvcmQgYXJndW1lbnRcIikpO3ZhciBLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtTW24rK109S31lbHNlIGlmKEoudHlwZT09ei5UX1NUQVIpe2lmKGspcmV0dXJuIGYoYSxKLFwiaXRlcmFibGUgYXJndW1lbnQgdW5wYWNraW5nIGZvbGxvd3Mga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmdcIiksbnVsbDtLPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLlN0YXJyZWQoSyxTay5hc3Rub2Rlcy5Mb2FkLEoubGluZW5vLEouY29sX29mZnNldCk7U1tuKytdPXB9ZWxzZSBpZihKLnR5cGU9PXouVF9ET1VCTEVTVEFSKXt4Kys7XG5LPXcoYSxiKHAsMSkpO2lmKCFLKXJldHVybiBudWxsO3A9bmV3IFNrLmFzdG5vZGVzLmtleXdvcmQobnVsbCxLKTttW2wrK109cDtrKyt9ZWxzZSBpZihiKHAsMSkudHlwZT09ci5jb21wX2Zvcil7Sz1EKGEscCk7aWYoIUspcmV0dXJuIG51bGw7U1tuKytdPUt9ZWxzZXt2YXIgdTtLPXcoYSxKKTtpZighSylyZXR1cm4gbnVsbDtpZihLLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuTGFtYmRhKXJldHVybiBmKGEsSixcImxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50XCIpLG51bGw7aWYoSy5jb25zdHJ1Y3RvciE9PVNrLmFzdG5vZGVzLk5hbWUpcmV0dXJuIGYoYSxKLFwia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uXCIpLG51bGw7aWYoZChhLEsuaWQscCwxKSlyZXR1cm4gbnVsbDt2YXIgQT1LLmlkO2Zvcih1PTA7dTxsO3UrKylpZigoSz1tW3VdLmFyZykmJks9PT1BKXJldHVybiBmKGEsSixcImtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWRcIiksbnVsbDtLPXcoYSxiKHAsXG4yKSk7aWYoIUspcmV0dXJuIG51bGw7cD1uZXcgU2suYXN0bm9kZXMua2V5d29yZChBLEspO21bbCsrXT1wfX1yZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNhbGwoaCxTLG0saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1mdW5jdGlvbiBNKGEsZCxmKXtlKGQsci50cmFpbGVyKTtpZihiKGQsMCkudHlwZT09ei5UX0xQQVIpcmV0dXJuIDI9PWMoZCk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoZixudWxsLG51bGwsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpGKGEsYihkLDEpLGYsITApO2lmKGIoZCwwKS50eXBlPT16LlRfRE9UKXt2YXIgZz1rKGIoZCwxKSk7cmV0dXJuIGc/bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShmLGcsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpOm51bGx9ZShiKGQsMCksei5UX0xTUUIpO2UoYihkLDIpLHouVF9SU1FCKTtkPWIoZCwxKTtpZigxPT1jKGQpKXJldHVybihnPUkoYSxiKGQsMCkpKT9uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsZyxcblNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpudWxsO3ZhciBoLG49MSx4PVtdO2ZvcihoPTA7aDxjKGQpO2grPTIpe2c9SShhLGIoZCxoKSk7aWYoIWcpcmV0dXJuIG51bGw7Zy5raW5kIT1aLkluZGV4X2tpbmQmJihuPTApO3hbaC8yXT1nfWlmKCFuKXJldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkV4dFNsaWNlKHgpLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTthPVtdO2ZvcihoPTA7aDx4Lmxlbmd0aDsrK2gpZz14W2hdLFNrLmFzc2VydHMuYXNzZXJ0KGcua2luZD09Wi5JbmRleF9raW5kJiZnLnYuSW5kZXgudmFsdWUpLGFbaF09Zy52LkluZGV4LnZhbHVlO2c9bmV3IFNrLmFzdG5vZGVzLlR1cGxlKGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGYsbmV3IFNrLmFzdG5vZGVzLkluZGV4KGcpLFNrLmFzdG5vZGVzLkxvYWQsXG5kLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFYoYSxkKXtlKGQsci5mbG93X3N0bXQpO3ZhciBnPWIoZCwwKTtzd2l0Y2goZy50eXBlKXtjYXNlIHIuYnJlYWtfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkJyZWFrKGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7Y2FzZSByLmNvbnRpbnVlX3N0bXQ6cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Db250aW51ZShkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO2Nhc2Ugci55aWVsZF9zdG10OnJldHVybihhPXcoYSxiKGcsMCkpKT9uZXcgU2suYXN0bm9kZXMuRXhwcihhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6bnVsbDtjYXNlIHIucmV0dXJuX3N0bXQ6aWYoMT09YyhnKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlJldHVybihudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sXG5kLmVuZF9jb2xfb2Zmc2V0KTt2YXIgaD1XKGEsYihnLDEpKTtyZXR1cm4gaD9uZXcgU2suYXN0bm9kZXMuUmV0dXJuKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsO2Nhc2Ugci5yYWlzZV9zdG10OmlmKDE9PWMoZykpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5SYWlzZShudWxsLG51bGwsbnVsbCxudWxsLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7aWYoMjw9YyhnKSl7dmFyIGs9bnVsbDtoPXcoYSxiKGcsMSkpO3ZhciBuPW51bGwseD1udWxsOzQ9PWMoZykmJlwiZnJvbVwiPT1iKGcsMikudmFsdWU/KFNrLl9fZnV0dXJlX18ucHl0aG9uM3x8ZihhLGIoZywyKSxcInJhaXNlIC4uLiBmcm9tIC4uLiBpcyBub3QgYXZhaWxhYmxlIGluIFB5dGhvbiAyXCIpLGs9dyhhLGIoZywzKSkpOjQ8PWMoZykmJlwiLFwiPT1iKGcsMikudmFsdWUmJihTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJmYoYSxcbmQsXCJPbGQgcmFpc2Ugc3ludGF4IGlzIG5vdCBhdmFpbGFibGUgaW4gUHl0aG9uIDNcIiksbj13KGEsYihnLDMpKSw2PT1jKGcpJiYoeD13KGEsYihnLDUpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUmFpc2UoaCxrLG4seCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpfWRlZmF1bHQ6cmV0dXJuIFNrLmFzc2VydHMuZmFpbChcInVuZXhwZWN0ZWQgZmxvd19zdG10OiBcIixnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIHkoYSxlKXt2YXIgZj1udWxsO1NrLmFzc2VydHMuYXNzZXJ0KGUudHlwZT09PXIudGZwZGVmfHxlLnR5cGU9PT1yLnZmcGRlZik7dmFyIGc9YihlLDApO2QoYSxnLGcudmFsdWUsZy5saW5lbm8pO2c9bChnLnZhbHVlKTszPT1jKGUpJiZiKGUsMSkudHlwZT09PXouVF9DT0xPTiYmKGY9dyhhLGIoZSwyKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuYXJnKGcsZixlLmxpbmVubyxlLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIEcoYSxcbmUsZyxoLGspe3ZhciBuPWcseD0wO2h8fGYoYSxiKGUsZyksXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIpO2ZvcihTay5hc3NlcnRzLmFzc2VydChrKTtuPGMoZSk7KXt2YXIgcD1iKGUsbik7c3dpdGNoKHAudHlwZSl7Y2FzZSByLnZmcGRlZjpjYXNlIHIudGZwZGVmOm4rMTxjKGUpJiZiKGUsbisxKS50eXBlPT16LlRfRVFVQUw/KGtbeF09dyhhLGIoZSxuKzIpKSxuKz0yKTprW3hdPW51bGw7dmFyIG09Mz09YyhwKT93KGEsYihwLDIpKTpudWxsO3A9YihwLDApO2QoYSxwLHAudmFsdWUscC5saW5lbm8pO2c9bChwLnZhbHVlKTtoW3grK109bmV3IFNrLmFzdG5vZGVzLmFyZyhnLG0scC5saW5lbm8scC5jb2xfb2Zmc2V0KTtuKz0yO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6cmV0dXJuIG47ZGVmYXVsdDpmKGEscCxcInVuZXhwZWN0ZWQgbm9kZVwiKX19cmV0dXJuIG59ZnVuY3Rpb24gTChhLGQpe3ZhciBlLGYsZyxoPVtdLGs9W10sbj1bXSx4PVtdLGw9bnVsbCxcbnA9bnVsbDtpZihkLnR5cGU9PT1yLnBhcmFtZXRlcnMpe2lmKDI9PT1jKGQpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLFtdLFtdLG51bGwsW10pO2Q9YihkLDEpfVNrLmFzc2VydHMuYXNzZXJ0KGQudHlwZT09PXIudmFyYXJnc2xpc3R8fGQudHlwZT09PXIudHlwZWRhcmdzbGlzdCk7Zm9yKGU9Zj1nPTA7ZzxjKGQpOyl7dmFyIG09YihkLGcpO3N3aXRjaChtLnR5cGUpe2Nhc2Ugci50ZnBkZWY6Y2FzZSByLnZmcGRlZjppZihnKzE8YyhkKSYmYihkLGcrMSkudHlwZT09ei5UX0VRVUFMKXtrW2YrK109dyhhLGIoZCxnKzIpKTtnKz0yO3ZhciBKPTF9ZWxzZSBpZihKKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwibm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50XCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTtoW2UrK109eShhLG0pO2crPTI7YnJlYWs7Y2FzZSB6LlRfU1RBUjppZihnKzE+PWMoZCl8fGcrMj09XG5jKGQpJiZiKGQsZysxKS50eXBlPT16LlRfQ09NTUEpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqXCIsYS5jX2ZpbGVuYW1lLGQubGluZW5vKTttPWIoZCxnKzEpO20udHlwZT09ei5UX0NPTU1BPyhnKz0yLGc9RyhhLGQsZyxuLHgpKToobD15KGEsbSksZys9MyxnPGMoZCkmJihiKGQsZykudHlwZT09ci50ZnBkZWZ8fGIoZCxnKS50eXBlPT1yLnZmcGRlZikmJihnPUcoYSxkLGcsbix4KSkpO2JyZWFrO2Nhc2Ugei5UX0RPVUJMRVNUQVI6bT1iKGQsZysxKTtTay5hc3NlcnRzLmFzc2VydChtLnR5cGU9PXIudGZwZGVmfHxtLnR5cGU9PXIudmZwZGVmKTtwPXkoYSxtKTtnKz0zO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5leHBlY3RlZCBub2RlIGluIHZhcmFyZ3NsaXN0XCIpO3JldHVybn19cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5hcmd1bWVudHNfKGgsbCxuLHgscCxrKX1mdW5jdGlvbiBUKGEsXG5nLGgsbil7dmFyIHg9bj9iKGcsMSk6ZyxsPW51bGwscD0xLG09bnVsbDtpZihuJiY1PmEuY19mZWF0dXJlX3ZlcnNpb24pcmV0dXJuIGYoYSx4LFwiQXN5bmMgZnVuY3Rpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBQeXRob24gMy41IGFuZCBncmVhdGVyXCIpLG51bGw7ZSh4LHIuZnVuY2RlZik7dmFyIFM9ayhiKHgscCkpO2lmKGQoYSxTLGIoeCxwKSwwKSlyZXR1cm4gbnVsbDt2YXIgSj1MKGEsYih4LHArMSkpO2lmKCFKKXJldHVybiBudWxsO2lmKGIoeCxwKzIpLnR5cGU9PXouVF9SQVJST1cpe2w9dyhhLGIoeCxwKzMpKTtpZighbClyZXR1cm4gbnVsbDtwKz0yfWlmKGIoeCxwKzMpLnR5cGU9PXouVF9UWVBFX0NPTU1FTlQpe209ei5UX05FV19UWVBFX0NPTU1FTlQoYih4LHArMykpO2lmKCFtKXJldHVybiBudWxsO3ArPTF9dmFyIEs9dChhLGIoeCxwKzMpKTtpZighSylyZXR1cm4gbnVsbDtpZigxPGMoYih4LHArMykpJiYocD1iKGIoeCxwKzMpLDEpLHAudHlwZT09ei5UX1RZUEVfQ09NTUVOVCkpe2lmKG51bGwhPVxubSlyZXR1cm4gZihhLHgsXCJDYW5ub3QgaGF2ZSB0d28gdHlwZSBjb21tZW50cyBvbiBkZWZcIiksbnVsbDttPXouVF9ORVdfVFlQRV9DT01NRU5UKHApO2lmKCFtKXJldHVybiBudWxsfXJldHVybiBuP25ldyBTay5hc3Rub2Rlcy5Bc3luY0Z1bmN0aW9uRGVmKFMsSixLLGgsbCxtLGcubGluZW5vLGcuY29sX29mZnNldCx2b2lkIDAsdm9pZCAwKTpuZXcgU2suYXN0bm9kZXMuRnVuY3Rpb25EZWYoUyxKLEssaCxsLG0seC5saW5lbm8seC5jb2xfb2Zmc2V0LHZvaWQgMCx2b2lkIDApfWZ1bmN0aW9uIFAoYSxmLGcpe2UoZixyLmNsYXNzZGVmKTtpZig0PT1jKGYpKXt2YXIgaD10KGEsYihmLDMpKTt2YXIgbj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwzKSxuLGYubGluZW5vKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNsYXNzRGVmKG4sW10sW10saCxnLG51bGwsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KX1pZihiKGYsMykudHlwZT09PXouVF9SUEFSKXJldHVybiBoPXQoYSxiKGYsNSkpLG49XG5rKGIoZiwxKS52YWx1ZSksZChhLGIoZiwzKSxuLGIoZiwzKS5saW5lbm8pLG5ldyBTay5hc3Rub2Rlcy5DbGFzc0RlZihuLFtdLFtdLGgsZyxudWxsLGYubGluZW5vLGYuY29sX29mZnNldCk7bj1rKGIoZiwxKSk7bj1uZXcgU2suYXN0bm9kZXMuTmFtZShuLFNrLmFzdG5vZGVzLkxvYWQsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTt2YXIgbD1GKGEsYihmLDMpLG4sITEpO2g9dChhLGIoZiw2KSk7bj1rKGIoZiwxKS52YWx1ZSk7ZChhLGIoZiwxKSxuLGIoZiwxKS5saW5lbm8pO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQ2xhc3NEZWYobixsLmFyZ3MsbC5rZXl3b3JkcyxoLGcsbnVsbCxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIFEoYSxkKXtmdW5jdGlvbiBmKGEsZCl7Zm9yKGE9MDs7KXtlKGQsci5jb21wX2l0ZXIpO2lmKGIoZCwwKS50eXBlPT09ci5jb21wX2ZvcilyZXR1cm4gYTtkPWIoZCwwKTtlKGQsci5jb21wX2lmKTthKys7aWYoMj09PWMoZCkpcmV0dXJuIGE7ZD1cbmIoZCwyKX19dmFyIGc7dmFyIGg9ZnVuY3Rpb24oYSxkKXthPTA7YTpmb3IoOzspe2ErKztlKGQsci5jb21wX2Zvcik7aWYoNT09PWMoZCkpZD1iKGQsNCk7ZWxzZSByZXR1cm4gYTtiOmZvcig7Oyl7ZShkLHIuY29tcF9pdGVyKTtkPWIoZCwwKTtpZihkLnR5cGU9PT1yLmNvbXBfZm9yKWNvbnRpbnVlIGE7ZWxzZSBpZihkLnR5cGU9PT1yLmNvbXBfaWYpaWYoMz09PWMoZCkpe2Q9YihkLDIpO2NvbnRpbnVlIGJ9ZWxzZSByZXR1cm4gYTticmVha31icmVha31Tay5hc3NlcnRzLmZhaWwoXCJsb2dpYyBlcnJvciBpbiBjb3VudENvbXBGb3JzXCIpfShhLGQpO3ZhciBrPVtdO2ZvcihnPTA7ZzxoOysrZyl7ZShkLHIuY29tcF9mb3IpO3ZhciBuPWIoZCwxKTt2YXIgbD12KGEsbixTay5hc3Rub2Rlcy5TdG9yZSk7dmFyIHA9dyhhLGIoZCwzKSk7dmFyIHg9MT09PWMobik/bmV3IFNrLmFzdG5vZGVzLmNvbXByZWhlbnNpb24obFswXSxwLFtdKTpuZXcgU2suYXN0bm9kZXMuY29tcHJlaGVuc2lvbihuZXcgU2suYXN0bm9kZXMuVHVwbGUobCxcblNrLmFzdG5vZGVzLlN0b3JlLGQubGluZW5vLGQuY29sX29mZnNldCkscCxbXSk7aWYoNT09PWMoZCkpe2Q9YihkLDQpO3ZhciBtPWYoYSxkKTtuPVtdO2ZvcihsPTA7bDxtOysrbCllKGQsci5jb21wX2l0ZXIpLGQ9YihkLDApLGUoZCxyLmNvbXBfaWYpLHA9dyhhLGIoZCwxKSksbltsXT1wLDM9PT1jKGQpJiYoZD1iKGQsMikpO2QudHlwZT09PXIuY29tcF9pdGVyJiYoZD1iKGQsMCkpO3guaWZzPW59a1tnXT14fXJldHVybiBrfWZ1bmN0aW9uIFUoYSxkKXt2YXIgZj1bXTthOnt2YXIgZz1kO3ZhciBoPTA7Yjpmb3IoOzspe3ZhciBrPTA7aCsrO2UoZyxyLmNvbXBfZm9yKTtiKGcsMCkudHlwZT09ei5UX0FTWU5DJiYoaz0xKTtpZihjKGcpPT01K2spZz1iKGcsNCtrKTtlbHNlIGJyZWFrIGE7Yzpmb3IoOzspe2UoZyxyLmNvbXBfaXRlcik7Zz1iKGcsMCk7aWYoZy50eXBlPT09ci5jb21wX2Zvciljb250aW51ZSBiO2Vsc2UgaWYoZy50eXBlPT09ci5jb21wX2lmKWlmKDM9PT1jKGcpKXtnPVxuYihnLDIpO2NvbnRpbnVlIGN9ZWxzZSBicmVhayBhO2JyZWFrfWJyZWFrfWg9dm9pZCAwfWZvcihnPTA7ZzxoO2crKyl7dmFyIG49MDtiKGQsMCkudHlwZT09ei5UX0FTWU5DJiYobj0xKTt2YXIgbD1iKGQsMStuKTt2YXIgcD12KGEsbCxTay5hc3Rub2Rlcy5TdG9yZSk7aWYoIXApcmV0dXJuIG51bGw7az13KGEsYihkLDMrbikpO2lmKCFrKXJldHVybiBudWxsO3ZhciB4PXBbMF07cD0xPT1jKGwpP25ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKHgsayxudWxsLG4pOm5ldyBTay5hc3Rub2Rlcy5jb21wcmVoZW5zaW9uKG5ldyBTay5hc3Rub2Rlcy5UdXBsZShwLFNrLmFzdG5vZGVzLlN0b3JlLHgubGluZW5vLHguY29sX29mZnNldCxsLmVuZF9saW5lbm8sbC5lbmRfY29sX29mZnNldCksayxudWxsLG4pO2lmKGMoZCk9PTUrbil7eD1bXTtkPWIoZCw0K24pO2E6Zm9yKGs9ZCxuPTA7Oyl7ZShrLHIuY29tcF9pdGVyKTtpZihiKGssMCkudHlwZT09ci5jb21wX2Zvcil7bD1uO2JyZWFrIGF9az1cbmIoaywwKTtlKGssci5jb21wX2lmKTtuKys7aWYoMj09YyhrKSl7bD1uO2JyZWFrIGF9az1iKGssMil9aWYoLTE9PWwpcmV0dXJuIG51bGw7Zm9yKG49MDtuPGw7bisrKXtlKGQsci5jb21wX2l0ZXIpO2Q9YihkLDApO2UoZCxyLmNvbXBfaWYpO2s9dyhhLGIoZCwxKSk7aWYoIWspcmV0dXJuIG51bGw7eFtuXT1rOzM9PWMoZCkmJihkPWIoZCwyKSl9ZC50eXBlPT1yLmNvbXBfaXRlciYmKGQ9YihkLDApKTtwLmlmcz14fWZbZ109cH1yZXR1cm4gZn1mdW5jdGlvbiBhYShhLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoMTxjKGQpKTt2YXIgZz1iKGQsMCk7dmFyIGg9dyhhLGcpO2lmKGguY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXJldHVybiBmKGEsZyxcIml0ZXJhYmxlIHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBjb21wcmVoZW5zaW9uXCIpLG51bGw7YT1VKGEsYihkLDEpKTtyZXR1cm4gMD09ZT9uZXcgU2suYXN0bm9kZXMuR2VuZXJhdG9yRXhwKGgsYSxkLmxpbmVubyxcbmQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6MT09ZT9uZXcgU2suYXN0bm9kZXMuTGlzdENvbXAoaCxhLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Mj09ZT9uZXcgU2suYXN0bm9kZXMuU2V0Q29tcChoLGEsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTpudWxsfWZ1bmN0aW9uIGNhKGEsYyl7ZShjLHIuYXVnYXNzaWduKTtjPWIoYywwKTtzd2l0Y2goYy52YWx1ZS5jaGFyQXQoMCkpe2Nhc2UgXCIrXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkFkZDtjYXNlIFwiLVwiOnJldHVybiBTay5hc3Rub2Rlcy5TdWI7Y2FzZSBcIi9cIjpyZXR1cm5cIi9cIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLkZsb29yRGl2OlNrLmFzdG5vZGVzLkRpdjtjYXNlIFwiJVwiOnJldHVybiBTay5hc3Rub2Rlcy5Nb2Q7Y2FzZSBcIjxcIjpyZXR1cm4gU2suYXN0bm9kZXMuTFNoaWZ0O2Nhc2UgXCI+XCI6cmV0dXJuIFNrLmFzdG5vZGVzLlJTaGlmdDtcbmNhc2UgXCImXCI6cmV0dXJuIFNrLmFzdG5vZGVzLkJpdEFuZDtjYXNlIFwiXlwiOnJldHVybiBTay5hc3Rub2Rlcy5CaXRYb3I7Y2FzZSBcInxcIjpyZXR1cm4gU2suYXN0bm9kZXMuQml0T3I7Y2FzZSBcIipcIjpyZXR1cm5cIipcIj09PWMudmFsdWUuY2hhckF0KDEpP1NrLmFzdG5vZGVzLlBvdzpTay5hc3Rub2Rlcy5NdWx0O2Nhc2UgXCJAXCI6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXJldHVybiBTay5hc3Rub2Rlcy5NYXRNdWx0O2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiaW52YWxpZCBhdWdhc3NpZ25cIil9fWZ1bmN0aW9uIFcoYSxkKXtTay5hc3NlcnRzLmFzc2VydCgwPGMoZCkpO2QudHlwZT09PXIudGVzdGxpc3RfY29tcD8xPGMoZCkmJlNrLmFzc2VydHMuYXNzZXJ0KGIoZCwxKS50eXBlIT09ci5jb21wX2Zvcik6U2suYXNzZXJ0cy5hc3NlcnQoZC50eXBlPT09ci50ZXN0bGlzdHx8ZC50eXBlPT09ci50ZXN0bGlzdF9zdGFyX2V4cHIpO3JldHVybiAxPT09YyhkKT93KGEsYihkLDApKTpuZXcgU2suYXN0bm9kZXMuVHVwbGUoQShhLFxuZCksU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGRhKGEsZil7ZShmLHIuZXhwcl9zdG10KTtpZigxPT09YyhmKSlyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkV4cHIoVyhhLGIoZiwwKSksZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtpZihiKGYsMSkudHlwZT09PXIuYXVnYXNzaWduKXt2YXIgaD1iKGYsMCk7dmFyIGs9VyhhLGgpO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6dmFyIG49ay5pZDtkKGEsaCxuLGYubGluZW5vKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTpjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkdlbmVyYXRvckV4cDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIGdlbmVyYXRvciBleHByZXNzaW9uIG5vdCBwb3NzaWJsZVwiLGEuY19maWxlbmFtZSxcbmYubGluZW5vKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGVcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO2RlZmF1bHQ6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbGxlZ2FsIGV4cHJlc3Npb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50XCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTt9aD1iKGYsMik7bj1oLnR5cGU9PT1yLnRlc3RsaXN0P1coYSxoKTp3KGEsaCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5BdWdBc3NpZ24oayxjYShhLGIoZiwxKSksbixmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWlmKGIoZiwxKS50eXBlPT09ci5hbm5hc3NpZ24pe2lmKCFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJBbm5vdGF0ZWQgYXNzaWdubWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIsXG5hLmNfZmlsZW5hbWUsZi5saW5lbm8pO2g9YihmLDApO3ZhciBsPWIoZiwxKTt2YXIgcD0xO2ZvcihrPWg7MT09YyhrKTspaz1iKGssMCk7MDxjKGspJiZiKGssMCkudHlwZT09ei5UX0xQQVImJihwPTApO2s9VyhhLGgpO3N3aXRjaChrLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk5hbWU6bj1rLmlkO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXR0cmlidXRlOm49ay5hdHRyO2QoYSxoLG4sZi5saW5lbm8pO2coYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OmcoYSxrLFNrLmFzdG5vZGVzLlN0b3JlLGgpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IGxpc3QpIGNhbiBiZSBhbm5vdGF0ZWRcIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO1xuY2FzZSBTay5hc3Rub2Rlcy5UdXBsZTp0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm9ubHkgc2luZ2xlIHRhcmdldCAobm90IHR1cGxlKSBjYW4gYmUgYW5ub3RhdGVkXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaWxsZWdhbCB0YXJnZXQgZm9yIGFubm90YXRpb25cIixhLmNfZmlsZW5hbWUsZi5saW5lbm8pO31rLmNvbnN0cnVjdG9yIT1Tay5hc3Rub2Rlcy5OYW1lJiYocD0wKTtoPWIobCwxKTtuPXcoYSxoKTtpZigyPT1jKGwpKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQW5uQXNzaWduKGssbixudWxsLHAsZi5saW5lbm8sZi5jb2xfb2Zmc2V0KTtoPWIobCwzKTthPXcoYSxoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkFubkFzc2lnbihrLG4sYSxwLGYubGluZW5vLGYuY29sX29mZnNldCl9ZShiKGYsMSksei5UX0VRVUFMKTtwPVtdO2ZvcihrPTA7azxjKGYpLTI7ays9Mil7aD1iKGYsayk7aWYoaC50eXBlPT09XG5yLnlpZWxkX2V4cHIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlXCIsYS5jX2ZpbGVuYW1lLGYubGluZW5vKTtoPVcoYSxoKTtnKGEsaCxTay5hc3Rub2Rlcy5TdG9yZSxiKGYsaykpO3Bbay8yXT1ofWg9YihmLGMoZiktMSk7YT1oLnR5cGU9PT1yLnRlc3RsaXN0X3N0YXJfZXhwcj9XKGEsaCk6dyhhLGgpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQXNzaWduKHAsYSxmLmxpbmVubyxmLmNvbF9vZmZzZXQpfWZ1bmN0aW9uIGVhKGEsYixjLGQsZSl7U2suYXNzZXJ0cy5hc3NlcnQoYz49Yik7U2suYXNzZXJ0cy5hc3NlcnQoXCJ7XCI9PWEuY2hhckF0KGItMSkpO1NrLmFzc2VydHMuYXNzZXJ0KFwifVwiPT1hLmNoYXJBdChjKXx8XCIhXCI9PWEuY2hhckF0KGMpfHxcIjpcIj09YS5jaGFyQXQoYykpO2E9YS5zdWJzdHJpbmcoYixjKTsvXlxccyokLy50ZXN0KGEpJiZmKGQsZSxcImYtc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkXCIpO1xudHJ5e2xldCBiPVNrLnBhcnNlKFwiPGZzdHJpbmc+XCIsXCIoXCIrYStcIilcIik7dmFyIGc9U2suYXN0RnJvbVBhcnNlKGIuY3N0LFwiPGZzdHJpbmc+XCIsYi5mbGFncyl9Y2F0Y2goWSl7dGhyb3cgWS50cmFjZWJhY2smJlkudHJhY2ViYWNrWzBdJiYoZz1ZLnRyYWNlYmFja1swXSxnLmxpbmVubz0oZy5saW5lbm98fDEpLTErZS5saW5lbm8sZy5maWxlbmFtZT1kLmNfZmlsZW5hbWUpLFk7fVNrLmFzc2VydHMuYXNzZXJ0KDE9PWcuYm9keS5sZW5ndGgmJmcuYm9keVswXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLkV4cHIpO3JldHVybiBnLmJvZHlbMF0udmFsdWV9ZnVuY3Rpb24gSChhLGIsYyxkLGUsZyxoKXtTay5hc3NlcnRzLmFzc2VydChcIntcIj09YS5jaGFyQXQoYikpO2IrKzt2YXIgaz1iO2xldCBuPW51bGwsbD0wLHA9MCxtLHgsUz0oKT0+ZihnLGgsXCJmLXN0cmluZzogZXhwZWN0aW5nICd9J1wiKTtmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYjw9Yyk7YjxjO2IrKyl7bGV0IGQ9YS5jaGFyQXQoYik7XG5cIlxcXFxcIj09ZCYmZihnLGgsXCJmLXN0cmluZyBleHByZXNzaW9uIHBhcnQgY2Fubm90IGluY2x1ZGUgYSBiYWNrc2xhc2hcIik7aWYobilkPT1uJiYoMz09bD9iKzI8YyYmYS5jaGFyQXQoYisxKT09ZCYmYS5jaGFyQXQoYisyKT09ZCYmKGIrPTIsbj1sPTApOmw9bj0wKTtlbHNlIGlmKFwiJ1wiPT1kfHwnXCInPT1kKWIrMjxjJiZhLmNoYXJBdChiKzEpPT1kJiZhLmNoYXJBdChiKzIpPT1kPyhsPTMsYis9Mik6bD0xLG49ZDtlbHNlIGlmKFwiW1wiPT1kfHxcIntcIj09ZHx8XCIoXCI9PWQpcCsrO2Vsc2UgaWYoMCE9cCYmKFwiXVwiPT1kfHxcIn1cIj09ZHx8XCIpXCI9PWQpKXAtLTtlbHNlIGlmKFwiI1wiPT1kKWYoZyxoLFwiZi1zdHJpbmcgZXhwcmVzc2lvbiBwYXJ0IGNhbm5vdCBpbmNsdWRlICcjJ1wiKTtlbHNlIGlmKCEoMCE9cHx8XCIhXCIhPWQmJlwiOlwiIT1kJiZcIn1cIiE9ZHx8XCIhXCI9PWQmJmIrMTxjJiZcIj1cIj09YS5jaGFyQXQoYisxKSkpYnJlYWt9biYmZihnLGgsXCJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZ1wiKTtcbnAmJmYoZyxoLFwiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJ1wiKTtrPWVhKGEsayxiLGcsaCk7XCIhXCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSx4PWEuY2hhckF0KGIpLGIrKyxcInNcIiE9eCYmXCJyXCIhPXgmJlwiYVwiIT14JiZmKGcsaCxcImYtc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyOiBleHBlY3RlZCAncycsICdyJywgb3IgJ2EnXCIpKTtiPj1jJiZTKCk7XCI6XCI9PWEuY2hhckF0KGIpJiYoYisrLGI+PWMmJlMoKSxbbSxiXT1iYShhLGIsYyxkLGUrMSxnLGgpKTsoYj49Y3x8XCJ9XCIhPWEuY2hhckF0KGIpKSYmUygpO2IrKztyZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkZvcm1hdHRlZFZhbHVlKGsseCxtLGgubGluZW5vLGguY29sX29mZnNldCksYl19ZnVuY3Rpb24gYmEoYSxiLGMsZCxlLGYsZyl7bGV0IGg9W10saz1hPT57aWYoLTEhPT1hLmluZGV4T2YoXCJ9XCIpKXtpZigvKF58W159XSl9KH19KSooJHxbXn1dKS8udGVzdChhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZFwiLFxuZy5saW5lbm8sZy5jb2xfb2Zmc2V0KTthPWEucmVwbGFjZSgvfX0vZyxcIn1cIil9aC5wdXNoKG5ldyBTay5hc3Rub2Rlcy5TdHIobmV3IFNrLmJ1aWx0aW4uc3RyKGEpLGcubGluZW5vLGcuY29sX29mZnNldCxmLmVuZF9saW5lbm8sZy5lbmRfY29sX29mZnNldCkpfTtmb3IoO2I8Yzspe2xldCBuPWEuaW5kZXhPZihcIntcIixiKTtpZigwIT09ZSl7bGV0IGQ9YS5pbmRleE9mKFwifVwiLGIpOy0xIT09ZCYmKC0xPT09bj9jPWQ6bj5kJiYobj0tMSxjPWQpKX1pZigtMT09PW4pe2soYS5zdWJzdHJpbmcoYixjKSk7Yj1jO2JyZWFrfWVsc2UgaWYobisxPGMmJlwie1wiPT09YS5jaGFyQXQobisxKSlrKGEuc3Vic3RyaW5nKGIsbisxKSksYj1uKzI7ZWxzZXtrKGEuc3Vic3RyaW5nKGIsbikpO2I9bjtsZXQgW2wscF09SChhLG4sYyxkLGUsZixnKTtoLnB1c2gobCk7Yj1wfX1yZXR1cm5bbmV3IFNrLmFzdG5vZGVzLkpvaW5lZFN0cihoLGcubGluZW5vLGcuY29sX29mZnNldCksYl19ZnVuY3Rpb24gWChhLFxuYixjKXt2YXIgZD1iLmNoYXJBdChiLmxlbmd0aC0xKTtpZigtMSE9PWIuaW5kZXhPZihcIl9cIikpe2lmKGZhLnRlc3QoYikpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJpbnZhbGlkIHN5bnRheFwiLGEuY19maWxlbmFtZSxjKTtpZihoYS50ZXN0KGIpKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBkZWNpbWFsIGxpdGVyYWxcIixhLmNfZmlsZW5hbWUsYyk7Yj1iLnJlcGxhY2UoaWEsXCJcIil9aWYoXCJqXCI9PT1kfHxcIkpcIj09PWQpcmV0dXJuIFNrLmJ1aWx0aW4uY29tcGxleC5jb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoYik7aWYoXCJsXCI9PT1kfHxcIkxcIj09PWQpcmV0dXJuIFNrLmxvbmdGcm9tU3RyKGIuc3Vic3RyKDAsYi5sZW5ndGgtMSksMCk7aWYoLTEhPT1iLmluZGV4T2YoXCIuXCIpKXJldHVybiBuZXcgU2suYnVpbHRpbi5mbG9hdF8ocGFyc2VGbG9hdChiKSk7Yz1iO2E9ITE7XCItXCI9PT1iLmNoYXJBdCgwKSYmKGM9Yi5zdWJzdHIoMSksYT1cbiEwKTtpZihcIjBcIiE9PWMuY2hhckF0KDApfHxcInhcIiE9PWMuY2hhckF0KDEpJiZcIlhcIiE9PWMuY2hhckF0KDEpKXtpZigtMSE9PWIuaW5kZXhPZihcImVcIil8fC0xIT09Yi5pbmRleE9mKFwiRVwiKSlyZXR1cm4gbmV3IFNrLmJ1aWx0aW4uZmxvYXRfKHBhcnNlRmxvYXQoYikpO2lmKFwiMFwiIT09Yy5jaGFyQXQoMCl8fFwiYlwiIT09Yy5jaGFyQXQoMSkmJlwiQlwiIT09Yy5jaGFyQXQoMSkpaWYoXCIwXCI9PT1jLmNoYXJBdCgwKSlpZihcIjBcIj09PWMpYz0wO2Vsc2V7Yz1jLnN1YnN0cmluZygxKTtpZihcIm9cIj09PWMuY2hhckF0KDApfHxcIk9cIj09PWMuY2hhckF0KDApKWM9Yy5zdWJzdHJpbmcoMSk7Yz1wYXJzZUludChjLDgpfWVsc2UgYz1wYXJzZUludChjLDEwKTtlbHNlIGM9Yy5zdWJzdHJpbmcoMiksYz1wYXJzZUludChjLDIpfWVsc2UgYz1jLnN1YnN0cmluZygyKSxjPXBhcnNlSW50KGMsMTYpO3JldHVybiBjPk51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZNYXRoLmZsb29yKGMpPT09YyYmLTE9PT1iLmluZGV4T2YoXCJlXCIpJiZcbi0xPT09Yi5pbmRleE9mKFwiRVwiKT9Tay5sb25nRnJvbVN0cihiLDApOmE/bmV3IFNrLmJ1aWx0aW4uaW50XygtYyk6bmV3IFNrLmJ1aWx0aW4uaW50XyhjKX1mdW5jdGlvbiBJKGEsZCl7dmFyIGYsZztlKGQsci5zdWJzY3JpcHQpO3ZhciBoPWIoZCwwKTt2YXIgaz1mPWc9bnVsbDtpZihoLnR5cGU9PT16LlRfRE9UKXJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXM7aWYoMT09PWMoZCkmJmgudHlwZT09PXIudGVzdClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkluZGV4KHcoYSxoKSk7aC50eXBlPT09ci50ZXN0JiYoZz13KGEsaCkpO2gudHlwZT09PXouVF9DT0xPTj8xPGMoZCkmJihoPWIoZCwxKSxoLnR5cGU9PT1yLnRlc3QmJihmPXcoYSxoKSkpOjI8YyhkKSYmKGg9YihkLDIpLGgudHlwZT09PXIudGVzdCYmKGY9dyhhLGgpKSk7aD1iKGQsYyhkKS0xKTtoLnR5cGU9PT1yLnNsaWNlb3AmJigxPT09YyhoKT8oaD1iKGgsMCksaz1uZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxcblNrLmFzdG5vZGVzLkxvYWQsaC5saW5lbm8saC5jb2xfb2Zmc2V0KSk6KGg9YihoLDEpLGgudHlwZT09PXIudGVzdCYmKGs9dyhhLGgpKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuU2xpY2UoZyxmLGspfWZ1bmN0aW9uIFIoYSxkKXt2YXIgZz1iKGQsMCk7c3dpdGNoKGcudHlwZSl7Y2FzZSB6LlRfTkFNRTp2YXIgaD1nLnZhbHVlO2lmKDQ8PWgubGVuZ3RoJiY1Pj1oLmxlbmd0aCl7aWYoXCJOb25lXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2lmKFwiVHJ1ZVwiPT09aClyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLk5hbWVDb25zdGFudChTay5idWlsdGluLmJvb2wudHJ1ZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtpZihcIkZhbHNlXCI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50KFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KX1hPVxuayhoLGEpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTmFtZShhLFNrLmFzdG5vZGVzLkxvYWQsZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9TVFJJTkc6Zz1bXTtmb3IodmFyIG49MDtuPGMoZCk7KytuKXt2YXIgcD1iKGQsbikudmFsdWU7dmFyIG09YTt2YXIgeD1iKGQsbik7dmFyIHQ9cDt2YXIgcT10LmNoYXJBdCgwKTtmb3IodmFyIEo9ITEsdj1wPSExOzspe2lmKFwidVwiIT09cSYmXCJVXCIhPT1xKWlmKFwiclwiPT09cXx8XCJSXCI9PT1xKUo9ITA7ZWxzZSBpZihcImJcIj09PXF8fFwiQlwiPT09cSl2PSEwO2Vsc2UgaWYoXCJmXCI9PT1xfHxcIkZcIj09PXEpcD0hMDtlbHNlIGJyZWFrO3Q9dC5zdWJzdHIoMSk7cT10LmNoYXJBdCgwKX1Tay5hc3NlcnRzLmFzc2VydChcIidcIj09PXF8fCdcIic9PT1xJiZ0LmNoYXJBdCh0Lmxlbmd0aC0xKT09PXEpO3Q9dC5zdWJzdHIoMSx0Lmxlbmd0aC0yKTs0PD10Lmxlbmd0aCYmdC5jaGFyQXQoMCk9PT1xJiZcbnQuY2hhckF0KDEpPT09cSYmKFNrLmFzc2VydHMuYXNzZXJ0KHQuY2hhckF0KHQubGVuZ3RoLTEpPT09cSYmdC5jaGFyQXQodC5sZW5ndGgtMik9PT1xKSx0PXQuc3Vic3RyKDIsdC5sZW5ndGgtNCkpO2lmKEp8fC0xPT09dC5pbmRleE9mKFwiXFxcXFwiKSl7aWYodilmb3IocT0wO3E8dC5sZW5ndGg7cSsrKTEyNzx0LmNoYXJDb2RlQXQocSkmJmYobSx4LFwiYnl0ZXMgY2FuIG9ubHkgY29udGFpbiBBU0NJSSBsaXRlcmFsIGNoYXJhY3RlcnNcIik7bT1bbCh0KSxwLHZdfWVsc2V7Sj10O3ZhciBCPUoubGVuZ3RoLHk9XCJcIjtmb3IodD0wO3Q8QjsrK3QpcT1KLmNoYXJBdCh0KSxcIlxcXFxcIj09PXE/KCsrdCxxPUouY2hhckF0KHQpLFwiblwiPT09cT95Kz1cIlxcblwiOlwiXFxcXFwiPT09cT95Kz1cIlxcXFxcIjpcInRcIj09PXE/eSs9XCJcXHRcIjpcInJcIj09PXE/eSs9XCJcXHJcIjpcImJcIj09PXE/eSs9XCJcXGJcIjpcImZcIj09PXE/eSs9XCJcXGZcIjpcInZcIj09PXE/eSs9XCJcXHZcIjpcIjBcIj09PXE/eSs9XCJcXHgwMFwiOidcIic9PT1xP3krPSdcIic6XCInXCI9PT1xP1xueSs9XCInXCI6XCJcXG5cIiE9PXEmJihcInhcIj09PXE/KHQrMj49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHhOTiBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChKLnN1YnN0cih0KzEsMiksMTYpKSx0Kz0yKTp2fHxcInVcIiE9PXE/dnx8XCJVXCIhPT1xP3krPVwiXFxcXFwiK3E6KHQrOD49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXFVYWFhYWFhYWCBlc2NhcGVcIikseSs9U3RyaW5nLmZyb21Db2RlUG9pbnQocGFyc2VJbnQoSi5zdWJzdHIodCsxLDgpLDE2KSksdCs9OCk6KHQrND49QiYmZihtLHgsXCJUcnVuY2F0ZWQgXFxcXHVYWFhYIGVzY2FwZVwiKSx5Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KEouc3Vic3RyKHQrMSw0KSwxNikpLHQrPTQpKSk6diYmMTI3PHEuY2hhckNvZGVBdCgwKT9mKG0seCxcImJ5dGVzIGNhbiBvbmx5IGNvbnRhaW4gQVNDSUkgbGl0ZXJhbCBjaGFyYWN0ZXJzXCIpOnkrPXE7bT15O209W2wobSkscCx2XX1wPW07bT1wWzBdO3g9cFsxXTtwPXBbMl07MCE9biYmXG5oIT09cCYmZihhLGQsXCJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFsc1wiKTtoPXA7aWYoeCl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImludmFsaWQgc3RyaW5nIChmLXN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIpXCIsYS5jX2ZpbGVuYW1lLGIoZCxuKS5saW5lbm8pO3ZhciBGPW0uJGpzc3RyKCk7W0ZdPWJhKEYsMCxGLmxlbmd0aCwhMSwwLGEsYihkLG4pKTtnLnB1c2guYXBwbHkoZyxGLnZhbHVlcyk7Rj1udWxsfWVsc2UgRj9GLnM9Ri5zLnNxJGNvbmNhdChtKTooRj1uZXcgKGg/U2suYXN0bm9kZXMuQnl0ZXM6U2suYXN0bm9kZXMuU3RyKShtLGQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCksZy5wdXNoKEYpKX1kPTE9PT1nLmxlbmd0aCYmZ1swXS5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0cj9nWzBdOm5ldyBTay5hc3Rub2Rlcy5Kb2luZWRTdHIoZyxcbmQubGluZW5vLGQuY29sX29mZnNldCxhLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7cmV0dXJuIGQ7Y2FzZSB6LlRfTlVNQkVSOnJldHVybiBuZXcgU2suYXN0bm9kZXMuTnVtKFgoYSxnLnZhbHVlLGQubGluZW5vKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugei5UX0VMTElQU0lTOnJldHVybiBuZXcgU2suYXN0bm9kZXMuRWxsaXBzaXMoZC5saW5lbm8sZC5jb2xfb2Zmc2V0LGQuZW5kX2xpbmVubyxkLmVuZF9jb2xfb2Zmc2V0KTtjYXNlIHouVF9MUEFSOnJldHVybiBnPWIoZCwxKSxnLnR5cGU9PXouVF9SUEFSP25ldyBTay5hc3Rub2Rlcy5UdXBsZShbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk6Zy50eXBlPT1yLnlpZWxkX2V4cHI/dyhhLGcpOjE9PWMoZyk/VyhhLGcpOmIoZywxKS50eXBlPT1yLmNvbXBfZm9yP3UoRChhLGcpLGQpOnUoVyhhLGcpLGQpO2Nhc2Ugei5UX0xTUUI6Zz1cbmIoZCwxKTtpZihnLnR5cGU9PXouVF9SU1FCKXJldHVybiBuZXcgU2suYXN0bm9kZXMuTGlzdChbXSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCxkLmVuZF9saW5lbm8sZC5lbmRfY29sX29mZnNldCk7ZShnLHIudGVzdGxpc3RfY29tcCk7aWYoMT09YyhnKXx8YihnLDEpLnR5cGU9PXouVF9DT01NQSlyZXR1cm4oYT1BKGEsZykpP25ldyBTay5hc3Rub2Rlcy5MaXN0KGEsU2suYXN0bm9kZXMuTG9hZCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpOm51bGw7aD1nO1NrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09ci50ZXN0bGlzdF9jb21wKTthPWFhKGEsaCwxKTtyZXR1cm4gdShhLGQpO2Nhc2Ugei5UX0xCUkFDRTpnPWIoZCwxKTtpZihnLnR5cGU9PXouVF9SQlJBQ0UpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EaWN0KG51bGwsbnVsbCxkLmxpbmVubyxkLmNvbF9vZmZzZXQsZC5lbmRfbGluZW5vLGQuZW5kX2NvbF9vZmZzZXQpO1xuaD1iKGcsMCkudHlwZT09ei5UX0RPVUJMRVNUQVI7aWYoMT09YyhnKXx8MTxjKGcpJiZiKGcsMSkudHlwZT09ei5UX0NPTU1BKXtoPWc7bj1bXTtTay5hc3NlcnRzLmFzc2VydChoLnR5cGU9PT1yLmRpY3RvcnNldG1ha2VyKTtmb3IoZz0wO2c8YyhoKTtnKz0yKUY9dyhhLGIoaCxnKSksbltnLzJdPUY7YT1uZXcgU2suYXN0bm9kZXMuU2V0KG4saC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNlIGlmKDE8YyhnKSYmYihnLDEpLnR5cGU9PXIuY29tcF9mb3IpaD1nLFNrLmFzc2VydHMuYXNzZXJ0KGgudHlwZT09PXIuZGljdG9yc2V0bWFrZXIpLFNrLmFzc2VydHMuYXNzZXJ0KDE8YyhoKSksZz13KGEsYihoLDApKSxhPVEoYSxiKGgsMSkpLGE9bmV3IFNrLmFzdG5vZGVzLlNldENvbXAoZyxhLGgubGluZW5vLGguY29sX29mZnNldCk7ZWxzZSBpZihjKGcpPjMtaCYmYihnLDMtaCkudHlwZT09ci5jb21wX2Zvcil7aWYoaClyZXR1cm4gZihhLGQsXCJkaWN0IHVucGFja2luZyBjYW5ub3QgYmUgdXNlZCBpbiBkaWN0IGNvbXByZWhlbnNpb25cIiksXG5udWxsO2g9ZztTay5hc3NlcnRzLmFzc2VydCgzPGMoaCkpO2UoYihoLDEpLHouVF9DT0xPTik7Zz13KGEsYihoLDApKTtuPXcoYSxiKGgsMikpO2E9UShhLGIoaCwzKSk7YT1uZXcgU2suYXN0bm9kZXMuRGljdENvbXAoZyxuLGEsaC5saW5lbm8saC5jb2xfb2Zmc2V0KX1lbHNle2g9ZztuPVtdO0Y9W107Zm9yKHA9Zz0wO3A8YyhoKTtwKyspbT1hLHg9aCx2PXAsYih4LHYpLnR5cGU9PXouVF9ET1VCTEVTVEFSPyhTay5hc3NlcnRzLmFzc2VydCgyPD1jKHgpLXYpLHA9dyhtLGIoeCx2KzEpKSxtPXtrZXk6bnVsbCx2YWx1ZTpwLGk6disyfSk6KFNrLmFzc2VydHMuYXNzZXJ0KDM8PWMoeCktdiksKHA9dyhtLGIoeCx2KSkpPyh0PXAsZShiKHgsdisxKSx6LlRfQ09MT04pLG09KHA9dyhtLGIoeCx2KzIpKSk/e2tleTp0LHZhbHVlOnAsaTp2KzN9OiExKTptPTApLHA9bS5pLG5bZ109bS5rZXksRltnXT1tLnZhbHVlLGcrKzthPW5ldyBTay5hc3Rub2Rlcy5EaWN0KG4sRixoLmxpbmVubyxcbmguY29sX29mZnNldCxoLmVuZF9saW5lbm8saC5lbmRfY29sX29mZnNldCl9cmV0dXJuIHUoYSxkKTtkZWZhdWx0OnJldHVybiBTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgYXRvbSBcIitnLnR5cGUpLG51bGx9fWZ1bmN0aW9uIEMoYSxkKXt2YXIgZyxmPTA7ZShkLHIuYXRvbV9leHByKTt2YXIgaD1jKGQpO2IoZCwwKS50eXBlPT09ei5UX0FXQUlUJiYoZj0xLFNrLmFzc2VydHMuYXNzZXJ0KDE8aCkpO3ZhciBrPVIoYSxiKGQsZikpO2lmKCFrKXJldHVybiBudWxsO2lmKDE9PT1oKXJldHVybiBrO2lmKGYmJjI9PT1oKXJldHVybiBuZXcgU2suYXN0bm9kZXMuQXdhaXQoayxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2ZvcihnPWYrMTtnPGg7ZysrKXt2YXIgbj1iKGQsZyk7aWYobi50eXBlIT09ci50cmFpbGVyKWJyZWFrO249TShhLG4sayk7aWYoIW4pcmV0dXJuIG51bGw7bi5saW5lbm89ay5saW5lbm87bi5jb2xfb2Zmc2V0PWsuY29sX29mZnNldDtrPW59cmV0dXJuIGY/bmV3IFNrLmFzdG5vZGVzLkF3YWl0KGssXG5kLmxpbmUsZC5jb2xfb2Zmc2V0KTprfWZ1bmN0aW9uIHcoYSxkKXthOmZvcig7Oyl7c3dpdGNoKGQudHlwZSl7Y2FzZSByLnRlc3Q6Y2FzZSByLnRlc3Rfbm9jb25kOmlmKGIoZCwwKS50eXBlPT09ci5sYW1iZGVmfHxiKGQsMCkudHlwZT09PXIubGFtYmRlZl9ub2NvbmQpe3ZhciBnPWIoZCwwKTszPT09YyhnKT8oZD1uZXcgU2suYXN0bm9kZXMuYXJndW1lbnRzXyhbXSxudWxsLG51bGwsW10pLGE9dyhhLGIoZywyKSkpOihkPUwoYSxiKGcsMSkpLGE9dyhhLGIoZywzKSkpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuTGFtYmRhKGQsYSxnLmxpbmVubyxnLmNvbF9vZmZzZXQpfWlmKDE8YyhkKSlyZXR1cm4gU2suYXNzZXJ0cy5hc3NlcnQoNT09PWMoZCkpLG5ldyBTay5hc3Rub2Rlcy5JZkV4cCh3KGEsYihkLDIpKSx3KGEsYihkLDApKSx3KGEsYihkLDQpKSxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5vcl90ZXN0OmNhc2Ugci5hbmRfdGVzdDppZigxPT09YyhkKSl7ZD1iKGQsXG4wKTtjb250aW51ZSBhfXZhciBmPVtdO2ZvcihnPTA7ZzxjKGQpO2crPTIpZltnLzJdPXcoYSxiKGQsZykpO2lmKFwiYW5kXCI9PT1iKGQsMSkudmFsdWUpcmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Cb29sT3AoU2suYXN0bm9kZXMuQW5kLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtTay5hc3NlcnRzLmFzc2VydChcIm9yXCI9PT1iKGQsMSkudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuQm9vbE9wKFNrLmFzdG5vZGVzLk9yLGYsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIubm90X3Rlc3Q6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZSByZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlVuYXJ5T3AoU2suYXN0bm9kZXMuTm90LHcoYSxiKGQsMSkpLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmNvbXBhcmlzb246aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9ZWxzZXt2YXIgaD1bXTtmPVtdO2ZvcihnPTE7ZzxjKGQpO2crPTIpaFsoZy0xKS8yXT1cbnAoYSxiKGQsZykpLGZbKGctMSkvMl09dyhhLGIoZCxnKzEpKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkNvbXBhcmUodyhhLGIoZCwwKSksaCxmLGQubGluZW5vLGQuY29sX29mZnNldCl9Y2FzZSByLnN0YXJfZXhwcjpyZXR1cm4gZShkLHIuc3Rhcl9leHByKSxuZXcgU2suYXN0bm9kZXMuU3RhcnJlZCh3KGEsYihkLDEpKSxTay5hc3Rub2Rlcy5Mb2FkLGQubGluZW5vLGQuY29sX29mZnNldCk7Y2FzZSByLmV4cHI6Y2FzZSByLnhvcl9leHByOmNhc2Ugci5hbmRfZXhwcjpjYXNlIHIuc2hpZnRfZXhwcjpjYXNlIHIuYXJpdGhfZXhwcjpjYXNlIHIudGVybTppZigxPT09YyhkKSl7ZD1iKGQsMCk7Y29udGludWUgYX12YXIgaz1kLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKHcoYSxiKGssMCkpLG4oYihrLDEpKSx3KGEsYihrLDIpKSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpLG09KGMoayktMSkvMjtmb3IoZD0xO2Q8bTsrK2QpZz1iKGssMipkKzEpLGY9bihnKSxoPXcoYSxiKGssMipkK1xuMikpLGw9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGwsZixoLGcubGluZW5vLGcuY29sX29mZnNldCk7cmV0dXJuIGw7Y2FzZSByLnlpZWxkX2V4cHI6cmV0dXJuIGY9ITEsaD1udWxsLDE8YyhkKSYmKGc9YihkLDEpKSxnJiYoaD1iKGcsYyhnKS0xKSwyPT1jKGcpPyhmPSEwLGg9dyhhLGgpKTpoPVcoYSxoKSksZj9uZXcgU2suYXN0bm9kZXMuWWllbGRGcm9tKGgsZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTpuZXcgU2suYXN0bm9kZXMuWWllbGQoaCxkLmxpbmVubyxkLmNvbF9vZmZzZXQpO2Nhc2Ugci5mYWN0b3I6aWYoMT09PWMoZCkpe2Q9YihkLDApO2NvbnRpbnVlIGF9cmV0dXJuIEUoYSxkKTtjYXNlIHIucG93ZXI6cmV0dXJuIGc9ZCxlKGcsci5wb3dlciksZD1DKGEsYihnLDApKSwxIT09YyhnKSYmYihnLGMoZyktMSkudHlwZT09PXIuZmFjdG9yJiYoYT13KGEsYihnLGMoZyktMSkpLGQ9bmV3IFNrLmFzdG5vZGVzLkJpbk9wKGQsU2suYXN0bm9kZXMuUG93LGEsZy5saW5lbm8sZy5jb2xfb2Zmc2V0KSksXG5kO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGV4cHJcIixcIm4udHlwZTogJWRcIixkLnR5cGUpfWJyZWFrfX1mdW5jdGlvbiBOKGEsZCl7ZC50eXBlPT09ci5zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWMoZCkpLGQ9YihkLDApKTtkLnR5cGU9PT1yLnNpbXBsZV9zdG10JiYoU2suYXNzZXJ0cy5hc3NlcnQoMT09PWgoZCkpLGQ9YihkLDApKTtpZihkLnR5cGU9PT1yLnNtYWxsX3N0bXQpc3dpdGNoKGQ9YihkLDApLGQudHlwZSl7Y2FzZSByLmV4cHJfc3RtdDpyZXR1cm4gZGEoYSxkKTtjYXNlIHIuZGVsX3N0bXQ6dmFyIGs9ZDtlKGssci5kZWxfc3RtdCk7cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5EZWxldGUodihhLGIoaywxKSxTay5hc3Rub2Rlcy5EZWwpLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLnBhc3Nfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlBhc3MoZC5saW5lbm8sZC5jb2xfb2Zmc2V0KTtjYXNlIHIuZmxvd19zdG10OnJldHVybiBWKGEsXG5kKTtjYXNlIHIuaW1wb3J0X3N0bXQ6dmFyIG49ZCxwO2UobixyLmltcG9ydF9zdG10KTt2YXIgbT1uLmxpbmVubztkPW4uY29sX29mZnNldDtuPWIobiwwKTtpZihuLnR5cGU9PT1yLmltcG9ydF9uYW1lKXtuPWIobiwxKTtlKG4sci5kb3R0ZWRfYXNfbmFtZXMpO3ZhciBxPVtdO2ZvcihwPTA7cDxjKG4pO3ArPTIpcVtwLzJdPUIoYSxiKG4scCkpO2E9bmV3IFNrLmFzdG5vZGVzLkltcG9ydChxLG0sZCl9ZWxzZSBpZihuLnR5cGU9PT1yLmltcG9ydF9mcm9tKXt2YXIgdT1udWxsO2s9MDtmb3IocT0xO3E8YyhuKTsrK3EpaWYoYihuLHEpLnR5cGU9PT1yLmRvdHRlZF9uYW1lKXt1PUIoYSxiKG4scSkpO3ErKzticmVha31lbHNlIGlmKGIobixxKS50eXBlPT09ei5UX0RPVClrKys7ZWxzZSBpZihiKG4scSkudHlwZT09PXouVF9FTExJUFNJUylrKz0zO2Vsc2UgYnJlYWs7KytxO3N3aXRjaChiKG4scSkudHlwZSl7Y2FzZSB6LlRfU1RBUjpuPWIobixxKTticmVhaztjYXNlIHouVF9MUEFSOm49XG5iKG4scSsxKTtjKG4pO2JyZWFrO2Nhc2Ugci5pbXBvcnRfYXNfbmFtZXM6bj1iKG4scSk7cT1jKG4pO2lmKDA9PT1xJTIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ0cmFpbGluZyBjb21tYSBub3QgYWxsb3dlZCB3aXRob3V0IHN1cnJvdW5kaW5nIHBhcmVudGhlc2VzXCIsYS5jX2ZpbGVuYW1lLG4ubGluZW5vKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBub2RlLXR5cGUgaW4gZnJvbS1pbXBvcnRcIixhLmNfZmlsZW5hbWUsbi5saW5lbm8pO31xPVtdO2lmKG4udHlwZT09PXouVF9TVEFSKXFbMF09QihhLG4pO2Vsc2UgZm9yKHA9MDtwPGMobik7cCs9MilxW3AvMl09QihhLGIobixwKSk7YT11P3UubmFtZS52OlwiXCI7YT1uZXcgU2suYXN0bm9kZXMuSW1wb3J0RnJvbShsKGEpLHEsayxtLGQpfWVsc2UgdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJ1bmtub3duIGltcG9ydCBzdGF0ZW1lbnRcIixcbmEuY19maWxlbmFtZSxuLmxpbmVubyk7cmV0dXJuIGE7Y2FzZSByLmdsb2JhbF9zdG10OmE9ZDtkPVtdO2UoYSxyLmdsb2JhbF9zdG10KTtmb3Ioaz0xO2s8YyhhKTtrKz0yKWRbKGstMSkvMl09bChiKGEsaykudmFsdWUpO3JldHVybiBuZXcgU2suYXN0bm9kZXMuR2xvYmFsKGQsYS5saW5lbm8sYS5jb2xfb2Zmc2V0KTtjYXNlIHIubm9ubG9jYWxfc3RtdDpmKGEsZCxcIk5vdCBpbXBsZW1lbnRlZDogbm9ubG9jYWxcIik7YnJlYWs7Y2FzZSByLmFzc2VydF9zdG10OnJldHVybiBrPWQsZShrLHIuYXNzZXJ0X3N0bXQpLDI9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLkFzc2VydCh3KGEsYihrLDEpKSxudWxsLGsubGluZW5vLGsuY29sX29mZnNldCk6ND09PWMoayk/YT1uZXcgU2suYXN0bm9kZXMuQXNzZXJ0KHcoYSxiKGssMSkpLHcoYSxiKGssMykpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcImltcHJvcGVyIG51bWJlciBvZiBwYXJ0cyB0byBhc3NlcnQgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5wcmludF9zdG10Oms9ZDtTay5fX2Z1dHVyZV9fLnByaW50X2Z1bmN0aW9uJiZmKGEsayxcIk1pc3NpbmcgcGFyZW50aGVzZXMgaW4gY2FsbCB0byAncHJpbnQnXCIpO249MTttPW51bGw7ZShrLHIucHJpbnRfc3RtdCk7Mjw9YyhrKSYmYihrLDEpLnR5cGU9PT16LlRfUklHSFRTSElGVCYmKG09dyhhLGIoaywyKSksbj00KTtkPVtdO2Zvcih1PTA7bjxjKGspO24rPTIsKyt1KWRbdV09dyhhLGIoayxuKSk7YT1iKGssYyhrKS0xKS50eXBlPT09ei5UX0NPTU1BPyExOiEwO3JldHVybiBuZXcgU2suYXN0bm9kZXMuUHJpbnQobSxkLGEsay5saW5lbm8say5jb2xfb2Zmc2V0KTtjYXNlIHIuZGVidWdnZXJfc3RtdDpyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLkRlYnVnZ2VyKGQubGluZW5vLGQuY29sX29mZnNldCk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgc21hbGxfc3RtdFwiKX1lbHNlIHN3aXRjaChrPWIoZCwwKSxlKGQsci5jb21wb3VuZF9zdG10KSxcbmsudHlwZSl7Y2FzZSByLmlmX3N0bXQ6ZShrLHIuaWZfc3RtdCk7aWYoND09PWMoaykpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksW10say5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKGQ9YihrLDQpLnZhbHVlLmNoYXJBdCgyKSxcInNcIj09PWQpYT1uZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoaywxKSksdChhLGIoaywzKSksdChhLGIoayw2KSksay5saW5lbm8say5jb2xfb2Zmc2V0KTtlbHNlIGlmKFwiaVwiPT09ZCl7bT1jKGspLTQ7bj0hMTtkPVtdO2IoayxtKzEpLnR5cGU9PT16LlRfTkFNRSYmXCJzXCI9PT1iKGssbSsxKS52YWx1ZS5jaGFyQXQoMikmJihuPSEwLG0tPTMpO20vPTQ7biYmKGQ9W25ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLGMoayktNikpLHQoYSxiKGssYyhrKS00KSksdChhLGIoayxjKGspLTEpKSxiKGssYyhrKS02KS5saW5lbm8sYihrLGMoayktNikuY29sX29mZnNldCldLG0tLSk7Zm9yKHU9MDt1PG07Kyt1KW49NSs0KlxuKG0tdS0xKSxkPVtuZXcgU2suYXN0bm9kZXMuSWYodyhhLGIoayxuKSksdChhLGIoayxuKzIpKSxkLGIoayxuKS5saW5lbm8sYihrLG4pLmNvbF9vZmZzZXQpXTthPW5ldyBTay5hc3Rub2Rlcy5JZih3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxkLGsubGluZW5vLGsuY29sX29mZnNldCl9ZWxzZSBTay5hc3NlcnRzLmZhaWwoXCJ1bmV4cGVjdGVkIHRva2VuIGluICdpZicgc3RhdGVtZW50XCIpLGE9dm9pZCAwO3JldHVybiBhO2Nhc2Ugci53aGlsZV9zdG10OnJldHVybiBlKGssci53aGlsZV9zdG10KSw0PT09YyhrKT9hPW5ldyBTay5hc3Rub2Rlcy5XaGlsZSh3KGEsYihrLDEpKSx0KGEsYihrLDMpKSxbXSxrLmxpbmVubyxrLmNvbF9vZmZzZXQpOjc9PT1jKGspP2E9bmV3IFNrLmFzdG5vZGVzLldoaWxlKHcoYSxiKGssMSkpLHQoYSxiKGssMykpLHQoYSxiKGssNikpLGsubGluZW5vLGsuY29sX29mZnNldCk6KFNrLmFzc2VydHMuZmFpbChcIndyb25nIG51bWJlciBvZiB0b2tlbnMgZm9yICd3aGlsZScgc3RtdFwiKSxcbmE9dm9pZCAwKSxhO2Nhc2Ugci5mb3Jfc3RtdDpyZXR1cm4gZD1bXSxlKGssci5mb3Jfc3RtdCksOT09PWMoaykmJihkPXQoYSxiKGssOCkpKSxuPWIoaywxKSxtPXYoYSxuLFNrLmFzdG5vZGVzLlN0b3JlKSxtPTE9PT1jKG4pP21bMF06bmV3IFNrLmFzdG5vZGVzLlR1cGxlKG0sU2suYXN0bm9kZXMuU3RvcmUsay5saW5lbm8say5jb2xfb2Zmc2V0KSxuZXcgU2suYXN0bm9kZXMuRm9yKG0sVyhhLGIoaywzKSksdChhLGIoayw1KSksZCxrLmxpbmVubyxrLmNvbF9vZmZzZXQpO2Nhc2Ugci50cnlfc3RtdDpkPVtdO3A9YyhrKTttPShwLTMpLzM7dT1bXTtxPW51bGw7ZShrLHIudHJ5X3N0bXQpO249dChhLGIoaywyKSk7aWYoYihrLHAtMykudHlwZT09PXouVF9OQU1FKVwiZmluYWxseVwiPT09YihrLHAtMykudmFsdWU/KDk8PXAmJmIoayxwLTYpLnR5cGU9PT16LlRfTkFNRSYmKHU9dChhLGIoayxwLTQpKSxtLS0pLHE9dChhLGIoayxwLTEpKSk6dT10KGEsYihrLHAtMSkpLG0tLTtlbHNlIGlmKGIoayxcbnAtMykudHlwZSE9PXIuZXhjZXB0X2NsYXVzZSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm1hbGZvcm1lZCAndHJ5JyBzdGF0ZW1lbnRcIixhLmNfZmlsZW5hbWUsay5saW5lbm8pO2lmKDA8bSlmb3IocD0wO3A8bTtwKyspe3ZhciBBPXA7dmFyIHg9YSx5PWIoaywzKzMqcCksRD1iKGssNSszKnApO2UoeSxyLmV4Y2VwdF9jbGF1c2UpO2UoRCxyLnN1aXRlKTtpZigxPT09Yyh5KSl2YXIgRT1uZXcgU2suYXN0bm9kZXMuRXhjZXB0SGFuZGxlcihudWxsLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk7ZWxzZSAyPT09Yyh5KT9FPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLG51bGwsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCk6ND09PWMoeSk/KFNrLl9fZnV0dXJlX18ucHl0aG9uMyYmXCIsXCI9PWIoeSwyKS52YWx1ZSYmZih4LHksXCJPbGQtc3R5bGUgJ2V4Y2VwdCcgY2xhdXNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gM1wiKSxcbncoeCxiKHksMSkpLEU9dyh4LGIoeSwzKSksZyh4LEUsU2suYXN0bm9kZXMuU3RvcmUsYih5LDMpKSxFPW5ldyBTay5hc3Rub2Rlcy5FeGNlcHRIYW5kbGVyKHcoeCxiKHksMSkpLEUsdCh4LEQpLHkubGluZW5vLHkuY29sX29mZnNldCkpOihTay5hc3NlcnRzLmZhaWwoXCJ3cm9uZyBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGV4Y2VwdCBjbGF1c2VcIiksRT12b2lkIDApO2RbQV09RX1Tay5hc3NlcnRzLmFzc2VydCghIXF8fDAhPWQubGVuZ3RoKTtyZXR1cm4gbmV3IFNrLmFzdG5vZGVzLlRyeShuLGQsdSxxLGsubGluZW5vLGsuY29sX29mZnNldCk7Y2FzZSByLndpdGhfc3RtdDpkPVtdO2UoayxyLndpdGhfc3RtdCk7Zm9yKG09MTttPGMoayktMjttKz0yKW49dm9pZCAwLHE9YSxwPWIoayxtKSxlKHAsci53aXRoX2l0ZW0pLHU9dyhxLGIocCwwKSksMz09YyhwKSYmKG49dyhxLGIocCwyKSksZyhxLG4sU2suYXN0bm9kZXMuU3RvcmUscCkpLG49bmV3IFNrLmFzdG5vZGVzLndpdGhpdGVtKHUsXG5uKSxkWyhtLTEpLzJdPW47YT10KGEsYihrLGMoayktMSkpO2E9bmV3IFNrLmFzdG5vZGVzLldpdGgoZCxhLGsubGluZW5vLGsuY29sX29mZnNldCk7cmV0dXJuIGE7Y2FzZSByLmZ1bmNkZWY6cmV0dXJuIFQoYSxrLFtdLCExKTtjYXNlIHIuY2xhc3NkZWY6cmV0dXJuIFAoYSxrLFtdKTtjYXNlIHIuZGVjb3JhdGVkOm09bnVsbDtlKGssci5kZWNvcmF0ZWQpO249YihrLDApO2UobixyLmRlY29yYXRvcnMpO2Q9W107Zm9yKHU9MDt1PGMobik7Kyt1KXtxPWQ7cD11O0E9YTtFPWIobix1KTtlKEUsci5kZWNvcmF0b3IpO2UoYihFLDApLHouVF9BVCk7ZShiKEUsYyhFKS0xKSx6LlRfTkVXTElORSk7dmFyIEMsRz1iKEUsMSk7ZShHLHIuZG90dGVkX25hbWUpO3g9Ry5saW5lbm87eT1HLmNvbF9vZmZzZXQ7RD1sKGIoRywwKS52YWx1ZSk7dmFyIE09bmV3IFNrLmFzdG5vZGVzLk5hbWUoRCxTay5hc3Rub2Rlcy5Mb2FkLHgseSk7Zm9yKEM9MjtDPGMoRyk7Qys9MilEPWwoYihHLEMpLnZhbHVlKSxcbk09bmV3IFNrLmFzdG5vZGVzLkF0dHJpYnV0ZShNLEQsU2suYXN0bm9kZXMuTG9hZCx4LHkpO3g9TTtBPTM9PT1jKEUpP3g6NT09PWMoRSk/bmV3IFNrLmFzdG5vZGVzLkNhbGwoeCxbXSxbXSxudWxsLG51bGwsRS5saW5lbm8sRS5jb2xfb2Zmc2V0KTpGKEEsYihFLDMpLHgpO3FbcF09QX1Tay5hc3NlcnRzLmFzc2VydChiKGssMSkudHlwZT09ci5mdW5jZGVmfHxiKGssMSkudHlwZT09ci5hc3luY19mdW5jZGVmfHxiKGssMSkudHlwZT09ci5jbGFzc2RlZik7YihrLDEpLnR5cGU9PXIuZnVuY2RlZj8obT1iKGssMSksbT1UKGEsbSxkLCExKSk6YihrLDEpLnR5cGU9PXIuY2xhc3NkZWY/bT1QKGEsYihrLDEpLGQpOmIoaywxKS50eXBlPT1yLmFzeW5jX2Z1bmNkZWYmJihtPWIoaywxKSxlKG0sci5hc3luY19mdW5jZGVmKSxlKGIobSwwKSx6LlRfTkFNRSksU2suYXNzZXJ0cy5hc3NlcnQoKFwiYXN5bmNcIj09PWIobSwwKSkudmFsdWUpLGUoYihtLDEpLHIuZnVuY2RlZiksbT1UKGEsbSxkLFxuITApKTttJiYobS5saW5lbm89ay5saW5lbm8sbS5jb2xfb2Zmc2V0PWsuY29sX29mZnNldCk7cmV0dXJuIG07Y2FzZSByLmFzeW5jX3N0bXQ6ZihhLGssXCJOb3QgaW1wbGVtZW50ZWQ6IGFzeW5jXCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5hc3NlcnQoXCJ1bmhhbmRsZWQgY29tcG91bmRfc3RtdFwiKX19dmFyIHI9U2suUGFyc2VUYWJsZXMuc3ltLHo9U2sudG9rZW4udG9rZW5zLFo9e1NsaWNlX2tpbmQ6MSxFeHRTbGljZV9raW5kOjIsSW5kZXhfa2luZDozfSxPPXt9O09bei5UX1ZCQVJdPVNrLmFzdG5vZGVzLkJpdE9yO09bei5UX0NJUkNVTUZMRVhdPVNrLmFzdG5vZGVzLkJpdFhvcjtPW3ouVF9BTVBFUl09U2suYXN0bm9kZXMuQml0QW5kO09bei5UX0xFRlRTSElGVF09U2suYXN0bm9kZXMuTFNoaWZ0O09bei5UX1JJR0hUU0hJRlRdPVNrLmFzdG5vZGVzLlJTaGlmdDtPW3ouVF9QTFVTXT1Tay5hc3Rub2Rlcy5BZGQ7T1t6LlRfTUlOVVNdPVNrLmFzdG5vZGVzLlN1YjtPW3ouVF9TVEFSXT1cblNrLmFzdG5vZGVzLk11bHQ7T1t6LlRfU0xBU0hdPVNrLmFzdG5vZGVzLkRpdjtPW3ouVF9ET1VCTEVTTEFTSF09U2suYXN0bm9kZXMuRmxvb3JEaXY7T1t6LlRfUEVSQ0VOVF09U2suYXN0bm9kZXMuTW9kO1NrLnNldHVwT3BlcmF0b3JzPWZ1bmN0aW9uKGEpe2E/T1t6LlRfQVRdPVNrLmFzdG5vZGVzLk1hdE11bHQ6T1t6LlRfQVRdJiZkZWxldGUgT1t6LlRfQVRdfTtTay5leHBvcnRTeW1ib2woXCJTay5zZXR1cE9wZXJhdG9yc1wiLFNrLnNldHVwT3BlcmF0b3JzKTtjb25zdCBmYT0vX1tlRV18W2VFXV98XFwuX3xqXy8saGE9L19cXC58WystXV98XjBfXFxEfF9qLyxpYT0vXyg/PVteX10pL2c7U2suYXN0RnJvbVBhcnNlPWZ1bmN0aW9uKGQsZyxmKXt2YXIgayxuPW5ldyBhKFwidXRmLThcIixnLGYpLHA9W10sbD0wO3N3aXRjaChkLnR5cGUpe2Nhc2Ugci5maWxlX2lucHV0OmZvcihrPTA7azxjKGQpLTE7KytrKXt2YXIgbT1iKGQsayk7aWYoZC50eXBlIT09ei5UX05FV0xJTkUpaWYoZShtLHIuc3RtdCksXG5mPWgobSksMT09PWYpcFtsKytdPU4obixtKTtlbHNlIGZvcihtPWIobSwwKSxlKG0sci5zaW1wbGVfc3RtdCksZz0wO2c8ZjsrK2cpcFtsKytdPU4obixiKG0sMipnKSl9cmV0dXJuIG5ldyBTay5hc3Rub2Rlcy5Nb2R1bGUocCk7Y2FzZSByLmV2YWxfaW5wdXQ6U2suYXNzZXJ0cy5mYWlsKFwidG9kbztcIik7Y2FzZSByLnNpbmdsZV9pbnB1dDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvO1wiKTtkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInRvZG87XCIpfX07U2suYXN0RHVtcD1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGE7KytiKWMrPVwiIFwiO3JldHVybiBjfSxjPWZ1bmN0aW9uKGEsZCl7dmFyIGU7aWYobnVsbD09PWEpcmV0dXJuIGQrXCJOb25lXCI7aWYoYS5wcm90b3R5cGUmJnZvaWQgMCE9PWEucHJvdG90eXBlLl9hc3RuYW1lJiZhLnByb3RvdHlwZS5faXNlbnVtKXJldHVybiBkK2EucHJvdG90eXBlLl9hc3RuYW1lK1wiKClcIjtpZih2b2lkIDAhPT1cbmEuX2FzdG5hbWUpe3ZhciBnPWIoYS5fYXN0bmFtZS5sZW5ndGgrMSk7dmFyIGY9W107Zm9yKGU9MDtlPGEuX2ZpZWxkcy5sZW5ndGg7ZSs9Mil7dmFyIGg9YS5fZmllbGRzW2VdO3ZhciBrPWEuX2ZpZWxkc1tlKzFdKGEpO3ZhciBuPWIoaC5sZW5ndGgrMSk7Zi5wdXNoKFtoLGMoayxkK2crbildKX1rPVtdO2ZvcihlPTA7ZTxmLmxlbmd0aDsrK2Upbj1mW2VdLGsucHVzaChuWzBdK1wiPVwiK25bMV0ucmVwbGFjZSgvXlxccysvLFwiXCIpKTtlPWsuam9pbihcIixcXG5cIitkK2cpO3JldHVybiBkK2EuX2FzdG5hbWUrXCIoXCIrZStcIilcIn1pZihTay5pc0FycmF5TGlrZShhKSl7Zz1bXTtmb3IoZT0wO2U8YS5sZW5ndGg7KytlKWY9YVtlXSxnLnB1c2goYyhmLGQrXCIgXCIpKTthPWcuam9pbihcIixcXG5cIik7cmV0dXJuIGQrXCJbXCIrYS5yZXBsYWNlKC9eXFxzKy8sXCJcIikrXCJdXCJ9YT0hMD09PWE/XCJUcnVlXCI6ITE9PT1hP1wiRmFsc2VcIjphIGluc3RhbmNlb2YgU2suYnVpbHRpbi5sbmc/YS50cCRzdHIoKS52OmEgaW5zdGFuY2VvZlxuU2suYnVpbHRpbi5zdHI/YS4kcigpLnY6XCJcIithO3JldHVybiBkK2F9O3JldHVybiBjKGEsXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLmFzdEZyb21QYXJzZVwiLFNrLmFzdEZyb21QYXJzZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYXN0RHVtcFwiLFNrLmFzdER1bXApfSxmdW5jdGlvbihtLHEpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuX19uYW1lPWE7dGhpcy5fX2ZsYWdzPWI7dGhpcy5fX3Njb3BlPWI+PjExJjc7dGhpcy5fX25hbWVzcGFjZXM9Y3x8W119ZnVuY3Rpb24gYyhhLGIsYyxlLGYpe3RoaXMuc3ltRmxhZ3M9e307dGhpcy5uYW1lPWI7dGhpcy52YXJuYW1lcz1bXTt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuYmxvY2tUeXBlPWM7dGhpcy5yZXR1cm5zVmFsdWU9dGhpcy52YXJrZXl3b3Jkcz10aGlzLnZhcmFyZ3M9dGhpcy5nZW5lcmF0b3I9dGhpcy5jaGlsZEhhc0ZyZWU9dGhpcy5oYXNGcmVlPXRoaXMuaXNOZXN0ZWQ9ITE7dGhpcy5saW5lbm89Zjt0aGlzLnRhYmxlPWE7YS5jdXImJlxuKGEuY3VyLm5lc3RlZHx8XCJmdW5jdGlvblwiPT09YS5jdXIuYmxvY2tUeXBlKSYmKHRoaXMuaXNOZXN0ZWQ9ITApO2Uuc2NvcGVJZD1sKys7YS5zdHNzW2Uuc2NvcGVJZF09dGhpczt0aGlzLnN5bWJvbHM9e319ZnVuY3Rpb24gYihhKXt0aGlzLmZpbGVuYW1lPWE7dGhpcy50b3A9dGhpcy5jdXI9bnVsbDt0aGlzLnN0YWNrPVtdO3RoaXMuY3VyQ2xhc3M9dGhpcy5nbG9iYWw9bnVsbDt0aGlzLnRtcG5hbWU9MDt0aGlzLnN0c3M9e319ZnVuY3Rpb24gZShhLGIpe3ZhciBjO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYShiW2NdKX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjIGluIGIpYVtjXT1iW2NdfVNrLmV4cG9ydFN5bWJvbChcIlNrLlNZTVRBQl9DT05TVFNcIix7REVGX0dMT0JBTDoxLERFRl9MT0NBTDoyLERFRl9QQVJBTTo0LFVTRTo4LERFRl9TVEFSOjE2LERFRl9ET1VCTEVTVEFSOjMyLERFRl9JTlRVUExFOjY0LERFRl9GUkVFOjEyOCxERUZfRlJFRV9HTE9CQUw6MjU2LERFRl9GUkVFX0NMQVNTOjUxMixcbkRFRl9JTVBPUlQ6MTAyNCxERUZfQk9VTkQ6MTAzMCxTQ09QRV9PRkY6MTEsU0NPUEVfTUFTSzo3LExPQ0FMOjEsR0xPQkFMX0VYUExJQ0lUOjIsR0xPQkFMX0lNUExJQ0lUOjMsRlJFRTo0LENFTEw6NSxPUFRfSU1QT1JUX1NUQVI6MSxPUFRfRVhFQzoyLE9QVF9CQVJFX0VYRUM6NCxPUFRfVE9QTEVWRUw6OCxHRU5FUkFUT1I6MixHRU5FUkFUT1JfRVhQUkVTU0lPTjoyLE1vZHVsZUJsb2NrOlwibW9kdWxlXCIsRnVuY3Rpb25CbG9jazpcImZ1bmN0aW9uXCIsQ2xhc3NCbG9jazpcImNsYXNzXCJ9KTthLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZX07YS5wcm90b3R5cGUuaXNfcmVmZXJlbmNlZD1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMuX19mbGFncyY4KX07YS5wcm90b3R5cGUuaXNfcGFyYW1ldGVyPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjQpfTthLnByb3RvdHlwZS5pc19nbG9iYWw9ZnVuY3Rpb24oKXtyZXR1cm4gMz09PXRoaXMuX19zY29wZXx8XG4yPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2RlY2xhcmVkX2dsb2JhbD1mdW5jdGlvbigpe3JldHVybiAyPT10aGlzLl9fc2NvcGV9O2EucHJvdG90eXBlLmlzX2xvY2FsPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjEwMzApfTthLnByb3RvdHlwZS5pc19mcmVlPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMuX19zY29wZX07YS5wcm90b3R5cGUuaXNfaW1wb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLl9fZmxhZ3MmMTAyNCl9O2EucHJvdG90eXBlLmlzX2Fzc2lnbmVkPWZ1bmN0aW9uKCl7cmV0dXJuISEodGhpcy5fX2ZsYWdzJjIpfTthLnByb3RvdHlwZS5pc19uYW1lc3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVzcGFjZXMmJjA8dGhpcy5fX25hbWVzcGFjZXMubGVuZ3RofTthLnByb3RvdHlwZS5nZXRfbmFtZXNwYWNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fbmFtZXNwYWNlc307dmFyIGw9MDtjLnByb3RvdHlwZS5nZXRfdHlwZT1cbmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmxvY2tUeXBlfTtjLnByb3RvdHlwZS5nZXRfbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9O2MucHJvdG90eXBlLmdldF9saW5lbm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5saW5lbm99O2MucHJvdG90eXBlLmlzX25lc3RlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzTmVzdGVkfTtjLnByb3RvdHlwZS5oYXNfY2hpbGRyZW49ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmNoaWxkcmVuLmxlbmd0aH07Yy5wcm90b3R5cGUuZ2V0X2lkZW50aWZpZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKCl7cmV0dXJuITB9KX07Yy5wcm90b3R5cGUubG9va3VwPWZ1bmN0aW9uKGIpe2lmKHRoaXMuc3ltYm9scy5oYXNPd25Qcm9wZXJ0eShiKSliPXRoaXMuc3ltYm9sc1tiXTtlbHNle3ZhciBjPXRoaXMuc3ltRmxhZ3NbYl07dmFyIGU9dGhpcy5fX2NoZWNrX2NoaWxkcmVuKGIpO2I9dGhpcy5zeW1ib2xzW2JdPVxubmV3IGEoYixjLGUpfXJldHVybiBifTtjLnByb3RvdHlwZS5fX2NoZWNrX2NoaWxkcmVuPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W107Zm9yKGI9MDtiPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5jaGlsZHJlbltiXTtlLm5hbWU9PT1hJiZjLnB1c2goZSl9cmV0dXJuIGN9O2MucHJvdG90eXBlLl9pZGVudHNNYXRjaGluZz1mdW5jdGlvbihhKXt2YXIgYixjPVtdO2ZvcihiIGluIHRoaXMuc3ltRmxhZ3MpdGhpcy5zeW1GbGFncy5oYXNPd25Qcm9wZXJ0eShiKSYmYSh0aGlzLnN5bUZsYWdzW2JdKSYmYy5wdXNoKGIpO2Muc29ydCgpO3JldHVybiBjfTtjLnByb3RvdHlwZS5nZXRfcGFyYW1ldGVycz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X3BhcmFtZXRlcnMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNQYXJhbXN8fCh0aGlzLl9mdW5jUGFyYW1zPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe3JldHVybiBhJlxuNH0pKTtyZXR1cm4gdGhpcy5fZnVuY1BhcmFtc307Yy5wcm90b3R5cGUuZ2V0X2xvY2Fscz1mdW5jdGlvbigpe1NrLmFzc2VydHMuYXNzZXJ0KFwiZnVuY3Rpb25cIj09dGhpcy5nZXRfdHlwZSgpLFwiZ2V0X2xvY2FscyBvbmx5IHZhbGlkIGZvciBmdW5jdGlvbiBzY29wZXNcIik7dGhpcy5fZnVuY0xvY2Fsc3x8KHRoaXMuX2Z1bmNMb2NhbHM9dGhpcy5faWRlbnRzTWF0Y2hpbmcoZnVuY3Rpb24oYSl7cmV0dXJuIGEmMTAzMH0pKTtyZXR1cm4gdGhpcy5fZnVuY0xvY2Fsc307Yy5wcm90b3R5cGUuZ2V0X2dsb2JhbHM9ZnVuY3Rpb24oKXtTay5hc3NlcnRzLmFzc2VydChcImZ1bmN0aW9uXCI9PXRoaXMuZ2V0X3R5cGUoKSxcImdldF9nbG9iYWxzIG9ubHkgdmFsaWQgZm9yIGZ1bmN0aW9uIHNjb3Blc1wiKTt0aGlzLl9mdW5jR2xvYmFsc3x8KHRoaXMuX2Z1bmNHbG9iYWxzPXRoaXMuX2lkZW50c01hdGNoaW5nKGZ1bmN0aW9uKGEpe2E9YT4+MTEmNztyZXR1cm4gMz09YXx8Mj09YX0pKTtyZXR1cm4gdGhpcy5fZnVuY0dsb2JhbHN9O1xuYy5wcm90b3R5cGUuZ2V0X2ZyZWVzPWZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoXCJmdW5jdGlvblwiPT10aGlzLmdldF90eXBlKCksXCJnZXRfZnJlZXMgb25seSB2YWxpZCBmb3IgZnVuY3Rpb24gc2NvcGVzXCIpO3RoaXMuX2Z1bmNGcmVlc3x8KHRoaXMuX2Z1bmNGcmVlcz10aGlzLl9pZGVudHNNYXRjaGluZyhmdW5jdGlvbihhKXtyZXR1cm4gND09KGE+PjExJjcpfSkpO3JldHVybiB0aGlzLl9mdW5jRnJlZXN9O2MucHJvdG90eXBlLmdldF9tZXRob2RzPWZ1bmN0aW9uKCl7dmFyIGE7U2suYXNzZXJ0cy5hc3NlcnQoXCJjbGFzc1wiPT10aGlzLmdldF90eXBlKCksXCJnZXRfbWV0aG9kcyBvbmx5IHZhbGlkIGZvciBjbGFzcyBzY29wZXNcIik7aWYoIXRoaXMuX2NsYXNzTWV0aG9kcyl7dmFyIGI9W107Zm9yKGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoOysrYSliLnB1c2godGhpcy5jaGlsZHJlblthXS5uYW1lKTtiLnNvcnQoKTt0aGlzLl9jbGFzc01ldGhvZHM9Yn1yZXR1cm4gdGhpcy5fY2xhc3NNZXRob2RzfTtcbmMucHJvdG90eXBlLmdldFNjb3BlPWZ1bmN0aW9uKGEpe2E9dGhpcy5zeW1GbGFnc1thXTtyZXR1cm4gdm9pZCAwPT09YT8wOmE+PjExJjd9O2IucHJvdG90eXBlLmdldFN0c0ZvckFzdD1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLnNjb3BlSWQsXCJhc3Qgd2Fzbid0IGFkZGVkIHRvIHN0P1wiKTthPXRoaXMuc3Rzc1thLnNjb3BlSWRdO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEsXCJ1bmtub3duIHN5bSB0YWIgZW50cnlcIik7cmV0dXJuIGF9O2IucHJvdG90eXBlLlNFUVN0bXQ9ZnVuY3Rpb24oYSl7dmFyIGIsYztpZihudWxsIT09YSl7U2suYXNzZXJ0cy5hc3NlcnQoU2suaXNBcnJheUxpa2UoYSksXCJTRVE6IG5vZGVzIGlzbid0IGFycmF5PyBnb3QgXCIrYS50b1N0cmluZygpKTt2YXIgZT1hLmxlbmd0aDtmb3IoYz0wO2M8ZTsrK2MpKGI9YVtjXSkmJnRoaXMudmlzaXRTdG10KGIpfX07Yi5wcm90b3R5cGUuU0VRRXhwcj1mdW5jdGlvbihhKXt2YXIgYixcbmM7aWYobnVsbCE9PWEpe1NrLmFzc2VydHMuYXNzZXJ0KFNrLmlzQXJyYXlMaWtlKGEpLFwiU0VROiBub2RlcyBpc24ndCBhcnJheT8gZ290IFwiK2EudG9TdHJpbmcoKSk7dmFyIGU9YS5sZW5ndGg7Zm9yKGM9MDtjPGU7KytjKShiPWFbY10pJiZ0aGlzLnZpc2l0RXhwcihiKX19O2IucHJvdG90eXBlLmVudGVyQmxvY2s9ZnVuY3Rpb24oYSxiLGUsZil7YT1Tay5maXhSZXNlcnZlZChhKTt2YXIgZD1udWxsO3RoaXMuY3VyJiYoZD10aGlzLmN1cix0aGlzLnN0YWNrLnB1c2godGhpcy5jdXIpKTt0aGlzLmN1cj1uZXcgYyh0aGlzLGEsYixlLGYpO1widG9wXCI9PT1hJiYodGhpcy5nbG9iYWw9dGhpcy5jdXIuc3ltRmxhZ3MpO2QmJmQuY2hpbGRyZW4ucHVzaCh0aGlzLmN1cil9O2IucHJvdG90eXBlLmV4aXRCbG9jaz1mdW5jdGlvbigpe3RoaXMuY3VyPW51bGw7MDx0aGlzLnN0YWNrLmxlbmd0aCYmKHRoaXMuY3VyPXRoaXMuc3RhY2sucG9wKCkpfTtiLnByb3RvdHlwZS52aXNpdFBhcmFtcz1cbmZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGM9MDtjPGEubGVuZ3RoOysrYylpZihiPWFbY10sYi5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLmFyZyl0aGlzLmFkZERlZihiLmFyZyw0LGIubGluZW5vKTtlbHNlIHRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0XCIsdGhpcy5maWxlbmFtZSk7fTtiLnByb3RvdHlwZS52aXNpdEFyZ3VtZW50cz1mdW5jdGlvbihhLGIpe2EuYXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmFyZ3MsITApO2Eua3dvbmx5YXJncyYmdGhpcy52aXNpdFBhcmFtcyhhLmt3b25seWFyZ3MsITApO2EudmFyYXJnJiYodGhpcy5hZGREZWYoYS52YXJhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFyYXJncz0hMCk7YS5rd2FyZyYmKHRoaXMuYWRkRGVmKGEua3dhcmcuYXJnLDQsYiksdGhpcy5jdXIudmFya2V5d29yZHM9ITApfTtiLnByb3RvdHlwZS5uZXdUbXBuYW1lPWZ1bmN0aW9uKGEpe3RoaXMuYWRkRGVmKG5ldyBTay5idWlsdGluLnN0cihcIl9bXCIrXG4rK3RoaXMudG1wbmFtZStcIl1cIiksMixhKX07Yi5wcm90b3R5cGUuYWRkRGVmPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1Tay5tYW5nbGVOYW1lKHRoaXMuY3VyQ2xhc3MsYSkudjtkPVNrLmZpeFJlc2VydmVkKGQpO3ZhciBlPXRoaXMuY3VyLnN5bUZsYWdzW2RdO2lmKHZvaWQgMCE9PWUpe2lmKGImNCYmZSY0KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiZHVwbGljYXRlIGFyZ3VtZW50ICdcIithLnYrXCInIGluIGZ1bmN0aW9uIGRlZmluaXRpb25cIix0aGlzLmZpbGVuYW1lLGMpO2V8PWJ9ZWxzZSBlPWI7dGhpcy5jdXIuc3ltRmxhZ3NbZF09ZTtiJjQ/dGhpcy5jdXIudmFybmFtZXMucHVzaChkKTpiJjEmJihlPWIsYT10aGlzLmdsb2JhbFtkXSx2b2lkIDAhPT1hJiYoZXw9YSksdGhpcy5nbG9iYWxbZF09ZSl9O2IucHJvdG90eXBlLnZpc2l0U2xpY2U9ZnVuY3Rpb24oYSl7dmFyIGI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6YS5sb3dlciYmXG50aGlzLnZpc2l0RXhwcihhLmxvd2VyKTthLnVwcGVyJiZ0aGlzLnZpc2l0RXhwcihhLnVwcGVyKTthLnN0ZXAmJnRoaXMudmlzaXRFeHByKGEuc3RlcCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHRTbGljZTpmb3IoYj0wO2I8YS5kaW1zLmxlbmd0aDsrK2IpdGhpcy52aXNpdFNsaWNlKGEuZGltc1tiXSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKX19O2IucHJvdG90eXBlLnZpc2l0U3RtdD1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1hLFwidmlzaXRTdG10IGNhbGxlZCB3aXRoIHVuZGVmaW5lZFwiKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmFkZERlZihhLm5hbWUsMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7XG50aGlzLmVudGVyQmxvY2soYS5uYW1lLnYsXCJmdW5jdGlvblwiLGEsYS5saW5lbm8pO3RoaXMudmlzaXRBcmd1bWVudHMoYS5hcmdzLGEubGluZW5vKTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ2xhc3NEZWY6dGhpcy5hZGREZWYoYS5uYW1lLDIsYS5saW5lbm8pO3RoaXMuU0VRRXhwcihhLmJhc2VzKTthLmRlY29yYXRvcl9saXN0JiZ0aGlzLlNFUUV4cHIoYS5kZWNvcmF0b3JfbGlzdCk7dGhpcy5lbnRlckJsb2NrKGEubmFtZS52LFwiY2xhc3NcIixhLGEubGluZW5vKTt0aGlzLmN1ckNsYXNzPWEubmFtZTt0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLmV4aXRCbG9jaygpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmV0dXJuOmlmKGEudmFsdWUmJih0aGlzLnZpc2l0RXhwcihhLnZhbHVlKSx0aGlzLmN1ci5yZXR1cm5zVmFsdWU9ITAsdGhpcy5jdXIuZ2VuZXJhdG9yKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvclwiLFxudGhpcy5maWxlbmFtZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NpZ246dGhpcy5TRVFFeHByKGEudGFyZ2V0cyk7dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Bbm5Bc3NpZ246aWYoYS50YXJnZXQuY29uc3RydWN0b3I9PVNrLmFzdG5vZGVzLk5hbWUpe3ZhciBjPWEudGFyZ2V0O3ZhciBmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxjLmlkKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjIwNDkmJnRoaXMuZ2xvYmFsIT10aGlzLmN1ci5zeW1GbGFncyYmYS5zaW1wbGUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJhbm5vdGF0ZWQgbmFtZSAnXCIrZitcIicgY2FuJ3QgYmUgZ2xvYmFsXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YS5zaW1wbGU/dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLFxuNDA5OCxhLmxpbmVubyk6YS52YWx1ZSYmdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDIsYS5saW5lbm8pfWVsc2UgdGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuYW5ub3RhdGlvbik7YS52YWx1ZSYmdGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5BdWdBc3NpZ246dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6YS5kZXN0JiZ0aGlzLnZpc2l0RXhwcihhLmRlc3QpO3RoaXMuU0VRRXhwcihhLnZhbHVlcyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6dGhpcy52aXNpdEV4cHIoYS50YXJnZXQpO3RoaXMudmlzaXRFeHByKGEuaXRlcik7dGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5XaGlsZTp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO1xudGhpcy5TRVFTdG10KGEuYm9keSk7YS5vcmVsc2UmJnRoaXMuU0VRU3RtdChhLm9yZWxzZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5JZjp0aGlzLnZpc2l0RXhwcihhLnRlc3QpO3RoaXMuU0VRU3RtdChhLmJvZHkpO2Eub3JlbHNlJiZ0aGlzLlNFUVN0bXQoYS5vcmVsc2UpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUmFpc2U6YS5leGMmJih0aGlzLnZpc2l0RXhwcihhLmV4YyksYS5pbnN0JiYodGhpcy52aXNpdEV4cHIoYS5pbnN0KSxhLnRiYWNrJiZ0aGlzLnZpc2l0RXhwcihhLnRiYWNrKSksYS5jYXVzZSYmdGhpcy52aXNpdEV4cHIoYS5jYXVzZSkpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzZXJ0OnRoaXMudmlzaXRFeHByKGEudGVzdCk7YS5tc2cmJnRoaXMudmlzaXRFeHByKGEubXNnKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpjYXNlIFNrLmFzdG5vZGVzLkltcG9ydEZyb206dGhpcy52aXNpdEFsaWFzKGEubmFtZXMsYS5saW5lbm8pO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuR2xvYmFsOnZhciBrPVxuYS5uYW1lcy5sZW5ndGg7Zm9yKGI9MDtiPGs7KytiKXtmPVNrLm1hbmdsZU5hbWUodGhpcy5jdXJDbGFzcyxhLm5hbWVzW2JdKS52O2Y9U2suZml4UmVzZXJ2ZWQoZik7Yz10aGlzLmN1ci5zeW1GbGFnc1tmXTtpZihjJjEwKXtpZihjJjIpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyBhc3NpZ25lZCB0byBiZWZvcmUgZ2xvYmFsIGRlY2xhcmF0aW9uXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJuYW1lICdcIitmK1wiJyBpcyB1c2VkIHByaW9yIHRvIGdsb2JhbCBkZWNsYXJhdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO310aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoZiksMSxhLmxpbmVubyl9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5FeHByOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFzczpjYXNlIFNrLmFzdG5vZGVzLkJyZWFrOmNhc2UgU2suYXN0bm9kZXMuQ29udGludWU6Y2FzZSBTay5hc3Rub2Rlcy5EZWJ1Z2dlcjpicmVhaztcbmNhc2UgU2suYXN0bm9kZXMuV2l0aDplKHRoaXMudmlzaXRfd2l0aGl0ZW0uYmluZCh0aGlzKSxhLml0ZW1zKTtlKHRoaXMudmlzaXRTdG10LmJpbmQodGhpcyksYS5ib2R5KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlRyeTp0aGlzLlNFUVN0bXQoYS5ib2R5KTt0aGlzLnZpc2l0RXhjZXB0aGFuZGxlcnMoYS5oYW5kbGVycyk7dGhpcy5TRVFTdG10KGEub3JlbHNlKTt0aGlzLlNFUVN0bXQoYS5maW5hbGJvZHkpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1wiIGluIHZpc2l0U3RtdFwiKX19O2IucHJvdG90eXBlLnZpc2l0X3dpdGhpdGVtPWZ1bmN0aW9uKGEpe3RoaXMudmlzaXRFeHByKGEuY29udGV4dF9leHByKTthLm9wdGlvbmFsX3ZhcnMmJnRoaXMudmlzaXRFeHByKGEub3B0aW9uYWxfdmFycyl9O2IucHJvdG90eXBlLnZpc2l0RXhwcj1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh2b2lkIDAhPT1cbmEsXCJ2aXNpdEV4cHIgY2FsbGVkIHdpdGggdW5kZWZpbmVkXCIpO3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLkJvb2xPcDp0aGlzLlNFUUV4cHIoYS52YWx1ZXMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQmluT3A6dGhpcy52aXNpdEV4cHIoYS5sZWZ0KTt0aGlzLnZpc2l0RXhwcihhLnJpZ2h0KTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6dGhpcy52aXNpdEV4cHIoYS5vcGVyYW5kKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTp0aGlzLmFkZERlZihuZXcgU2suYnVpbHRpbi5zdHIoXCJsYW1iZGFcIiksMixhLmxpbmVubyk7YS5hcmdzLmRlZmF1bHRzJiZ0aGlzLlNFUUV4cHIoYS5hcmdzLmRlZmF1bHRzKTt0aGlzLmVudGVyQmxvY2soXCJsYW1iZGFcIixcImZ1bmN0aW9uXCIsYSxhLmxpbmVubyk7dGhpcy52aXNpdEFyZ3VtZW50cyhhLmFyZ3MsYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuYm9keSk7dGhpcy5leGl0QmxvY2soKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLklmRXhwOnRoaXMudmlzaXRFeHByKGEudGVzdCk7XG50aGlzLnZpc2l0RXhwcihhLmJvZHkpO3RoaXMudmlzaXRFeHByKGEub3JlbHNlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3Q6dGhpcy5TRVFFeHByKGEua2V5cyk7dGhpcy5TRVFFeHByKGEudmFsdWVzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOmNhc2UgU2suYXN0bm9kZXMuU2V0Q29tcDp0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0Q29tcDp0aGlzLm5ld1RtcG5hbWUoYS5saW5lbm8pO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLnZpc2l0Q29tcHJlaGVuc2lvbihhLmdlbmVyYXRvcnMsMCk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6dGhpcy52aXNpdEdlbmV4cChhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLllpZWxkOmEudmFsdWUmJnRoaXMudmlzaXRFeHByKGEudmFsdWUpO3RoaXMuY3VyLmdlbmVyYXRvcj0hMDtpZih0aGlzLmN1ci5yZXR1cm5zVmFsdWUpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCIncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3JcIixcbnRoaXMuZmlsZW5hbWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQ29tcGFyZTp0aGlzLnZpc2l0RXhwcihhLmxlZnQpO3RoaXMuU0VRRXhwcihhLmNvbXBhcmF0b3JzKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNhbGw6dGhpcy52aXNpdEV4cHIoYS5mdW5jKTtpZihhLmFyZ3MpZm9yKGxldCBiIG9mIGEuYXJncyliLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZD90aGlzLnZpc2l0RXhwcihiLnZhbHVlKTp0aGlzLnZpc2l0RXhwcihiKTtpZihhLmtleXdvcmRzKWZvcihsZXQgYiBvZiBhLmtleXdvcmRzKXRoaXMudmlzaXRFeHByKGIudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTnVtOmNhc2UgU2suYXN0bm9kZXMuU3RyOmNhc2UgU2suYXN0bm9kZXMuQnl0ZXM6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Kb2luZWRTdHI6Zm9yKGxldCBiIG9mIGEudmFsdWVzKXRoaXMudmlzaXRFeHByKGIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRm9ybWF0dGVkVmFsdWU6dGhpcy52aXNpdEV4cHIoYS52YWx1ZSk7XG5hLmZvcm1hdF9zcGVjJiZ0aGlzLnZpc2l0RXhwcihhLmZvcm1hdF9zcGVjKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlN1YnNjcmlwdDp0aGlzLnZpc2l0RXhwcihhLnZhbHVlKTt0aGlzLnZpc2l0U2xpY2UoYS5zbGljZSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnRoaXMuYWRkRGVmKGEuaWQsYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkPzg6MixhLmxpbmVubyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lQ29uc3RhbnQ6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5MaXN0OmNhc2UgU2suYXN0bm9kZXMuVHVwbGU6Y2FzZSBTay5hc3Rub2Rlcy5TZXQ6dGhpcy5TRVFFeHByKGEuZWx0cyk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5TdGFycmVkOnRoaXMudmlzaXRFeHByKGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwiVW5oYW5kbGVkIHR5cGUgXCIrYS5jb25zdHJ1Y3Rvci5uYW1lK1xuXCIgaW4gdmlzaXRFeHByXCIpfX07Yi5wcm90b3R5cGUudmlzaXRDb21wcmVoZW5zaW9uPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmxlbmd0aDtmb3IoYz1iO2M8ZDsrK2MpYj1hW2NdLHRoaXMudmlzaXRFeHByKGIudGFyZ2V0KSx0aGlzLnZpc2l0RXhwcihiLml0ZXIpLHRoaXMuU0VRRXhwcihiLmlmcyl9O2IucHJvdG90eXBlLnZpc2l0QWxpYXM9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2ZvcihkPTA7ZDxhLmxlbmd0aDsrK2Qpe3ZhciBlPWFbZF07dmFyIGY9Yz1udWxsPT09ZS5hc25hbWU/ZS5uYW1lLnY6ZS5hc25hbWUudjtlPWMuaW5kZXhPZihcIi5cIik7LTEhPT1lJiYoZj1jLnN1YnN0cigwLGUpKTtpZihcIipcIiE9PWMpdGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKGYpLDEwMjQsYik7ZWxzZSBpZihcIm1vZHVsZVwiIT09dGhpcy5jdXIuYmxvY2tUeXBlKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiaW1wb3J0ICogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbFwiLFxudGhpcy5maWxlbmFtZSk7fX07Yi5wcm90b3R5cGUudmlzaXRHZW5leHA9ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZW5lcmF0b3JzWzBdO3RoaXMudmlzaXRFeHByKGIuaXRlcik7dGhpcy5lbnRlckJsb2NrKFwiZ2VuZXhwclwiLFwiZnVuY3Rpb25cIixhLGEubGluZW5vKTt0aGlzLmN1ci5nZW5lcmF0b3I9ITA7dGhpcy5hZGREZWYobmV3IFNrLmJ1aWx0aW4uc3RyKFwiLjBcIiksNCxhLmxpbmVubyk7dGhpcy52aXNpdEV4cHIoYi50YXJnZXQpO3RoaXMuU0VRRXhwcihiLmlmcyk7dGhpcy52aXNpdENvbXByZWhlbnNpb24oYS5nZW5lcmF0b3JzLDEpO3RoaXMudmlzaXRFeHByKGEuZWx0KTt0aGlzLmV4aXRCbG9jaygpfTtiLnByb3RvdHlwZS52aXNpdEV4Y2VwdGhhbmRsZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM7Zm9yKGI9MDtjPWFbYl07KytiKWMudHlwZSYmdGhpcy52aXNpdEV4cHIoYy50eXBlKSxjLm5hbWUmJnRoaXMudmlzaXRFeHByKGMubmFtZSksdGhpcy5TRVFTdG10KGMuYm9keSl9O2IucHJvdG90eXBlLmFuYWx5emVCbG9jaz1cbmZ1bmN0aW9uKGEsYixjLGUpe3ZhciBkPXt9O3ZhciBnPXt9LGg9e30sbj17fSxsPXt9O1wiY2xhc3NcIj09YS5ibG9ja1R5cGUmJihmKGgsZSksYiYmZihuLGIpKTtmb3IocSBpbiBhLnN5bUZsYWdzKXt2YXIgbT1hLnN5bUZsYWdzW3FdO3RoaXMuYW5hbHl6ZU5hbWUoYSxnLHEsbSxiLGQsYyxlKX1cImNsYXNzXCIhPT1hLmJsb2NrVHlwZSYmKFwiZnVuY3Rpb25cIj09PWEuYmxvY2tUeXBlJiZmKG4sZCksYiYmZihuLGIpLGYoaCxlKSk7ZD17fTt2YXIgcT1hLmNoaWxkcmVuLmxlbmd0aDtmb3IobT0wO208cTsrK20paWYoZT1hLmNoaWxkcmVuW21dLHRoaXMuYW5hbHl6ZUNoaWxkQmxvY2soZSxuLGwsaCxkKSxlLmhhc0ZyZWV8fGUuY2hpbGRIYXNGcmVlKWEuY2hpbGRIYXNGcmVlPSEwO2YobCxkKTtcImZ1bmN0aW9uXCI9PT1hLmJsb2NrVHlwZSYmdGhpcy5hbmFseXplQ2VsbHMoZyxsKTtiPXRoaXMudXBkYXRlU3ltYm9scyhhLnN5bUZsYWdzLGcsYixsLFwiY2xhc3NcIj09PWEuYmxvY2tUeXBlKTtcbmEuaGFzRnJlZT1hLmhhc0ZyZWV8fGI7ZihjLGwpfTtiLnByb3RvdHlwZS5hbmFseXplQ2hpbGRCbG9jaz1mdW5jdGlvbihhLGIsYyxlLGspe3ZhciBkPXt9O2YoZCxiKTtiPXt9O2YoYixjKTtjPXt9O2YoYyxlKTt0aGlzLmFuYWx5emVCbG9jayhhLGQsYixjKTtmKGssYil9O2IucHJvdG90eXBlLmFuYWx5emVDZWxscz1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjIGluIGEpe3ZhciBkPWFbY107MT09PWQmJnZvaWQgMCE9PWJbY10mJihhW2NdPTUsZGVsZXRlIGJbY10pfX07Yi5wcm90b3R5cGUudXBkYXRlU3ltYm9scz1mdW5jdGlvbihhLGIsYyxlLGYpe3ZhciBkLGc9ITE7Zm9yKGQgaW4gYSl7dmFyIGs9YVtkXTt2YXIgaD1iW2RdO2t8PWg8PDExO2FbZF09a31mb3IoZCBpbiBlKWI9YVtkXSx2b2lkIDAhPT1iP2YmJmImMTAzMSYmKGJ8PTUxMixhW2RdPWIpOnZvaWQgMCE9PWNbZF0mJihhW2RdPTgxOTIsZz0hMCk7cmV0dXJuIGd9O2IucHJvdG90eXBlLmFuYWx5emVOYW1lPWZ1bmN0aW9uKGEsXG5iLGMsZSxmLHAsbCxtKXtpZihlJjEpe2lmKGUmNCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm5hbWUgJ1wiK2MrXCInIGlzIGxvY2FsIGFuZCBnbG9iYWxcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtiW2NdPTI7bVtjXT1udWxsO2YmJnZvaWQgMCE9PWZbY10mJmRlbGV0ZSBmW2NdfWVsc2UgZSYxMDMwPyhiW2NdPTEscFtjXT1udWxsLGRlbGV0ZSBtW2NdKTpmJiZ2b2lkIDAhPT1mW2NdPyhiW2NdPTQsYS5oYXNGcmVlPSEwLGxbY109bnVsbCk6KG0mJnZvaWQgMCE9PW1bY118fCFhLmlzTmVzdGVkfHwoYS5oYXNGcmVlPSEwKSxiW2NdPTMpfTtiLnByb3RvdHlwZS5hbmFseXplPWZ1bmN0aW9uKCl7dGhpcy5hbmFseXplQmxvY2sodGhpcy50b3AsbnVsbCx7fSx7fSl9O1NrLnN5bWJvbHRhYmxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9bmV3IGIoYyk7ZC5lbnRlckJsb2NrKFwidG9wXCIsXCJtb2R1bGVcIixhLDApO2QudG9wPWQuY3VyO2ZvcihjPTA7YzxhLmJvZHkubGVuZ3RoOysrYylkLnZpc2l0U3RtdChhLmJvZHlbY10pO1xuZC5leGl0QmxvY2soKTtkLmFuYWx5emUoKTtyZXR1cm4gZH07U2suZHVtcFN5bXRhYj1mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihhKXtyZXR1cm4gYT9cIlRydWVcIjpcIkZhbHNlXCJ9LGM9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoYj0wO2I8YS5sZW5ndGg7KytiKWMucHVzaCgobmV3IFNrLmJ1aWx0aW4uc3RyKGFbYl0pKS4kcigpLnYpO3JldHVyblwiW1wiK2Muam9pbihcIiwgXCIpK1wiXVwifSxlPWZ1bmN0aW9uKGEsZCl7dmFyIGYsZzt2b2lkIDA9PT1kJiYoZD1cIlwiKTt2YXIgaz1kK1wiU3ltX3R5cGU6IFwiK2EuZ2V0X3R5cGUoKStcIlxcblwiO2srPWQrXCJTeW1fbmFtZTogXCIrYS5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIlN5bV9saW5lbm86IFwiK2EuZ2V0X2xpbmVubygpK1wiXFxuXCI7ays9ZCtcIlN5bV9uZXN0ZWQ6IFwiK2IoYS5pc19uZXN0ZWQoKSkrXCJcXG5cIjtrKz1kK1wiU3ltX2hhc2NoaWxkcmVuOiBcIitiKGEuaGFzX2NoaWxkcmVuKCkpK1wiXFxuXCI7XCJjbGFzc1wiPT09YS5nZXRfdHlwZSgpP2srPWQrXG5cIkNsYXNzX21ldGhvZHM6IFwiK2MoYS5nZXRfbWV0aG9kcygpKStcIlxcblwiOlwiZnVuY3Rpb25cIj09PWEuZ2V0X3R5cGUoKSYmKGsrPWQrXCJGdW5jX3BhcmFtczogXCIrYyhhLmdldF9wYXJhbWV0ZXJzKCkpK1wiXFxuXCIsays9ZCtcIkZ1bmNfbG9jYWxzOiBcIitjKGEuZ2V0X2xvY2FscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2dsb2JhbHM6IFwiK2MoYS5nZXRfZ2xvYmFscygpKStcIlxcblwiLGsrPWQrXCJGdW5jX2ZyZWVzOiBcIitjKGEuZ2V0X2ZyZWVzKCkpK1wiXFxuXCIpO2srPWQrXCItLSBJZGVudGlmaWVycyAtLVxcblwiO3ZhciBoPWEuZ2V0X2lkZW50aWZpZXJzKCk7dmFyIG49aC5sZW5ndGg7Zm9yKGc9MDtnPG47KytnKXt2YXIgbD1hLmxvb2t1cChoW2ddKTtrKz1kK1wibmFtZTogXCIrbC5nZXRfbmFtZSgpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcmVmZXJlbmNlZDogXCIrYihsLmlzX3JlZmVyZW5jZWQoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19pbXBvcnRlZDogXCIrYihsLmlzX2ltcG9ydGVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfcGFyYW1ldGVyOiBcIitcbmIobC5pc19wYXJhbWV0ZXIoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19nbG9iYWw6IFwiK2IobC5pc19nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19kZWNsYXJlZF9nbG9iYWw6IFwiK2IobC5pc19kZWNsYXJlZF9nbG9iYWwoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19sb2NhbDogXCIrYihsLmlzX2xvY2FsKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfZnJlZTogXCIrYihsLmlzX2ZyZWUoKSkrXCJcXG5cIjtrKz1kK1wiICBpc19hc3NpZ25lZDogXCIrYihsLmlzX2Fzc2lnbmVkKCkpK1wiXFxuXCI7ays9ZCtcIiAgaXNfbmFtZXNwYWNlOiBcIitiKGwuaXNfbmFtZXNwYWNlKCkpK1wiXFxuXCI7dmFyIG09bC5nZXRfbmFtZXNwYWNlcygpO3ZhciBwPW0ubGVuZ3RoO2srPWQrXCIgIG5hbWVzcGFjZXM6IFtcXG5cIjt2YXIgcT1bXTtmb3IoZj0wO2Y8cDsrK2YpbD1tW2ZdLHEucHVzaChlKGwsZCtcIiAgICBcIikpO2srPXEuam9pbihcIlxcblwiKTtrKz1kK1wiICBdXFxuXCJ9cmV0dXJuIGt9O3JldHVybiBlKGEudG9wLFwiXCIpfTtTay5leHBvcnRTeW1ib2woXCJTay5zeW1ib2x0YWJsZVwiLFxuU2suc3ltYm9sdGFibGUpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmR1bXBTeW10YWJcIixTay5kdW1wU3ltdGFiKX0sZnVuY3Rpb24obSxxKXtmdW5jdGlvbiBhKGEsYixjLGUsZil7dGhpcy5maWxlbmFtZT1hO3RoaXMuc3Q9Yjt0aGlzLmZsYWdzPWM7dGhpcy5jYW5TdXNwZW5kPWU7dGhpcy5pbnRlcmFjdGl2ZT0hMTt0aGlzLm5lc3RsZXZlbD0wO3RoaXMudT1udWxsO3RoaXMuc3RhY2s9W107dGhpcy5yZXN1bHQ9W107dGhpcy5hbGxVbml0cz1bXTt0aGlzLnNvdXJjZT1mP2Yuc3BsaXQoXCJcXG5cIik6ITF9ZnVuY3Rpb24gYygpe3RoaXMubmFtZT10aGlzLnN0ZT1udWxsO3RoaXMuZG9lc1N1c3BlbmQ9dGhpcy5jYW5TdXNwZW5kPSExO3RoaXMucHJpdmF0ZV89bnVsbDt0aGlzLmxpbmVubz10aGlzLmZpcnN0bGluZW5vPTA7dGhpcy5saW5lbm9TZXQ9ITE7dGhpcy5sb2NhbG5hbWVzPVtdO3RoaXMubG9jYWx0ZW1wcz1bXTt0aGlzLnRlbXBzVG9TYXZlPVtdO3RoaXMuYmxvY2tudW09MDt0aGlzLmJsb2Nrcz1cbltdO3RoaXMuY3VyYmxvY2s9MDt0aGlzLmNvbnN0cz17fTt0aGlzLnNjb3BlbmFtZT1udWxsO3RoaXMuc3VmZml4Q29kZT10aGlzLnN3aXRjaENvZGU9dGhpcy52YXJEZWNsc0NvZGU9dGhpcy5wcmVmaXhDb2RlPVwiXCI7dGhpcy5icmVha0Jsb2Nrcz1bXTt0aGlzLmNvbnRpbnVlQmxvY2tzPVtdO3RoaXMuZXhjZXB0QmxvY2tzPVtdO3RoaXMuZmluYWxseUJsb2Nrcz1bXX1mdW5jdGlvbiBiKGEpe3JldHVybiB2b2lkIDA9PT1oW2FdP2E6YStcIl8kcnckXCJ9ZnVuY3Rpb24gZShhLGIpe3ZhciBjPWIudjtpZihudWxsPT09YXx8bnVsbD09PWN8fFwiX1wiIT09Yy5jaGFyQXQoMCl8fFwiX1wiIT09Yy5jaGFyQXQoMSl8fFwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMSkmJlwiX1wiPT09Yy5jaGFyQXQoYy5sZW5ndGgtMikpcmV0dXJuIGI7dmFyIGQ9YS52O2QucmVwbGFjZSgvXy9nLFwiXCIpO2lmKFwiXCI9PT1kKXJldHVybiBiO2Q9YS52O2QucmVwbGFjZSgvXl8qLyxcIlwiKTtyZXR1cm4gZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfXCIrXG5kK2MpfWZ1bmN0aW9uIGYoYSl7bGV0IGI9J1wiJztmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7bGV0IGQ9YS5jaGFyQ29kZUF0KGMpO2I9MTA9PWQ/YitcIlxcXFxuXCI6OTI9PWQ/YitcIlxcXFxcXFxcXCI6MzQ9PWR8fDMyPmR8fDEyNzw9ZCYmMjU2PmQ/YisoXCJcXFxceFwiKyhcIjBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC0yKSk6MjU2PD1kP2IrKFwiXFxcXHVcIisoXCIwMDBcIitkLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSk6YithLmNoYXJBdChjKX1yZXR1cm4gYisnXCInfXZhciBsO1NrLmdlbnN5bWNvdW50PTA7Yy5wcm90b3R5cGUuYWN0aXZhdGVTY29wZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7bD1mdW5jdGlvbigpe3ZhciBiLGM9YS5ibG9ja3NbYS5jdXJibG9ja107aWYobnVsbD09PWMuX25leHQpZm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMucHVzaChhcmd1bWVudHNbYl0pfX07YS5wcm90b3R5cGUuZ2V0U291cmNlTGluZT1mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnNvdXJjZSk7XG5yZXR1cm4gdGhpcy5zb3VyY2VbYS0xXX07YS5wcm90b3R5cGUuYW5ub3RhdGVTb3VyY2U9ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zb3VyY2Upe3ZhciBjPWEubGluZW5vO3ZhciBkPWEuY29sX29mZnNldDtsKFwiXFxuLy9cXG4vLyBsaW5lIFwiLGMsXCI6XFxuLy8gXCIsdGhpcy5nZXRTb3VyY2VMaW5lKGMpLFwiXFxuLy8gXCIpO2ZvcihiPTA7YjxkOysrYilsKFwiIFwiKTtsKFwiXlxcbi8vXFxuXCIpO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMCE9PWEubGluZW5vJiZ2b2lkIDAhPT1hLmNvbF9vZmZzZXQpO2woXCIkY3VyckxpbmVObyA9IFwiLGMsXCI7XFxuJGN1cnJDb2xObyA9IFwiLGQsXCI7XFxuXFxuXCIpfX07YS5wcm90b3R5cGUuZ2Vuc3ltPWZ1bmN0aW9uKGEpe3JldHVybiBhPVwiJFwiKyhhfHxcIlwiKStTay5nZW5zeW1jb3VudCsrfTthLnByb3RvdHlwZS5uaWNlTmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZW5zeW0oYS5yZXBsYWNlKFwiPFwiLFwiXCIpLnJlcGxhY2UoXCI+XCIsXCJcIikucmVwbGFjZShcIiBcIixcIl9cIikpfTtcbnZhciBoPVNrLmJ1aWx0aW4uc3RyLnJlc2VydmVkV29yZHNfO2EucHJvdG90eXBlLm1ha2VDb25zdGFudD1mdW5jdGlvbihhKXt2YXIgYixjPVwiXCI7Zm9yKGI9MDtiPGFyZ3VtZW50cy5sZW5ndGg7KytiKWMrPWFyZ3VtZW50c1tiXTtmb3IoZCBpbiB0aGlzLnUuY29uc3RzKWlmKHRoaXMudS5jb25zdHMuaGFzT3duUHJvcGVydHkoZCkmJihiPXRoaXMudS5jb25zdHNbZF0sYj09YykpcmV0dXJuIGQ7dmFyIGQ9dGhpcy51LnNjb3BlbmFtZStcIi5cIit0aGlzLmdlbnN5bShcImNvbnN0XCIpO3RoaXMudS5jb25zdHNbZF09YztyZXR1cm4gZH07YS5wcm90b3R5cGUuX2dyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD10aGlzLmdlbnN5bShhKTt0aGlzLnUubG9jYWx0ZW1wcy5wdXNoKGQpO2woXCJ2YXIgXCIsZCxcIj1cIik7Zm9yKGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWwoYXJndW1lbnRzW2NdKTtsKFwiO1wiKTtyZXR1cm4gZH07YS5wcm90b3R5cGUub3V0cHV0SW50ZXJydXB0VGVzdD1mdW5jdGlvbigpe3ZhciBhPVxuXCJcIjtpZihudWxsIT09U2suZXhlY0xpbWl0fHxudWxsIT09U2sueWllbGRMaW1pdCYmdGhpcy51LmNhblN1c3BlbmQpYSs9XCJ2YXIgJGRhdGVOb3cgPSBEYXRlLm5vdygpO1wiLG51bGwhPT1Tay5leGVjTGltaXQmJihhKz1cImlmICgkZGF0ZU5vdyAtIFNrLmV4ZWNTdGFydCA+IFNrLmV4ZWNMaW1pdCkge3Rocm93IG5ldyBTay5idWlsdGluLlRpbWVMaW1pdEVycm9yKFNrLnRpbWVvdXRNc2coKSl9XCIpLG51bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGE9YStcImlmICgkZGF0ZU5vdyAtIFNrLmxhc3RZaWVsZCA+IFNrLnlpZWxkTGltaXQpIHtcIisoXCJ2YXIgJHN1c3AgPSAkc2F2ZVN1c3BlbnNpb24oe2RhdGE6IHt0eXBlOiAnU2sueWllbGQnfSwgcmVzdW1lOiBmdW5jdGlvbigpIHt9fSwgJ1wiK3RoaXMuZmlsZW5hbWUrXCInLCRjdXJyTGluZU5vLCRjdXJyQ29sTm8pO1wiKSxhKz1cIiRzdXNwLiRibGsgPSAkYmxrOyRzdXNwLm9wdGlvbmFsID0gdHJ1ZTtyZXR1cm4gJHN1c3A7fVwiLFxudGhpcy51LmRvZXNTdXNwZW5kPSEwKTtyZXR1cm4gYX07YS5wcm90b3R5cGUuX2p1bXBmYWxzZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqZmFsc2VcIixcIihcIixhLFwiPT09ZmFsc2V8fCFTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgZmFpbGVkICovJGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIj09PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wbm90dW5kZWY9ZnVuY3Rpb24oYSxiKXtsKFwiaWYoXCIsYSxcIiE9PXVuZGVmaW5lZCl7JGJsaz1cIixiLFwiO2NvbnRpbnVlO31cIil9O2EucHJvdG90eXBlLl9qdW1wdHJ1ZT1mdW5jdGlvbihhLGIpe2E9dGhpcy5fZ3IoXCJqdHJ1ZVwiLFwiKFwiLGEsXCI9PT10cnVlfHxTay5taXNjZXZhbC5pc1RydWUoXCIsYSxcIikpXCIpO2woXCJpZihcIixhLFwiKXsvKnRlc3QgcGFzc2VkICovJGJsaz1cIixcbmIsXCI7Y29udGludWU7fVwiKX07YS5wcm90b3R5cGUuX2p1bXA9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dCYmKGwoXCIkYmxrPVwiLGEsXCI7XCIpLHRoaXMudS5ibG9ja3NbdGhpcy51LmN1cmJsb2NrXS5fbmV4dD1hKX07YS5wcm90b3R5cGUuX2NoZWNrU3VzcGVuc2lvbj1mdW5jdGlvbihhKXtpZih0aGlzLnUuY2FuU3VzcGVuZCl7dmFyIGI9dGhpcy5uZXdCbG9jayhcImZ1bmN0aW9uIHJldHVybiBvciByZXN1bWUgc3VzcGVuc2lvblwiKTt0aGlzLl9qdW1wKGIpO3RoaXMuc2V0QmxvY2soYik7YT1hfHx7bGluZW5vOlwiJGN1cnJMaW5lTm9cIixjb2xfb2Zmc2V0OlwiJGN1cnJDb2xOb1wifTtsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7IHJldHVybiAkc2F2ZVN1c3BlbnNpb24oJHJldCwnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTsgfVwiKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITA7XG50aGlzLnUudGVtcHNUb1NhdmU9dGhpcy51LnRlbXBzVG9TYXZlLmNvbmNhdCh0aGlzLnUubG9jYWx0ZW1wcyl9ZWxzZSBsKFwiaWYgKCRyZXQgJiYgJHJldC4kaXNTdXNwZW5zaW9uKSB7ICRyZXQgPSBTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coJHJldCk7IH1cIil9O2EucHJvdG90eXBlLmN1bnBhY2tzdGFyc3RvYXJyYXk9ZnVuY3Rpb24oYSxiKXtpZighYXx8MD09YS5sZW5ndGgpcmV0dXJuXCJbXVwiO2xldCBjPSExO2ZvcihsZXQgZCBvZiBhKXtpZihiJiZjKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiRXh0ZW5kZWQgYXJndW1lbnQgdW5wYWNraW5nIGlzIG5vdCBwZXJtaXR0ZWQgaW4gUHl0aG9uIDJcIik7ZC5jb25zdHJ1Y3Rvcj09PVNrLmFzdG5vZGVzLlN0YXJyZWQmJihjPSEwKX1pZihjKXtiPXRoaXMuX2dyKFwidW5wYWNrXCIsXCJbXVwiKTtmb3IobGV0IGMgb2YgYSljLmNvbnN0cnVjdG9yIT09U2suYXN0bm9kZXMuU3RhcnJlZD9sKGIsXG5cIi5wdXNoKFwiLHRoaXMudmV4cHIoYyksXCIpO1wiKToobChcIiRyZXQgPSBTay5taXNjZXZhbC5pdGVyRm9yKFNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihjLnZhbHVlKSxcIiksIGZ1bmN0aW9uKGUpIHsgXCIsYixcIi5wdXNoKGUpOyB9KTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCkpO3JldHVybiBifXJldHVyblwiW1wiK2EubWFwKGE9PnRoaXMudmV4cHIoYSkpLmpvaW4oXCIsXCIpK1wiXVwifTthLnByb3RvdHlwZS5jdHVwbGVsaXN0b3JzZXQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO1NrLmFzc2VydHMuYXNzZXJ0KFwidHVwbGVcIj09PWN8fFwibGlzdFwiPT09Y3x8XCJzZXRcIj09PWMpO3ZhciBlPSExO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoO2QrKylpZihhLmVsdHNbZF0uY29uc3RydWN0b3I9PT1Tay5hc3Rub2Rlcy5TdGFycmVkKXtlPSEwO3ZhciBmPWQ7YnJlYWt9aWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5TdG9yZSl7aWYoZSl7aWYoIVNrLl9fZnV0dXJlX18ucHl0aG9uMyl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImFzc2lnbm1lbnQgdW5wYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiLFxudGhpcy5maWxlbmFtZSxhLmxpbmVubyk7Zm9yKGQ9ZisxO2Q8YS5lbHRzLmxlbmd0aDtkKyspaWYoYS5lbHRzW2RdLmNvbnN0cnVjdG9yPT09U2suYXN0bm9kZXMuU3RhcnJlZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIm11bHRpcGxlIHN0YXJyZWQgZXhwcmVzc2lvbnMgaW4gYXNzaWdubWVudFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO31jPWU/ZjphLmVsdHMubGVuZ3RoO2woXCIkcmV0ID0gU2suYWJzdHIuc2VxdWVuY2VVbnBhY2soXCIrYitcIixcIitjK1wiLFwiKyhlP2EuZWx0cy5sZW5ndGgtMTpjKStcIiwgXCIrZStcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbigpO2I9dGhpcy5fZ3IoXCJpdGVtc1wiLFwiJHJldFwiKTtmb3IoZD0wO2Q8YS5lbHRzLmxlbmd0aDsrK2QpZD09PWY/dGhpcy52ZXhwcihhLmVsdHNbZF0udmFsdWUsYitcIltcIitkK1wiXVwiKTp0aGlzLnZleHByKGEuZWx0c1tkXSxiK1wiW1wiK2QrXCJdXCIpfWVsc2UgaWYoYS5jdHg9PT1Tay5hc3Rub2Rlcy5Mb2FkfHxcInNldFwiPT09XG5jKXtpZihlKXtpZighU2suX19mdXR1cmVfXy5weXRob24zKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiTGlzdCBwYWNraW5nIHdpdGggc3RhcnMgaXMgbm90IHN1cHBvcnRlZCBpbiBQeXRob24gMlwiKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFwiLHRoaXMuY3VucGFja3N0YXJzdG9hcnJheShhLmVsdHMpLFwiKVwiKX1pZihcInR1cGxlXCI9PT1jKXtlPSEwO2I9W107Zm9yKGQ9MDtkPGEuZWx0cy5sZW5ndGg7KytkKWY9dGhpcy52ZXhwcihhLmVsdHNbZF0pLGUmJi0xPT1mLmluZGV4T2YoXCIkY29uc3RcIikmJihlPSExKSxiLnB1c2goZik7aWYoZSlyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi50dXBsZShbXCIrYitcIl0pXCIpO2ZvcihkPTA7ZDxiLmxlbmd0aDsrK2QpYltkXT10aGlzLl9ncihcImVsZW1cIixiW2RdKTtyZXR1cm4gdGhpcy5fZ3IoXCJsb2FkXCIrYyxcIm5ldyBTay5idWlsdGluc1snXCIsYyxcIiddKFtcIixcbmIsXCJdKVwiKX1iPVtdO2ZvcihkPTA7ZDxhLmVsdHMubGVuZ3RoOysrZCliLnB1c2godGhpcy5fZ3IoXCJlbGVtXCIsdGhpcy52ZXhwcihhLmVsdHNbZF0pKSk7cmV0dXJuIHRoaXMuX2dyKFwibG9hZFwiK2MsXCJuZXcgU2suYnVpbHRpbnNbJ1wiLGMsXCInXShbXCIsYixcIl0pXCIpfX07YS5wcm90b3R5cGUuY2RpY3Q9ZnVuY3Rpb24oYSl7dmFyIGI7dmFyIGM9W107aWYobnVsbCE9PWEua2V5cylmb3IoU2suYXNzZXJ0cy5hc3NlcnQoYS52YWx1ZXMubGVuZ3RoPT09YS5rZXlzLmxlbmd0aCksYj0wO2I8YS52YWx1ZXMubGVuZ3RoOysrYil7dmFyIGQ9dGhpcy52ZXhwcihhLnZhbHVlc1tiXSk7Yy5wdXNoKHRoaXMudmV4cHIoYS5rZXlzW2JdKSk7Yy5wdXNoKGQpfXJldHVybiB0aGlzLl9ncihcImxvYWRkaWN0XCIsXCJuZXcgU2suYnVpbHRpbnNbJ2RpY3QnXShbXCIsYyxcIl0pXCIpfTthLnByb3RvdHlwZS5jbGlzdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkxpc3RDb21wKTtcbnZhciBiPXRoaXMuX2dyKFwiX2NvbXByXCIsXCJuZXcgU2suYnVpbHRpbnNbJ2xpc3QnXShbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJsaXN0XCIsYixhLmdlbmVyYXRvcnMsMCxhLmVsdCxudWxsLGEpfTthLnByb3RvdHlwZS5jZGljdGNvbXA9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkRpY3RDb21wKTt2YXIgYj10aGlzLl9ncihcIl9kY29tcHJcIixcIm5ldyBTay5idWlsdGlucy5kaWN0KFtdKVwiKTtyZXR1cm4gdGhpcy5jY29tcGdlbihcImRpY3RcIixiLGEuZ2VuZXJhdG9ycywwLGEudmFsdWUsYS5rZXksYSl9O2EucHJvdG90eXBlLmNzZXRjb21wPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TZXRDb21wKTt2YXIgYj10aGlzLl9ncihcIl9zZXRjb21wclwiLFwibmV3IFNrLmJ1aWx0aW5zLnNldChbXSlcIik7cmV0dXJuIHRoaXMuY2NvbXBnZW4oXCJzZXRcIixiLGEuZ2VuZXJhdG9ycywwLFxuYS5lbHQsbnVsbCxhKX07YS5wcm90b3R5cGUuY2NvbXBnZW49ZnVuY3Rpb24oYSxiLGMsZSxmLGgsbSl7dmFyIGQ9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgc3RhcnRcIiksZz10aGlzLm5ld0Jsb2NrKGErXCIgY29tcCBza2lwXCIpLGs9dGhpcy5uZXdCbG9jayhhK1wiIGNvbXAgYW5jaG9yXCIpLG49Y1tlXSxwPXRoaXMudmV4cHIobi5pdGVyKTtwPXRoaXMuX2dyKFwiaXRlclwiLFwiU2suYWJzdHIuaXRlcihcIixwLFwiKVwiKTt2YXIgcTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7bChcIiRyZXQgPSBTay5hYnN0ci5pdGVybmV4dChcIixwLFwiLCB0cnVlKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKG0pO3A9dGhpcy5fZ3IoXCJuZXh0XCIsXCIkcmV0XCIpO3RoaXMuX2p1bXB1bmRlZihwLGspO3RoaXMudmV4cHIobi50YXJnZXQscCk7dmFyIHU9bi5pZnM/bi5pZnMubGVuZ3RoOjA7Zm9yKHE9MDtxPHU7KytxKXA9dGhpcy52ZXhwcihuLmlmc1txXSksdGhpcy5fanVtcGZhbHNlKHAsZCk7KytlPGMubGVuZ3RoJiZcbnRoaXMuY2NvbXBnZW4oYSxiLGMsZSxmLGgsbSk7ZT49Yy5sZW5ndGgmJihjPXRoaXMudmV4cHIoZiksXCJkaWN0XCI9PT1hPyhhPXRoaXMudmV4cHIoaCksbChiLFwiLm1wJGFzc19zdWJzY3JpcHQoXCIsYSxcIixcIixjLFwiKTtcIikpOlwibGlzdFwiPT09YT9sKGIsXCIudi5wdXNoKFwiLGMsXCIpO1wiKTpcInNldFwiPT09YSYmbChiLFwiLnYubXAkYXNzX3N1YnNjcmlwdChcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fanVtcChnKSx0aGlzLnNldEJsb2NrKGcpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soayk7cmV0dXJuIGJ9O2EucHJvdG90eXBlLmN5aWVsZD1mdW5jdGlvbihhKXtpZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvblwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO3ZhciBiPVwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7YS52YWx1ZSYmKGI9dGhpcy52ZXhwcihhLnZhbHVlKSk7XG5hPXRoaXMubmV3QmxvY2soXCJhZnRlciB5aWVsZFwiKTtsKFwicmV0dXJuIFsvKnJlc3VtZSovXCIsYSxcIiwvKnJldCovXCIsYixcIl07XCIpO3RoaXMuc2V0QmxvY2soYSk7cmV0dXJuXCIkZ2VuLmdpJHNlbnR2YWx1ZVwifTthLnByb3RvdHlwZS5jY29tcGFyZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhLm9wcy5sZW5ndGg9PT1hLmNvbXBhcmF0b3JzLmxlbmd0aCk7dmFyIGM9dGhpcy52ZXhwcihhLmxlZnQpO3ZhciBkPWEub3BzLmxlbmd0aDt2YXIgZT10aGlzLm5ld0Jsb2NrKFwiZG9uZVwiKTt2YXIgZj10aGlzLl9ncihcImNvbXBhcmVyZXNcIixcIm51bGxcIik7Zm9yKGI9MDtiPGQ7KytiKXt2YXIgaD10aGlzLnZleHByKGEuY29tcGFyYXRvcnNbYl0pO2woXCIkcmV0ID0gU2suYnVpbHRpbi5ib29sKFNrLm1pc2NldmFsLnJpY2hDb21wYXJlQm9vbChcIixjLFwiLFwiLGgsXCIsJ1wiLGEub3BzW2JdLnByb3RvdHlwZS5fYXN0bmFtZSxcIicsIHRydWUpKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO1xubChmLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXBmYWxzZShcIiRyZXRcIixlKTtjPWh9dGhpcy5fanVtcChlKTt0aGlzLnNldEJsb2NrKGUpO3JldHVybiBmfTthLnByb3RvdHlwZS5jY2FsbD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnZleHByKGEuZnVuYyk7bGV0IGM9dGhpcy5jdW5wYWNrc3RhcnN0b2FycmF5KGEuYXJncywhU2suX19mdXR1cmVfXy5weXRob24zKTt2YXIgZD1cInVuZGVmaW5lZFwiO2lmKGEua2V5d29yZHMmJjA8YS5rZXl3b3Jkcy5sZW5ndGgpe2xldCBjPSExO2Q9W107Zm9yKGxldCBiIG9mIGEua2V5d29yZHMpe2lmKGMmJiFTay5fX2Z1dHVyZV9fLnB5dGhvbjMpdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQWR2YW5jZWQgdW5wYWNraW5nIG9mIGZ1bmN0aW9uIGFyZ3VtZW50cyBpcyBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO2IuYXJnPyhkLnB1c2goXCInXCIrYi5hcmcuditcIidcIiksZC5wdXNoKHRoaXMudmV4cHIoYi52YWx1ZSkpKTpjPSEwfWQ9XCJbXCIrZC5qb2luKFwiLFwiKStcblwiXVwiO2lmKGMpe2Q9dGhpcy5fZ3IoXCJrZXl3b3JkQXJnc1wiLGQpO2ZvcihsZXQgYyBvZiBhLmtleXdvcmRzKWMuYXJnfHwobChcIiRyZXQgPSBTay5hYnN0ci5tYXBwaW5nVW5wYWNrSW50b0tleXdvcmRBcnJheShcIixkLFwiLFwiLHRoaXMudmV4cHIoYy52YWx1ZSksXCIsXCIsYixcIik7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKX19U2suX19mdXR1cmVfXy5zdXBlcl9hcmdzJiZhLmZ1bmMuaWQmJlwic3VwZXJcIj09PWEuZnVuYy5pZC52JiZcIltdXCI9PT1jJiYobCgnaWYgKHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiIHx8IHNlbGYudG9TdHJpbmcoKS5pbmRleE9mKFwiV2luZG93XCIpID4gMCkgeyB0aHJvdyBuZXcgU2suYnVpbHRpbi5SdW50aW1lRXJyb3IoXCJzdXBlcigpOiBubyBhcmd1bWVudHNcIikgfTsnKSxjPVwiWyRnYmwuX19jbGFzc19fLHNlbGZdXCIpO2woXCIkcmV0ID0gKFwiLGIsXCIudHAkY2FsbCk/XCIsYixcIi50cCRjYWxsKFwiLGMsXCIsXCIsZCxcIikgOiBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixcbmIsXCIsdW5kZWZpbmVkLHVuZGVmaW5lZCxcIixkLFwiLFwiLGMsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7cmV0dXJuIHRoaXMuX2dyKFwiY2FsbFwiLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY3NsaWNlPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5TbGljZSk7aWYoU2suX19mdXR1cmVfXy5weXRob24zKXt2YXIgYj1hLmxvd2VyP3RoaXMudmV4cHIoYS5sb3dlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIjt2YXIgYz1hLnVwcGVyP3RoaXMudmV4cHIoYS51cHBlcik6XCJTay5idWlsdGluLm5vbmUubm9uZSRcIn1lbHNlIGI9YS5sb3dlcj90aGlzLnZleHByKGEubG93ZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygwKVwiLGM9YS51cHBlcj90aGlzLnZleHByKGEudXBwZXIpOmEuc3RlcD9cIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOlwibmV3IFNrLmJ1aWx0aW4uaW50XygyMTQ3NDgzNjQ3KVwiO1xuYT1hLnN0ZXA/dGhpcy52ZXhwcihhLnN0ZXApOlwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7cmV0dXJuIHRoaXMuX2dyKFwic2xpY2VcIixcIm5ldyBTay5idWlsdGluc1snc2xpY2UnXShcIixiLFwiLFwiLGMsXCIsXCIsYSxcIilcIil9O2EucHJvdG90eXBlLmVzbGljZT1mdW5jdGlvbihhKXt2YXIgYjtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgQXJyYXkpO3ZhciBjPVtdO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKHRoaXMudnNsaWNlc3ViKGFbYl0pKTtyZXR1cm4gdGhpcy5fZ3IoXCJleHRzbGljZVwiLFwibmV3IFNrLmJ1aWx0aW5zWyd0dXBsZSddKFtcIixjLFwiXSlcIil9O2EucHJvdG90eXBlLnZzbGljZXN1Yj1mdW5jdGlvbihhKXtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5JbmRleDp2YXIgYj10aGlzLnZleHByKGEudmFsdWUpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU2xpY2U6Yj10aGlzLmNzbGljZShhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkVsbGlwc2lzOlNrLmFzc2VydHMuZmFpbChcInRvZG8gY29tcGlsZS5qcyBFbGxpcHNpcztcIik7XG5icmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4dFNsaWNlOmI9dGhpcy5lc2xpY2UoYS5kaW1zKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGtpbmRcIil9cmV0dXJuIGJ9O2EucHJvdG90eXBlLnZzbGljZT1mdW5jdGlvbihhLGIsYyxlKXthPXRoaXMudnNsaWNlc3ViKGEpO3JldHVybiB0aGlzLmNoYW5kbGVzdWJzY3IoYixjLGEsZSl9O2EucHJvdG90eXBlLmNoYW5kbGVzdWJzY3I9ZnVuY3Rpb24oYSxiLGMsZSl7aWYoYT09PVNrLmFzdG5vZGVzLkxvYWR8fGE9PT1Tay5hc3Rub2Rlcy5BdWdMb2FkKXJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYixcIixcIixjLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCksdGhpcy5fZ3IoXCJsc3Vic2NyXCIsXCIkcmV0XCIpO2E9PT1Tay5hc3Rub2Rlcy5TdG9yZXx8YT09PVNrLmFzdG5vZGVzLkF1Z1N0b3JlPyhsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsXG5iLFwiLFwiLGMsXCIsXCIsZSxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbigpKTphPT09U2suYXN0bm9kZXMuRGVsP2woXCJTay5hYnN0ci5vYmplY3REZWxJdGVtKFwiLGIsXCIsXCIsYyxcIik7XCIpOlNrLmFzc2VydHMuZmFpbChcImhhbmRsZXN1YnNjciBmYWlsXCIpfTthLnByb3RvdHlwZS5jYm9vbG9wPWZ1bmN0aW9uKGEpe3ZhciBiLGM7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkJvb2xPcCk7dmFyIGQ9YS5vcD09PVNrLmFzdG5vZGVzLkFuZD90aGlzLl9qdW1wZmFsc2U6dGhpcy5fanVtcHRydWU7dmFyIGU9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBib29sb3BcIik7dmFyIGY9YS52YWx1ZXM7dmFyIGg9Zi5sZW5ndGg7Zm9yKGI9MDtiPGg7KytiKWE9dGhpcy52ZXhwcihmW2JdKSwwPT09YiYmKGM9dGhpcy5fZ3IoXCJib29sb3BzdWNjXCIsYSkpLGwoYyxcIj1cIixhLFwiO1wiKSxkLmNhbGwodGhpcyxhLGUpO3RoaXMuX2p1bXAoZSk7dGhpcy5zZXRCbG9jayhlKTtcbnJldHVybiBjfTthLnByb3RvdHlwZS5jam9pbmVkc3RyPWZ1bmN0aW9uKGEpe2xldCBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5Kb2luZWRTdHIpO2ZvcihsZXQgYyBvZiBhLnZhbHVlcylhPXRoaXMudmV4cHIoYyksYj9sKGIsXCI9XCIsYixcIi5zcSRjb25jYXQoXCIsYSxcIik7XCIpOmI9dGhpcy5fZ3IoXCJqb2luZWRzdHJcIixhKTtifHwoYj1cIlNrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0clwiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2Zvcm1hdHRlZHZhbHVlPWZ1bmN0aW9uKGEpe2xldCBiPXRoaXMudmV4cHIoYS52YWx1ZSk7c3dpdGNoKGEuY29udmVyc2lvbil7Y2FzZSBcInNcIjpiPXRoaXMuX2dyKFwidmFsdWVcIixcIm5ldyBTay5idWlsdGluLnN0cihcIixiLFwiKVwiKTticmVhaztjYXNlIFwiYVwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5hc2NpaShcIixiLFwiKVwiKTticmVhaztjYXNlIFwiclwiOmI9dGhpcy5fZ3IoXCJ2YWx1ZVwiLFwiU2suYnVpbHRpbi5yZXByKFwiLFxuYixcIilcIil9YT1hLmZvcm1hdF9zcGVjP3RoaXMudmV4cHIoYS5mb3JtYXRfc3BlYyk6XCJTay5idWlsdGluLnN0ci4kZW1wdHlzdHJcIjtyZXR1cm4gdGhpcy5fZ3IoXCJmb3JtYXR0ZWRcIixcIlNrLmFic3RyLm9iamVjdEZvcm1hdChcIitiK1wiLFwiK2ErXCIpXCIpfTthLnByb3RvdHlwZS52ZXhwcj1mdW5jdGlvbihhLGIsYyxrKXt2YXIgZDthLmxpbmVubz50aGlzLnUubGluZW5vJiYodGhpcy51LmxpbmVubz1hLmxpbmVubyx0aGlzLnUubGluZW5vU2V0PSExKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5Cb29sT3A6cmV0dXJuIHRoaXMuY2Jvb2xvcChhKTtjYXNlIFNrLmFzdG5vZGVzLkJpbk9wOnJldHVybiB0aGlzLl9ncihcImJpbm9wXCIsXCJTay5hYnN0ci5udW1iZXJCaW5PcChcIix0aGlzLnZleHByKGEubGVmdCksXCIsXCIsdGhpcy52ZXhwcihhLnJpZ2h0KSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLlVuYXJ5T3A6cmV0dXJuIHRoaXMuX2dyKFwidW5hcnlvcFwiLFxuXCJTay5hYnN0ci5udW1iZXJVbmFyeU9wKFwiLHRoaXMudmV4cHIoYS5vcGVyYW5kKSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkxhbWJkYTpyZXR1cm4gdGhpcy5jbGFtYmRhKGEpO2Nhc2UgU2suYXN0bm9kZXMuSWZFeHA6cmV0dXJuIHRoaXMuY2lmZXhwKGEpO2Nhc2UgU2suYXN0bm9kZXMuRGljdDpyZXR1cm4gdGhpcy5jZGljdChhKTtjYXNlIFNrLmFzdG5vZGVzLkxpc3RDb21wOnJldHVybiB0aGlzLmNsaXN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLkRpY3RDb21wOnJldHVybiB0aGlzLmNkaWN0Y29tcChhKTtjYXNlIFNrLmFzdG5vZGVzLlNldENvbXA6cmV0dXJuIHRoaXMuY3NldGNvbXAoYSk7Y2FzZSBTay5hc3Rub2Rlcy5HZW5lcmF0b3JFeHA6cmV0dXJuIHRoaXMuY2dlbmV4cChhKTtjYXNlIFNrLmFzdG5vZGVzLllpZWxkOnJldHVybiB0aGlzLmN5aWVsZChhKTtjYXNlIFNrLmFzdG5vZGVzLkNvbXBhcmU6cmV0dXJuIHRoaXMuY2NvbXBhcmUoYSk7XG5jYXNlIFNrLmFzdG5vZGVzLkNhbGw6cmV0dXJuIGI9dGhpcy5jY2FsbChhKSx0aGlzLmFubm90YXRlU291cmNlKGEpLGI7Y2FzZSBTay5hc3Rub2Rlcy5OdW06aWYoXCJudW1iZXJcIj09PXR5cGVvZiBhLm4pcmV0dXJuIGEubjtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmxuZylyZXR1cm4gdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5sbmcoJ1wiK2Eubi52LnRvU3RyaW5nKCkrXCInKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmludF8pcmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhLm4udj90aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLmludF8oXCIrYS5uLnYrXCIpXCIpOnRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uaW50XygnXCIrYS5uLnYudG9TdHJpbmcoKStcIicpXCIpO2lmKGEubiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uZmxvYXRfKXJldHVybiBhPTA9PT1hLm4udiYmLUluZmluaXR5PT09MS9hLm4udj9cIi0wXCI6YS5uLnYsdGhpcy5tYWtlQ29uc3RhbnQoXCJuZXcgU2suYnVpbHRpbi5mbG9hdF8oXCIrXG5hK1wiKVwiKTtpZihhLm4gaW5zdGFuY2VvZiBTay5idWlsdGluLmNvbXBsZXgpcmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uY29tcGxleChcIisoMD09PWEubi5yZWFsJiYtSW5maW5pdHk9PT0xL2Eubi5yZWFsP1wiLTBcIjphLm4ucmVhbCkrXCIsIFwiKygwPT09YS5uLmltYWcmJi1JbmZpbml0eT09PTEvYS5uLmltYWc/XCItMFwiOmEubi5pbWFnKStcIilcIik7U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIE51bSB0eXBlXCIpO2Nhc2UgU2suYXN0bm9kZXMuQnl0ZXM6aWYoU2suX19mdXR1cmVfXy5weXRob24zKXtiPVtdO2E9YS5zLiRqc3N0cigpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGEuY2hhckNvZGVBdChjKSk7cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uYnl0ZXMoW1wiLGIuam9pbihcIiwgXCIpLFwiXSlcIil9Y2FzZSBTay5hc3Rub2Rlcy5TdHI6cmV0dXJuIHRoaXMubWFrZUNvbnN0YW50KFwibmV3IFNrLmJ1aWx0aW4uc3RyKFwiLFxuZihhLnMuJGpzc3RyKCkpLFwiKVwiKTtjYXNlIFNrLmFzdG5vZGVzLkF0dHJpYnV0ZTphLmN0eCE9PVNrLmFzdG5vZGVzLkF1Z0xvYWQmJmEuY3R4IT09U2suYXN0bm9kZXMuQXVnU3RvcmUmJihkPXRoaXMudmV4cHIoYS52YWx1ZSkpO2s9YS5hdHRyLiRyKCkudjtrPWsuc3Vic3RyaW5nKDEsay5sZW5ndGgtMSk7az1lKHRoaXMudS5wcml2YXRlXyxuZXcgU2suYnVpbHRpbi5zdHIoaykpLnY7az10aGlzLm1ha2VDb25zdGFudChcIm5ldyBTay5idWlsdGluLnN0cignXCIraytcIicpXCIpO3N3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFwiLGMsXCIudHAkZ2V0YXR0cihcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLGwoXCJcXG5pZiAoJHJldCA9PT0gdW5kZWZpbmVkKSB7XCIpLGwoXCJcXG50aHJvdyBuZXcgU2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcihcIixjLCcuc2skYXR0ckVycm9yKCkgKyBcIiBoYXMgbm8gYXR0cmlidXRlIFxcJ1wiICsgJyxcbmssJy4kanNzdHIoKSArIFwiXFwnXCIpOycpLGwoXCJcXG59O1wiKSx0aGlzLl9ncihcImxhdHRyXCIsXCIkcmV0XCIpO2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbChcIiRyZXQgPSBcIixkLFwiLnRwJGdldGF0dHIoXCIsayxcIiwgdHJ1ZSk7XCIpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSxsKFwiXFxuaWYgKCRyZXQgPT09IHVuZGVmaW5lZCkge1wiKSxsKFwiXFxudGhyb3cgbmV3IFNrLmJ1aWx0aW4uQXR0cmlidXRlRXJyb3IoXCIsZCwnLnNrJGF0dHJFcnJvcigpICsgXCIgaGFzIG5vIGF0dHJpYnV0ZSBcXCdcIiArICcsaywnLiRqc3N0cigpICsgXCJcXCdcIik7JyksbChcIlxcbn07XCIpLHRoaXMuX2dyKFwibGF0dHJcIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5BdWdTdG9yZTpsKFwiJHJldCA9IHVuZGVmaW5lZDtcIik7bChcImlmKFwiLGIsXCIhPT11bmRlZmluZWQpe1wiKTtsKFwiJHJldCA9IFwiLGMsXCIudHAkc2V0YXR0cihcIixrLFwiLFwiLGIsXCIsIHRydWUpO1wiKTtsKFwifVwiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7XG5jYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoXCIkcmV0ID0gXCIsZCxcIi50cCRzZXRhdHRyKFwiLGssXCIsXCIsYixcIiwgdHJ1ZSk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiJHJldCA9IFwiLGQsXCIudHAkc2V0YXR0cihcIixrLFwiLCB1bmRlZmluZWQsIHRydWUpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIGF0dHJpYnV0ZSBleHByZXNzaW9uXCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuU3Vic2NyaXB0OnN3aXRjaChhLmN0eCl7Y2FzZSBTay5hc3Rub2Rlcy5BdWdMb2FkOnJldHVybiBsKFwiJHJldCA9IFNrLmFic3RyLm9iamVjdEdldEl0ZW0oXCIsYyxcIixcIixrLFwiLCB0cnVlKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpLHRoaXMuX2dyKFwiZ2l0ZW1cIixcIiRyZXRcIik7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuU3RvcmU6Y2FzZSBTay5hc3Rub2Rlcy5EZWw6cmV0dXJuIHRoaXMudnNsaWNlKGEuc2xpY2UsXG5hLmN0eCx0aGlzLnZleHByKGEudmFsdWUpLGIpO2Nhc2UgU2suYXN0bm9kZXMuQXVnU3RvcmU6bChcIiRyZXQ9dW5kZWZpbmVkO1wiKTtsKFwiaWYoXCIsYixcIiE9PXVuZGVmaW5lZCl7XCIpO2woXCIkcmV0PVNrLmFic3RyLm9iamVjdFNldEl0ZW0oXCIsYyxcIixcIixrLFwiLFwiLGIsXCIsIHRydWUpXCIpO2woXCJ9XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcImludmFsaWQgc3Vic2NyaXB0IGV4cHJlc3Npb25cIil9YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiB0aGlzLm5hbWVvcChhLmlkLGEuY3R4LGIpO2Nhc2UgU2suYXN0bm9kZXMuTmFtZUNvbnN0YW50OmlmKGEuY3R4PT09U2suYXN0bm9kZXMuU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGEuY3R4PT09U2suYXN0bm9kZXMuRGVsKXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gYSBjb25zdGFudCBuYW1lXCIpO1xuc3dpdGNoKGEudmFsdWUpe2Nhc2UgU2suYnVpbHRpbi5ub25lLm5vbmUkOnJldHVyblwiU2suYnVpbHRpbi5ub25lLm5vbmUkXCI7Y2FzZSBTay5idWlsdGluLmJvb2wudHJ1ZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wudHJ1ZSRcIjtjYXNlIFNrLmJ1aWx0aW4uYm9vbC5mYWxzZSQ6cmV0dXJuXCJTay5idWlsdGluLmJvb2wuZmFsc2UkXCI7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJpbnZhbGlkIG5hbWVkIGNvbnN0YW50XCIpfWJyZWFrO2Nhc2UgU2suYXN0bm9kZXMuTGlzdDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwibGlzdFwiKTtjYXNlIFNrLmFzdG5vZGVzLlR1cGxlOnJldHVybiB0aGlzLmN0dXBsZWxpc3RvcnNldChhLGIsXCJ0dXBsZVwiKTtjYXNlIFNrLmFzdG5vZGVzLlNldDpyZXR1cm4gdGhpcy5jdHVwbGVsaXN0b3JzZXQoYSxiLFwic2V0XCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RhcnJlZDpzd2l0Y2goYS5jdHgpe2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6dGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJzdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlXCIsXG50aGlzLmZpbGVuYW1lLGEubGluZW5vKTtkZWZhdWx0OnRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuJ3QgdXNlIHN0YXJyZWQgZXhwcmVzc2lvbiBoZXJlXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7fWNhc2UgU2suYXN0bm9kZXMuSm9pbmVkU3RyOnJldHVybiB0aGlzLmNqb2luZWRzdHIoYSk7Y2FzZSBTay5hc3Rub2Rlcy5Gb3JtYXR0ZWRWYWx1ZTpyZXR1cm4gdGhpcy5jZm9ybWF0dGVkdmFsdWUoYSk7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBcIithLmNvbnN0cnVjdG9yLm5hbWUrXCIgdmV4cHJcIil9fTthLnByb3RvdHlwZS52c2VxZXhwcj1mdW5jdGlvbihhLGIpe3ZhciBjO1NrLmFzc2VydHMuYXNzZXJ0KHZvaWQgMD09PWJ8fGEubGVuZ3RoPT09Yi5sZW5ndGgpO3ZhciBkPVtdO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpZC5wdXNoKHRoaXMudmV4cHIoYVtjXSx2b2lkIDA9PT1iP3ZvaWQgMDpiW2NdKSk7cmV0dXJuIGR9O2EucHJvdG90eXBlLmNhdWdhc3NpZ249XG5mdW5jdGlvbihhKXtTay5hc3NlcnRzLmFzc2VydChhIGluc3RhbmNlb2YgU2suYXN0bm9kZXMuQXVnQXNzaWduKTt2YXIgYj1hLnRhcmdldDtzd2l0Y2goYi5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5BdHRyaWJ1dGU6dmFyIGM9dGhpcy52ZXhwcihiLnZhbHVlKTtiPW5ldyBTay5hc3Rub2Rlcy5BdHRyaWJ1dGUoYi52YWx1ZSxiLmF0dHIsU2suYXN0bm9kZXMuQXVnTG9hZCxiLmxpbmVubyxiLmNvbF9vZmZzZXQpO3ZhciBkPXRoaXMudmV4cHIoYix2b2lkIDAsYyk7dmFyIGU9dGhpcy52ZXhwcihhLnZhbHVlKTthPXRoaXMuX2dyKFwiaW5wbGJpbm9wYXR0clwiLFwiU2suYWJzdHIubnVtYmVySW5wbGFjZUJpbk9wKFwiLGQsXCIsXCIsZSxcIiwnXCIsYS5vcC5wcm90b3R5cGUuX2FzdG5hbWUsXCInKVwiKTtiLmN0eD1Tay5hc3Rub2Rlcy5BdWdTdG9yZTtyZXR1cm4gdGhpcy52ZXhwcihiLGEsYyk7Y2FzZSBTay5hc3Rub2Rlcy5TdWJzY3JpcHQ6Yz10aGlzLnZleHByKGIudmFsdWUpO3ZhciBmPVxudGhpcy52c2xpY2VzdWIoYi5zbGljZSk7Yj1uZXcgU2suYXN0bm9kZXMuU3Vic2NyaXB0KGIudmFsdWUsZixTay5hc3Rub2Rlcy5BdWdMb2FkLGIubGluZW5vLGIuY29sX29mZnNldCk7ZD10aGlzLnZleHByKGIsdm9pZCAwLGMsZik7ZT10aGlzLnZleHByKGEudmFsdWUpO2E9dGhpcy5fZ3IoXCJpbnBsYmlub3BzdWJzY3JcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixkLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIik7Yi5jdHg9U2suYXN0bm9kZXMuQXVnU3RvcmU7cmV0dXJuIHRoaXMudmV4cHIoYixhLGMsZik7Y2FzZSBTay5hc3Rub2Rlcy5OYW1lOnJldHVybiBjPXRoaXMubmFtZW9wKGIuaWQsU2suYXN0bm9kZXMuTG9hZCksZT10aGlzLnZleHByKGEudmFsdWUpLGE9dGhpcy5fZ3IoXCJpbnBsYmlub3BcIixcIlNrLmFic3RyLm51bWJlcklucGxhY2VCaW5PcChcIixjLFwiLFwiLGUsXCIsJ1wiLGEub3AucHJvdG90eXBlLl9hc3RuYW1lLFwiJylcIiksdGhpcy5uYW1lb3AoYi5pZCxcblNrLmFzdG5vZGVzLlN0b3JlLGEpO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gYXVnYXNzaWduXCIpfX07YS5wcm90b3R5cGUuZXhwckNvbnN0YW50PWZ1bmN0aW9uKGEpe3N3aXRjaChhLmNvbnN0cnVjdG9yKXtjYXNlIFNrLmFzdG5vZGVzLk51bTpyZXR1cm4gU2subWlzY2V2YWwuaXNUcnVlKGEubik/MTowO2Nhc2UgU2suYXN0bm9kZXMuU3RyOnJldHVybiBTay5taXNjZXZhbC5pc1RydWUoYS5zKT8xOjA7ZGVmYXVsdDpyZXR1cm4tMX19O2EucHJvdG90eXBlLm5ld0Jsb2NrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudS5ibG9ja251bSsrO3RoaXMudS5ibG9ja3NbYl09W107dGhpcy51LmJsb2Nrc1tiXS5fbmFtZT1hfHxcIjx1bm5hbWVkPlwiO3RoaXMudS5ibG9ja3NbYl0uX25leHQ9bnVsbDtyZXR1cm4gYn07YS5wcm90b3R5cGUuc2V0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jdXJibG9jaz1cbmF9O2EucHJvdG90eXBlLnB1c2hCcmVha0Jsb2NrPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEmJmE8dGhpcy51LmJsb2NrbnVtKTt0aGlzLnUuYnJlYWtCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wQnJlYWtCbG9jaz1mdW5jdGlvbigpe3RoaXMudS5icmVha0Jsb2Nrcy5wb3AoKX07YS5wcm90b3R5cGUucHVzaENvbnRpbnVlQmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5jb250aW51ZUJsb2Nrcy5wdXNoKGEpfTthLnByb3RvdHlwZS5wb3BDb250aW51ZUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmNvbnRpbnVlQmxvY2tzLnBvcCgpfTthLnByb3RvdHlwZS5wdXNoRXhjZXB0QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO3RoaXMudS5leGNlcHRCbG9ja3MucHVzaChhKX07YS5wcm90b3R5cGUucG9wRXhjZXB0QmxvY2s9ZnVuY3Rpb24oKXt0aGlzLnUuZXhjZXB0QmxvY2tzLnBvcCgpfTtcbmEucHJvdG90eXBlLnB1c2hGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oYSl7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YSYmYTx0aGlzLnUuYmxvY2tudW0pO1NrLmFzc2VydHMuYXNzZXJ0KHRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg9PT10aGlzLnUuY29udGludWVCbG9ja3MubGVuZ3RoKTt0aGlzLnUuZmluYWxseUJsb2Nrcy5wdXNoKHtibGs6YSxicmVha0RlcHRoOnRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGh9KX07YS5wcm90b3R5cGUucG9wRmluYWxseUJsb2NrPWZ1bmN0aW9uKCl7dGhpcy51LmZpbmFsbHlCbG9ja3MucG9wKCl9O2EucHJvdG90eXBlLnBlZWtGaW5hbGx5QmxvY2s9ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGg/dGhpcy51LmZpbmFsbHlCbG9ja3NbdGhpcy51LmZpbmFsbHlCbG9ja3MubGVuZ3RoLTFdOnZvaWQgMH07YS5wcm90b3R5cGUuc2V0dXBFeGNlcHQ9ZnVuY3Rpb24oYSl7bChcIiRleGMucHVzaChcIixhLFwiKTtcIil9O2EucHJvdG90eXBlLmVuZEV4Y2VwdD1cbmZ1bmN0aW9uKCl7bChcIiRleGMucG9wKCk7XCIpfTthLnByb3RvdHlwZS5vdXRwdXRMb2NhbHM9ZnVuY3Rpb24oYSl7dmFyIGIsYz17fTtmb3IoYj0wO2EuYXJnbmFtZXMmJmI8YS5hcmduYW1lcy5sZW5ndGg7KytiKWNbYS5hcmduYW1lc1tiXV09ITA7YS5sb2NhbG5hbWVzLnNvcnQoKTt2YXIgZD1bXTtmb3IoYj0wO2I8YS5sb2NhbG5hbWVzLmxlbmd0aDsrK2Ipe3ZhciBlPWEubG9jYWxuYW1lc1tiXTt2b2lkIDA9PT1jW2VdJiYoZC5wdXNoKGUpLGNbZV09ITApfXJldHVybiAwPGQubGVuZ3RoP1widmFyIFwiK2Quam9pbihcIixcIikrXCI7IC8qIGxvY2FscyAqL1wiOlwiXCJ9O2EucHJvdG90eXBlLm91dHB1dFN1c3BlbnNpb25IZWxwZXJzPWZ1bmN0aW9uKGEpe3ZhciBiLGM9W10sZD1hLmxvY2FsbmFtZXMuY29uY2F0KGEudGVtcHNUb1NhdmUpLGU9e30sZj1hLnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJmEuc3RlLmNoaWxkSGFzRnJlZSxoPSgwPGQubGVuZ3RoP1xuXCJ2YXIgXCIrZC5qb2luKFwiLFwiKStcIjtcIjpcIlwiKStcInZhciAkd2FrZUZyb21TdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7dmFyIHN1c3AgPSBcIithLnNjb3BlbmFtZStcIi4kd2FraW5nU3VzcGVuc2lvbjsgXCIrYS5zY29wZW5hbWUrXCIuJHdha2luZ1N1c3BlbnNpb24gPSB1bmRlZmluZWQ7JGJsaz1zdXNwLiRibGs7ICRsb2M9c3VzcC4kbG9jOyAkZ2JsPXN1c3AuJGdibDsgJGV4Yz1zdXNwLiRleGM7ICRlcnI9c3VzcC4kZXJyOyAkcG9zdGZpbmFsbHk9c3VzcC4kcG9zdGZpbmFsbHk7JGN1cnJMaW5lTm89c3VzcC4kbGluZW5vOyAkY3VyckNvbE5vPXN1c3AuJGNvbG5vOyBTay5sYXN0WWllbGQ9RGF0ZS5ub3coKTtcIisoZj9cIiRjZWxsPXN1c3AuJGNlbGw7XCI6XCJcIik7Zm9yKGI9MDtiPGQubGVuZ3RoO2IrKyl7dmFyIGw9ZFtiXTt2b2lkIDA9PT1lW2xdJiYoaCs9bCtcIj1zdXNwLiR0bXBzLlwiK2wrXCI7XCIsZVtsXT0hMCl9aCs9XCJ0cnkgeyAkcmV0PXN1c3AuY2hpbGQucmVzdW1lKCk7IH0gY2F0Y2goZXJyKSB7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJ30pOyBpZigkZXhjLmxlbmd0aD4wKSB7ICRlcnI9ZXJyOyAkYmxrPSRleGMucG9wKCk7IH0gZWxzZSB7IHRocm93IGVycjsgfSB9fTtcIjtoKz1cInZhciAkc2F2ZVN1c3BlbnNpb24gPSBmdW5jdGlvbigkY2hpbGQsICRmaWxlbmFtZSwgJGxpbmVubywgJGNvbG5vKSB7dmFyIHN1c3AgPSBuZXcgU2subWlzY2V2YWwuU3VzcGVuc2lvbigpOyBzdXNwLmNoaWxkPSRjaGlsZDtzdXNwLnJlc3VtZT1mdW5jdGlvbigpe1wiK2Euc2NvcGVuYW1lK1wiLiR3YWtpbmdTdXNwZW5zaW9uPXN1c3A7IHJldHVybiBcIithLnNjb3BlbmFtZStcIihcIisoYS5zdGUuZ2VuZXJhdG9yP1wiJGdlblwiOlwiXCIpK1wiKTsgfTtzdXNwLmRhdGE9c3VzcC5jaGlsZC5kYXRhO3N1c3AuJGJsaz0kYmxrO3N1c3AuJGxvYz0kbG9jO3N1c3AuJGdibD0kZ2JsO3N1c3AuJGV4Yz0kZXhjO3N1c3AuJGVycj0kZXJyO3N1c3AuJHBvc3RmaW5hbGx5PSRwb3N0ZmluYWxseTtzdXNwLiRmaWxlbmFtZT0kZmlsZW5hbWU7c3VzcC4kbGluZW5vPSRsaW5lbm87c3VzcC4kY29sbm89JGNvbG5vO3N1c3Aub3B0aW9uYWw9c3VzcC5jaGlsZC5vcHRpb25hbDtcIitcbihmP1wic3VzcC4kY2VsbD0kY2VsbDtcIjpcIlwiKTtlPXt9O2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspbD1kW2JdLHZvaWQgMD09PWVbbF0mJihjLnB1c2goJ1wiJytsKydcIjonK2wpLGVbbF09ITApO3JldHVybiBoKz1cInN1c3AuJHRtcHM9e1wiK2Muam9pbihcIixcIikrXCJ9O3JldHVybiBzdXNwO307XCJ9O2EucHJvdG90eXBlLm91dHB1dEFsbFVuaXRzPWZ1bmN0aW9uKCl7dmFyIGEsYixjPVwiXCI7Zm9yKGI9MDtiPHRoaXMuYWxsVW5pdHMubGVuZ3RoOysrYil7dmFyIGU9dGhpcy5hbGxVbml0c1tiXTtjKz1lLnByZWZpeENvZGU7Yys9dGhpcy5vdXRwdXRMb2NhbHMoZSk7ZS5kb2VzU3VzcGVuZCYmKGMrPXRoaXMub3V0cHV0U3VzcGVuc2lvbkhlbHBlcnMoZSkpO2MrPWUudmFyRGVjbHNDb2RlO2MrPWUuc3dpdGNoQ29kZTt2YXIgZj1lLmJsb2Nrczt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihhPTA7YTxmLmxlbmd0aDsrK2Epe3ZhciBsPWE7aWYoIShsIGluIGgpKWZvcig7OylpZihoW2xdPVxuITAsYys9XCJjYXNlIFwiK2wrXCI6IC8qIC0tLSBcIitmW2xdLl9uYW1lK1wiIC0tLSAqL1wiLGMrPWZbbF0uam9pbihcIlwiKSxudWxsIT09ZltsXS5fbmV4dClpZihmW2xdLl9uZXh0IGluIGgpe2MrPVwiLyoganVtcCAqLyBjb250aW51ZTtcIjticmVha31lbHNlIGMrPVwiLyogYWxsb3dpbmcgY2FzZSBmYWxsdGhyb3VnaCAqL1wiLGw9ZltsXS5fbmV4dDtlbHNle2MrPVwidGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3lzdGVtRXJyb3IoJ2ludGVybmFsIGVycm9yOiB1bnRlcm1pbmF0ZWQgYmxvY2snKTtcIjticmVha319Yys9ZS5zdWZmaXhDb2RlfXJldHVybiBjfTthLnByb3RvdHlwZS5jaWY9ZnVuY3Rpb24oYSl7dmFyIGI7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLklmKTt2YXIgYz10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpO2lmKDA9PT1jKWEub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aCYmdGhpcy52c2Vxc3RtdChhLm9yZWxzZSk7ZWxzZSBpZigxPT09Yyl0aGlzLnZzZXFzdG10KGEuYm9keSk7XG5lbHNle3ZhciBkPXRoaXMubmV3QmxvY2soXCJlbmQgb2YgaWZcIik7YS5vcmVsc2UmJjA8YS5vcmVsc2UubGVuZ3RoJiYoYj10aGlzLm5ld0Jsb2NrKFwibmV4dCBicmFuY2ggb2YgaWZcIikpO2M9dGhpcy52ZXhwcihhLnRlc3QpO2Eub3JlbHNlJiYwPGEub3JlbHNlLmxlbmd0aD8odGhpcy5fanVtcGZhbHNlKGMsYiksdGhpcy52c2Vxc3RtdChhLmJvZHkpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhiKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSk6KHRoaXMuX2p1bXBmYWxzZShjLGQpLHRoaXMudnNlcXN0bXQoYS5ib2R5KSk7dGhpcy5fanVtcChkKTt0aGlzLnNldEJsb2NrKGQpfX07YS5wcm90b3R5cGUuY3doaWxlPWZ1bmN0aW9uKGEpe2lmKDA9PT10aGlzLmV4cHJDb25zdGFudChhLnRlc3QpKWEub3JlbHNlJiZ0aGlzLnZzZXFzdG10KGEub3JlbHNlKTtlbHNle3ZhciBiPXRoaXMubmV3QmxvY2soXCJ3aGlsZSB0ZXN0XCIpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtcbnZhciBjPXRoaXMubmV3QmxvY2soXCJhZnRlciB3aGlsZVwiKTt2YXIgZD0wPGEub3JlbHNlLmxlbmd0aD90aGlzLm5ld0Jsb2NrKFwid2hpbGUgb3JlbHNlXCIpOm51bGw7dmFyIGU9dGhpcy5uZXdCbG9jayhcIndoaWxlIGJvZHlcIik7dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTt0aGlzLl9qdW1wZmFsc2UodGhpcy52ZXhwcihhLnRlc3QpLGQ/ZDpjKTt0aGlzLl9qdW1wKGUpO3RoaXMucHVzaEJyZWFrQmxvY2soYyk7dGhpcy5wdXNoQ29udGludWVCbG9jayhiKTt0aGlzLnNldEJsb2NrKGUpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlV2hpbGUpJiZ0aGlzLnUuY2FuU3VzcGVuZCYmKGU9dGhpcy5uZXdCbG9jayhcImRlYnVnIGJyZWFrcG9pbnQgZm9yIGxpbmUgXCIrYS5saW5lbm8pLGwoXCJpZiAoU2suYnJlYWtwb2ludHMoJ1wiK3RoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrXG50aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2UrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpLHRoaXMuX2p1bXAoZSksdGhpcy5zZXRCbG9jayhlKSx0aGlzLnUuZG9lc1N1c3BlbmQ9ITApO3RoaXMudnNlcXN0bXQoYS5ib2R5KTt0aGlzLl9qdW1wKGIpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpOzA8YS5vcmVsc2UubGVuZ3RoJiYodGhpcy5zZXRCbG9jayhkKSx0aGlzLnZzZXFzdG10KGEub3JlbHNlKSx0aGlzLl9qdW1wKGMpKTt0aGlzLnNldEJsb2NrKGMpfX07YS5wcm90b3R5cGUuY2Zvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm5ld0Jsb2NrKFwiZm9yIHN0YXJ0XCIpLGM9dGhpcy5uZXdCbG9jayhcImZvciBjbGVhbnVwXCIpLGQ9dGhpcy5uZXdCbG9jayhcImZvciBlbmRcIik7dGhpcy5wdXNoQnJlYWtCbG9jayhkKTt0aGlzLnB1c2hDb250aW51ZUJsb2NrKGIpO1xudmFyIGU9dGhpcy52ZXhwcihhLml0ZXIpO2lmKHRoaXMudS5zdGUuZ2VuZXJhdG9yKXt2YXIgZj1cIiRsb2MuXCIrdGhpcy5nZW5zeW0oXCJpdGVyXCIpO2woZixcIj1Tay5hYnN0ci5pdGVyKFwiLGUsXCIpO1wiKX1lbHNlIGY9dGhpcy5fZ3IoXCJpdGVyXCIsXCJTay5hYnN0ci5pdGVyKFwiLGUsXCIpXCIpLHRoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMuX2p1bXAoYik7dGhpcy5zZXRCbG9jayhiKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGYsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTtmPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYoZixjKTt0aGlzLnZleHByKGEudGFyZ2V0LGYpOyhTay5kZWJ1Z2dpbmd8fFNrLmtpbGxhYmxlRm9yKSYmdGhpcy51LmNhblN1c3BlbmQmJihmPXRoaXMubmV3QmxvY2soXCJkZWJ1ZyBicmVha3BvaW50IGZvciBsaW5lIFwiK2EubGluZW5vKSxsKFwiaWYgKFNrLmJyZWFrcG9pbnRzKCdcIitcbnRoaXMuZmlsZW5hbWUrXCInLFwiK2EubGluZW5vK1wiLFwiK2EuY29sX29mZnNldCtcIikpIHtcIixcInZhciAkc3VzcCA9ICRzYXZlU3VzcGVuc2lvbih7ZGF0YToge3R5cGU6ICdTay5kZWxheSd9LCByZXN1bWU6IGZ1bmN0aW9uKCkge319LCAnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKTtcIixcIiRzdXNwLiRibGsgPSBcIitmK1wiO1wiLFwiJHN1c3Aub3B0aW9uYWwgPSB0cnVlO1wiLFwicmV0dXJuICRzdXNwO1wiLFwifVwiKSx0aGlzLl9qdW1wKGYpLHRoaXMuc2V0QmxvY2soZiksdGhpcy51LmRvZXNTdXNwZW5kPSEwKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5fanVtcChiKTt0aGlzLnNldEJsb2NrKGMpO3RoaXMucG9wQ29udGludWVCbG9jaygpO3RoaXMucG9wQnJlYWtCbG9jaygpO3RoaXMudnNlcXN0bXQoYS5vcmVsc2UpO3RoaXMuX2p1bXAoZCk7dGhpcy5zZXRCbG9jayhkKX07YS5wcm90b3R5cGUuY3JhaXNlPWZ1bmN0aW9uKGEpe2lmKGEuZXhjKXt2YXIgYj1cbnRoaXMuX2dyKFwiZXhjXCIsdGhpcy52ZXhwcihhLmV4YykpLGM9dGhpcy5uZXdCbG9jayhcImV4Y2VwdGlvbiBub3cgaW5zdGFudGlhdGVkXCIpLGQ9dGhpcy5fZ3IoXCJpc2NsYXNzXCIsYitcIi5wcm90b3R5cGUgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb25cIik7dGhpcy5fanVtcGZhbHNlKGQsYyk7YS5pbnN0PyhkPXRoaXMuX2dyKFwiaW5zdFwiLHRoaXMudmV4cHIoYS5pbnN0KSksbChcImlmKCEoXCIsZCxcIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4udHVwbGUpKSB7XCIsZCxcIj0gbmV3IFNrLmJ1aWx0aW4udHVwbGUoW1wiLGQsXCJdKTtcIixcIn1cIiksbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYixcIixcIixkLFwiLnYpO1wiKSk6bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kKFwiLGIsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7bChiLFwiPSRyZXQ7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtsKFwiaWYgKFwiLGIsXG5cIiBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikge3Rocm93IFwiLGIsXCI7fSBlbHNlIHt0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoJ2V4Y2VwdGlvbnMgbXVzdCBkZXJpdmUgZnJvbSBCYXNlRXhjZXB0aW9uJyk7fTtcIil9ZWxzZSBsKFwidGhyb3cgJGVycjtcIil9O2EucHJvdG90eXBlLm91dHB1dEZpbmFsbHlDYXNjYWRlPWZ1bmN0aW9uKGEpe2lmKDA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aClsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7IGlmICgkcG9zdGZpbmFsbHkucmV0dXJuaW5nKSB7IHJldHVybiAkcG9zdGZpbmFsbHkucmV0dXJuaW5nOyB9IGVsc2UgeyAkYmxrPSRwb3N0ZmluYWxseS5nb3RvQmxvY2s7ICRwb3N0ZmluYWxseT11bmRlZmluZWQ7IGNvbnRpbnVlOyB9IH1cIik7ZWxzZXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtsKFwiaWYoJHBvc3RmaW5hbGx5IT09dW5kZWZpbmVkKSB7XCIsXCJpZiAoJHBvc3RmaW5hbGx5LnJldHVybmluZ1wiLFxuYi5icmVha0RlcHRoPT1hLmJyZWFrRGVwdGg/XCJ8fCAkcG9zdGZpbmFsbHkuaXNCcmVha1wiOlwiXCIsXCIpIHtcIixcIiRibGs9XCIsYi5ibGssXCI7Y29udGludWU7XCIsXCJ9IGVsc2Uge1wiLFwiJGJsaz0kcG9zdGZpbmFsbHkuZ290b0Jsb2NrOyRwb3N0ZmluYWxseT11bmRlZmluZWQ7Y29udGludWU7XCIsXCJ9XCIsXCJ9XCIpfX07YS5wcm90b3R5cGUuY3RyeT1mdW5jdGlvbihhKXt2YXIgYixjPWEuaGFuZGxlcnMubGVuZ3RoO2lmKGEuZmluYWxib2R5KXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwiZmluYWxib2R5XCIpO3ZhciBlPXRoaXMubmV3QmxvY2soXCJmaW5hbGV4aFwiKTt2YXIgZj10aGlzLl9ncihcImZpbmFsbHlfcmVyYWlzZVwiLFwidW5kZWZpbmVkXCIpO3RoaXMudS50ZW1wc1RvU2F2ZS5wdXNoKGYpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTt0aGlzLnNldHVwRXhjZXB0KGUpfXZhciBtPVtdO2ZvcihiPTA7YjxjOysrYiltLnB1c2godGhpcy5uZXdCbG9jayhcImV4Y2VwdF9cIitcbmIrXCJfXCIpKTt2YXIgcT10aGlzLm5ld0Jsb2NrKFwidW5oYW5kbGVkXCIpO3ZhciBCPXRoaXMubmV3QmxvY2soXCJvcmVsc2VcIik7dmFyIEQ9dGhpcy5uZXdCbG9jayhcImVuZFwiKTswIT1tLmxlbmd0aCYmdGhpcy5zZXR1cEV4Y2VwdChtWzBdKTt0aGlzLnZzZXFzdG10KGEuYm9keSk7MCE9bS5sZW5ndGgmJnRoaXMuZW5kRXhjZXB0KCk7dGhpcy5fanVtcChCKTtmb3IoYj0wO2I8YzsrK2Ipe3RoaXMuc2V0QmxvY2sobVtiXSk7dmFyIEU9YS5oYW5kbGVyc1tiXTtpZighRS50eXBlJiZiPGMtMSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcImRlZmF1bHQgJ2V4Y2VwdDonIG11c3QgYmUgbGFzdFwiLHRoaXMuZmlsZW5hbWUsRS5saW5lbm8pO2lmKEUudHlwZSl7dmFyIEY9dGhpcy52ZXhwcihFLnR5cGUpO3ZhciBNPWI9PWMtMT9xOm1bYisxXTtGPXRoaXMuX2dyKFwiaW5zdGFuY2VcIixcIlNrLm1pc2NldmFsLmlzVHJ1ZShTay5idWlsdGluLmlzaW5zdGFuY2UoJGVyciwgXCIsRixcIikpXCIpO1xudGhpcy5fanVtcGZhbHNlKEYsTSl9RS5uYW1lJiZ0aGlzLnZleHByKEUubmFtZSxcIiRlcnJcIik7dGhpcy52c2Vxc3RtdChFLmJvZHkpO3RoaXMuX2p1bXAoRCl9dGhpcy5zZXRCbG9jayhxKTtsKFwidGhyb3cgJGVycjtcIik7dGhpcy5zZXRCbG9jayhCKTt0aGlzLnZzZXFzdG10KGEub3JlbHNlKTt0aGlzLl9qdW1wKEQpO3RoaXMuc2V0QmxvY2soRCk7YS5maW5hbGJvZHkmJih0aGlzLmVuZEV4Y2VwdCgpLHRoaXMuX2p1bXAoZCksdGhpcy5zZXRCbG9jayhlKSxsKGYsXCI9JGVycjtcIiksdGhpcy5fanVtcChkKSx0aGlzLnNldEJsb2NrKGQpLHRoaXMucG9wRmluYWxseUJsb2NrKCksdGhpcy52c2Vxc3RtdChhLmZpbmFsYm9keSksbChcImlmKFwiLGYsXCIhPT11bmRlZmluZWQpIHsgdGhyb3cgXCIsZixcIjt9XCIpLHRoaXMub3V0cHV0RmluYWxseUNhc2NhZGUoaCkpfTthLnByb3RvdHlwZS5jd2l0aD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmV3QmxvY2soXCJ3aXRoZXhoXCIpLGQ9dGhpcy5uZXdCbG9jayhcIndpdGh0aWR5dXBcIiksXG5lPXRoaXMubmV3QmxvY2soXCJ3aXRoY2FycnlvblwiKTt2YXIgZj10aGlzLl9ncihcIm1nclwiLHRoaXMudmV4cHIoYS5pdGVtc1tiXS5jb250ZXh0X2V4cHIpKTtsKFwiJHJldCA9IFNrLmFic3RyLmxvb2t1cFNwZWNpYWwoXCIsZixcIixTay5idWlsdGluLnN0ci4kZXhpdCk7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZz10aGlzLl9ncihcImV4aXRcIixcIiRyZXRcIik7dGhpcy51LnRlbXBzVG9TYXZlLnB1c2goZyk7bChcIiRyZXQgPSBTay5hYnN0ci5sb29rdXBTcGVjaWFsKFwiLGYsXCIsU2suYnVpbHRpbi5zdHIuJGVudGVyKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO2woXCIkcmV0ID0gU2subWlzY2V2YWwuY2FsbHNpbU9yU3VzcGVuZEFycmF5KCRyZXQpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcInZhbHVlXCIsXCIkcmV0XCIpO3RoaXMucHVzaEZpbmFsbHlCbG9jayhkKTt2YXIgaD10aGlzLnUuZmluYWxseUJsb2Nrc1t0aGlzLnUuZmluYWxseUJsb2Nrcy5sZW5ndGgtXG4xXTt0aGlzLnNldHVwRXhjZXB0KGMpO2EuaXRlbXNbYl0ub3B0aW9uYWxfdmFycyYmdGhpcy5uYW1lb3AoYS5pdGVtc1tiXS5vcHRpb25hbF92YXJzLmlkLFNrLmFzdG5vZGVzLlN0b3JlLGYpO2IrMTxhLml0ZW1zLmxlbmd0aD90aGlzLmN3aXRoKGEsYisxKTp0aGlzLnZzZXFzdG10KGEuYm9keSk7dGhpcy5lbmRFeGNlcHQoKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soYyk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5hcHBseU9yU3VzcGVuZChcIixnLFwiLHVuZGVmaW5lZCxTay5idWlsdGluLmdldEV4Y0luZm8oJGVyciksdW5kZWZpbmVkLFtdKTtcIik7dGhpcy5fY2hlY2tTdXNwZW5zaW9uKGEpO3RoaXMuX2p1bXB0cnVlKFwiJHJldFwiLGUpO2woXCJ0aHJvdyAkZXJyO1wiKTt0aGlzLnNldEJsb2NrKGQpO3RoaXMucG9wRmluYWxseUJsb2NrKCk7bChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsZyxcIixbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLm5vbmUubm9uZSRdKTtcIik7XG50aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7dGhpcy5vdXRwdXRGaW5hbGx5Q2FzY2FkZShoKTt0aGlzLl9qdW1wKGUpO3RoaXMuc2V0QmxvY2soZSl9O2EucHJvdG90eXBlLmNhc3NlcnQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52ZXhwcihhLnRlc3QpLGM9dGhpcy5uZXdCbG9jayhcImVuZFwiKTt0aGlzLl9qdW1wdHJ1ZShiLGMpO2woXCJ0aHJvdyBuZXcgU2suYnVpbHRpbi5Bc3NlcnRpb25FcnJvcihcIixhLm1zZz90aGlzLnZleHByKGEubXNnKTpcIlwiLFwiKTtcIik7dGhpcy5zZXRCbG9jayhjKX07YS5wcm90b3R5cGUuY2ltcG9ydGFzPWZ1bmN0aW9uKGEsYixjKXthPWEudjt2YXIgZD1hLmluZGV4T2YoXCIuXCIpLGU9YztpZigtMSE9PWQpZm9yKGE9YS5zdWJzdHIoZCsxKTstMSE9PWQ7KWQ9YS5pbmRleE9mKFwiLlwiKSxjPS0xIT09ZD9hLnN1YnN0cigwLGQpOmEsZT10aGlzLl9ncihcImxhdHRyXCIsXCJTay5hYnN0ci5nYXR0cihcIixlLFwiLCBuZXcgU2suYnVpbHRpbi5zdHIoJ1wiLGMsXCInKSlcIiksYT1cbmEuc3Vic3RyKGQrMSk7cmV0dXJuIHRoaXMubmFtZW9wKGIsU2suYXN0bm9kZXMuU3RvcmUsZSl9O2EucHJvdG90eXBlLmNpbXBvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1hLm5hbWVzLmxlbmd0aDtmb3IoYj0wO2I8YzsrK2Ipe3ZhciBkPWEubmFtZXNbYl07bChcIiRyZXQgPSBTay5idWlsdGluLl9faW1wb3J0X18oXCIsZC5uYW1lLiRyKCkudixcIiwkZ2JsLCRsb2MsW10sXCIsU2suX19mdXR1cmVfXy5hYnNvbHV0ZV9pbXBvcnQ/MDotMSxcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihhKTt2YXIgZT10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtpZihkLmFzbmFtZSl0aGlzLmNpbXBvcnRhcyhkLm5hbWUsZC5hc25hbWUsZSk7ZWxzZXt2YXIgZj1kLm5hbWU7ZD1mLnYuaW5kZXhPZihcIi5cIik7LTEhPT1kJiYoZj1uZXcgU2suYnVpbHRpbi5zdHIoZi52LnN1YnN0cigwLGQpKSk7dGhpcy5uYW1lb3AoZixTay5hc3Rub2Rlcy5TdG9yZSxlKX19fTthLnByb3RvdHlwZS5jZnJvbWltcG9ydD1cbmZ1bmN0aW9uKGEpe3ZhciBjLGQ9YS5uYW1lcy5sZW5ndGg7dmFyIGU9W107dmFyIGY9YS5sZXZlbDswIT1mfHxTay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydHx8KGY9LTEpO2ZvcihjPTA7YzxkOysrYyllW2NdPVwiJ1wiK2IoYS5uYW1lc1tjXS5uYW1lLnYpK1wiJ1wiO2woXCIkcmV0ID0gU2suYnVpbHRpbi5fX2ltcG9ydF9fKFwiLGEubW9kdWxlLiRyKCkudixcIiwkZ2JsLCRsb2MsW1wiLGUsXCJdLFwiLGYsXCIpO1wiKTt0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7Zj10aGlzLl9ncihcIm1vZHVsZVwiLFwiJHJldFwiKTtmb3IoYz0wO2M8ZDsrK2Mpe2U9YS5uYW1lc1tjXTt2YXIgaD1cIidcIitlLm5hbWUuditcIidcIjtpZigwPT09YyYmXCIqXCI9PT1lLm5hbWUudil7U2suYXNzZXJ0cy5hc3NlcnQoMT09PWQpO2woXCJTay5pbXBvcnRTdGFyKFwiLGYsXCIsJGxvYywgJGdibCk7XCIpO2JyZWFrfXZhciBtPXRoaXMuX2dyKFwiaXRlbVwiLFwiU2suYWJzdHIuZ2F0dHIoXCIsZixcIiwgbmV3IFNrLmJ1aWx0aW4uc3RyKFwiLGgsXG5cIiksIHVuZGVmaW5lZClcIik7aD1lLm5hbWU7ZS5hc25hbWUmJihoPWUuYXNuYW1lKTt0aGlzLm5hbWVvcChoLFNrLmFzdG5vZGVzLlN0b3JlLG0pfX07YS5wcm90b3R5cGUuYnVpbGRjb2Rlb2JqPWZ1bmN0aW9uKGEsYyxmLGssaCxtKXt2YXIgZD1bXSxnPVtdLG49W10scD1bXSxxPW51bGwsdT1udWxsO2YmJihnPXRoaXMudnNlcWV4cHIoZikpO2smJmsuZGVmYXVsdHMmJihuPXRoaXMudnNlcWV4cHIoay5kZWZhdWx0cykpO2smJmsua3dfZGVmYXVsdHMmJihwPWsua3dfZGVmYXVsdHMubWFwKGE9PmE/dGhpcy52ZXhwcihhKTpcInVuZGVmaW5lZFwiKSk7ayYmay52YXJhcmcmJihxPWsudmFyYXJnKTtrJiZrLmt3YXJnJiYodT1rLmt3YXJnKTtpZighU2suX19mdXR1cmVfXy5weXRob24zJiZrJiZrLmt3b25seWFyZ3MmJjAhPWsua3dvbmx5YXJncy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCJLZXl3b3JkLW9ubHkgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyXCIpO1xudmFyIEY9dGhpcy5lbnRlclNjb3BlKGMsYSxhLmxpbmVubyx0aGlzLmNhblN1c3BlbmQpO2Y9dGhpcy51LnN0ZS5nZW5lcmF0b3I7dmFyIE09dGhpcy51LnN0ZS5oYXNGcmVlO3ZhciBWPXRoaXMudS5zdGUuY2hpbGRIYXNGcmVlO3ZhciB5PXRoaXMubmV3QmxvY2soXCJjb2Rlb2JqIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK0YrXCI9KGZ1bmN0aW9uIFwiK3RoaXMubmljZU5hbWUoYy52KStcIiQoXCI7dmFyIEc9W107aWYoZil7aWYodSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKToga2V5d29yZCBhcmd1bWVudHMgaW4gZ2VuZXJhdG9ycyBub3Qgc3VwcG9ydGVkXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7aWYocSl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihjLnYrXCIoKTogdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBnZW5lcmF0b3JzIG5vdCBzdXBwb3J0ZWRcIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtHLnB1c2goXCIkZ2VuXCIpfWVsc2V7dSYmXG4oRy5wdXNoKFwiJGt3YVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRrd2FcIikpO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHLnB1c2godGhpcy5uYW1lb3Aoay5hcmdzW2FdLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZhPGsua3dvbmx5YXJncy5sZW5ndGg7KythKUcucHVzaCh0aGlzLm5hbWVvcChrLmt3b25seWFyZ3NbYV0uYXJnLFNrLmFzdG5vZGVzLlBhcmFtKSk7cSYmRy5wdXNoKHRoaXMubmFtZW9wKGsudmFyYXJnLmFyZyxTay5hc3Rub2Rlcy5QYXJhbSkpfWxldCBMPSFmO00mJihMfHxHLnB1c2goXCIkZnJlZVwiKSx0aGlzLnUudGVtcHNUb1NhdmUucHVzaChcIiRmcmVlXCIpKTt0aGlzLnUucHJlZml4Q29kZT1MP3RoaXMudS5wcmVmaXhDb2RlK1wiJHBvc2FyZ3MsJGt3YXJnc1wiOnRoaXMudS5wcmVmaXhDb2RlK0cuam9pbihcIixcIik7dGhpcy51LnByZWZpeENvZGUrPVwiKXtcIjtmJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZ2VuZXJhdG9yXFxuXCIpO1xuTSYmKHRoaXMudS5wcmVmaXhDb2RlKz1cIlxcbi8vIGhhcyBmcmVlXFxuXCIpO1YmJih0aGlzLnUucHJlZml4Q29kZSs9XCJcXG4vLyBoYXMgY2VsbFxcblwiKTtMJiYodGhpcy51LnByZWZpeENvZGUrPVwiXFxuLy8gZmFzdCBjYWxsXFxuXCIpO3ZhciBUPVwie31cIjtmJiYoeT1cIiRnZW4uZ2kkcmVzdW1lYXRcIixUPVwiJGdlbi5naSRsb2NhbHNcIik7YT1cIiwkY2VsbD17fVwiO1YmJmYmJihhPVwiLCRjZWxsPSRnZW4uZ2kkY2VsbHNcIik7dGhpcy51LnZhckRlY2xzQ29kZSs9XCJ2YXIgJGJsaz1cIit5K1wiLCRleGM9W10sJGxvYz1cIitUK2ErXCIsJGdibD1cIisoTD9cInRoaXMgJiYgdGhpcy5mdW5jX2dsb2JhbHNcIjpcInRoaXNcIikrKEwmJk0/XCIsJGZyZWU9dGhpcyAmJiB0aGlzLmZ1bmNfY2xvc3VyZVwiOlwiXCIpK1wiLCRlcnI9dW5kZWZpbmVkLCRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiaWYgKHR5cGVvZiBTay5leGVjU3RhcnQgPT09ICd1bmRlZmluZWQnKSB7U2suZXhlY1N0YXJ0ID0gRGF0ZS5ub3coKX1cIik7bnVsbCE9PVNrLnlpZWxkTGltaXQmJnRoaXMudS5jYW5TdXNwZW5kJiYodGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitGK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfSBlbHNlIHtcIjtpZihMKXt0aGlzLnUudmFyRGVjbHNDb2RlPXV8fHF8fGsmJmsua3dvbmx5YXJncyYmMCE9PWsua3dvbmx5YXJncy5sZW5ndGg/dGhpcy51LnZhckRlY2xzQ29kZStcIlxcbnZhciAkYXJncyA9IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXFxuXCI6dGhpcy51LnZhckRlY2xzQ29kZSsoXCJ2YXIgJGFyZ3MgPSAoKCEka3dhcmdzIHx8ICRrd2FyZ3MubGVuZ3RoPT09MCkgJiYgJHBvc2FyZ3MubGVuZ3RoPT09XCIrXG5HLmxlbmd0aCtcIikgPyAkcG9zYXJncyA6IHRoaXMuJHJlc29sdmVBcmdzKCRwb3NhcmdzLCRrd2FyZ3MpXCIpO2ZvcihhPTA7YTxHLmxlbmd0aDthKyspdGhpcy51LnZhckRlY2xzQ29kZSs9XCIsXCIrR1thXStcIj0kYXJnc1tcIithK1wiXVwiO3RoaXMudS52YXJEZWNsc0NvZGUrPVwiO1xcblwifWlmKGYmJjA8bi5sZW5ndGgpZm9yKHk9ay5hcmdzLmxlbmd0aC1uLmxlbmd0aCxhPTA7YTxuLmxlbmd0aDsrK2EpRz10aGlzLm5hbWVvcChrLmFyZ3NbYSt5XS5hcmcsU2suYXN0bm9kZXMuUGFyYW0pLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiaWYoXCIrRytcIj09PXVuZGVmaW5lZClcIitHK1wiPVwiK0YrXCIuJGRlZmF1bHRzW1wiK2ErXCJdO1wiO2ZvcihhPTA7ayYmYTxrLmFyZ3MubGVuZ3RoOysrYSlHPWsuYXJnc1thXS5hcmcsdGhpcy5pc0NlbGwoRykmJihHPWIoZSh0aGlzLnUucHJpdmF0ZV8sRykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIitHK1wiPVwiK0crXCI7XCIpO2ZvcihhPTA7ayYmay5rd29ubHlhcmdzJiZcbmE8ay5rd29ubHlhcmdzLmxlbmd0aDsrK2EpRz1rLmt3b25seWFyZ3NbYV0uYXJnLHRoaXMuaXNDZWxsKEcpJiYoRz1iKGUodGhpcy51LnByaXZhdGVfLEcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrRytcIj1cIitHK1wiO1wiKTtxJiZ0aGlzLmlzQ2VsbChxLmFyZykmJihhPWIoZSh0aGlzLnUucHJpdmF0ZV8scS5hcmcpLnYpLHRoaXMudS52YXJEZWNsc0NvZGUrPVwiJGNlbGwuXCIrYStcIj1cIithK1wiO1wiKTt1JiYodGhpcy51LmxvY2FsbmFtZXMucHVzaCh1LmFyZy52KSx0aGlzLnUudmFyRGVjbHNDb2RlKz11LmFyZy52K1wiPW5ldyBTay5idWlsdGluc1snZGljdCddKCRrd2EpO1wiLHRoaXMuaXNDZWxsKHUuYXJnKSYmKGE9YihlKHRoaXMudS5wcml2YXRlXyx1LmFyZykudiksdGhpcy51LnZhckRlY2xzQ29kZSs9XCIkY2VsbC5cIithK1wiPVwiK2ErXCI7XCIpKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cIn1cIjtTay5fX2Z1dHVyZV9fLnB5dGhvbjMmJm0mJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cblwiJGdibC5fX2NsYXNzX189JGdibC5cIittLnYrXCI7XCIpO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO3RoaXMudS5zd2l0Y2hDb2RlKz10aGlzLm91dHB1dEludGVycnVwdFRlc3QoKTt0aGlzLnUuc3dpdGNoQ29kZSs9XCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9IH1jYXRjaChlcnIpeyBpZiAoIShlcnIgaW5zdGFuY2VvZiBTay5idWlsdGluLkJhc2VFeGNlcHRpb24pKSB7IGVyciA9IG5ldyBTay5idWlsdGluLkV4dGVybmFsRXJyb3IoZXJyKTsgfSBlcnIudHJhY2ViYWNrLnB1c2goe2xpbmVubzogJGN1cnJMaW5lTm8sIGNvbG5vOiAkY3VyckNvbE5vLCBmaWxlbmFtZTogJ1wiK3RoaXMuZmlsZW5hbWUrXCInfSk7IGlmICgkZXhjLmxlbmd0aD4wKSB7ICRlcnIgPSBlcnI7ICRibGs9JGV4Yy5wb3AoKTsgY29udGludWU7IH0gZWxzZSB7IHRocm93IGVycjsgfX0gfX0pO1wiO2guY2FsbCh0aGlzLEYpO2lmKGspe2ZvcihsZXQgYSBvZiBrLmFyZ3MpZC5wdXNoKGEuYXJnLnYpO1xuZm9yKGxldCBhIG9mIGsua3dvbmx5YXJnc3x8W10pZC5wdXNoKGEuYXJnLnYpO3RoaXMudS5hcmduYW1lcz1kfXRoaXMuZXhpdFNjb3BlKCk7MDxuLmxlbmd0aCYmbChGLFwiLiRkZWZhdWx0cz1bXCIsbi5qb2luKFwiLFwiKSxcIl07XCIpO2smJmsua3dvbmx5YXJncyYmMDxrLmt3b25seWFyZ3MubGVuZ3RoJiYobChGLFwiLmNvX2FyZ2NvdW50PVwiLGsuYXJncy5sZW5ndGgsXCI7XCIpLGwoRixcIi5jb19rd29ubHlhcmdjb3VudD1cIixrLmt3b25seWFyZ3MubGVuZ3RoLFwiO1wiKSxsKEYsXCIuJGt3ZGVmcz1bXCIscC5qb2luKFwiLFwiKSxcIl07XCIpKTswPGQubGVuZ3RoP2woRixcIi5jb192YXJuYW1lcz1bJ1wiLGQuam9pbihcIicsJ1wiKSxcIiddO1wiKTpsKEYsXCIuY29fdmFybmFtZXM9W107XCIpO3UmJmwoRixcIi5jb19rd2FyZ3M9MTtcIik7cSYmbChGLFwiLmNvX3ZhcmFyZ3M9MTtcIik7Znx8bChGLFwiLmNvX2Zhc3RjYWxsPTE7XCIpO2g9XCJcIjtNJiYoaD1cIiwkY2VsbFwiLChtPXRoaXMudS5zdGUuaGFzRnJlZSkmJihoKz1cIiwkZnJlZVwiKSk7XG5pZihmKXJldHVybiBrJiYwPGsuYXJncy5sZW5ndGg/dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe3ZhciAkb3JpZ2FyZ3M9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtTay5idWlsdGluLnB5Q2hlY2tBcmdzTGVuKFxcXCJcIixjLnYsJ1wiLGFyZ3VtZW50cy5sZW5ndGgsJyxrLmFyZ3MubGVuZ3RoLW4ubGVuZ3RoLFwiLFwiLGsuYXJncy5sZW5ndGgsXCIpO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCwkb3JpZ2FyZ3NcIixoLFwiKTt9KSlcIik6dGhpcy5fZ3IoXCJnZW5lclwiLFwibmV3IFNrLmJ1aWx0aW5zWydmdW5jdGlvbiddKChmdW5jdGlvbigpe1NrLmJ1aWx0aW4ucHlDaGVja0FyZ3NMZW4oXFxcIlwiLGMudixcIlxcXCIsYXJndW1lbnRzLmxlbmd0aCwwLDApO3JldHVybiBuZXcgU2suYnVpbHRpbnNbJ2dlbmVyYXRvciddKFwiLEYsXCIsJGdibCxbXVwiLGgsXCIpO30pKVwiKTtpZigwPGcubGVuZ3RoKXtsKFwiJHJldCA9IG5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixcbkYsXCIsJGdibFwiLGgsXCIpO1wiKTtmb3IobGV0IGEgb2YgZy5yZXZlcnNlKCkpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIixbJHJldF0pO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oKTtyZXR1cm4gdGhpcy5fZ3IoXCJmdW5jb2JqXCIsXCIkcmV0XCIpfXJldHVybiB0aGlzLl9ncihcImZ1bmNvYmpcIixcIm5ldyBTay5idWlsdGluc1snZnVuY3Rpb24nXShcIixGLFwiLCRnYmxcIixoLFwiKVwiKX07YS5wcm90b3R5cGUuY2Z1bmN0aW9uPWZ1bmN0aW9uKGEsYil7U2suYXNzZXJ0cy5hc3NlcnQoYSBpbnN0YW5jZW9mIFNrLmFzdG5vZGVzLkZ1bmN0aW9uRGVmKTtiPXRoaXMuYnVpbGRjb2Rlb2JqKGEsYS5uYW1lLGEuZGVjb3JhdG9yX2xpc3QsYS5hcmdzLGZ1bmN0aW9uKGIpe3RoaXMudnNlcXN0bXQoYS5ib2R5KTtsKFwicmV0dXJuIFNrLmJ1aWx0aW4ubm9uZS5ub25lJDtcIil9LGIpO3RoaXMubmFtZW9wKGEubmFtZSxTay5hc3Rub2Rlcy5TdG9yZSxiKX07YS5wcm90b3R5cGUuY2xhbWJkYT1cbmZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5MYW1iZGEpO3JldHVybiB0aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxsYW1iZGE+XCIpLG51bGwsYS5hcmdzLGZ1bmN0aW9uKGIpe2I9dGhpcy52ZXhwcihhLmJvZHkpO2woXCJyZXR1cm4gXCIsYixcIjtcIil9KX07YS5wcm90b3R5cGUuY2lmZXhwPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmV3QmxvY2soXCJuZXh0IG9mIGlmZXhwXCIpLGM9dGhpcy5uZXdCbG9jayhcImVuZCBvZiBpZmV4cFwiKSxkPXRoaXMuX2dyKFwicmVzXCIsXCJudWxsXCIpLGU9dGhpcy52ZXhwcihhLnRlc3QpO3RoaXMuX2p1bXBmYWxzZShlLGIpO2woZCxcIj1cIix0aGlzLnZleHByKGEuYm9keSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhiKTtsKGQsXCI9XCIsdGhpcy52ZXhwcihhLm9yZWxzZSksXCI7XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTtyZXR1cm4gZH07YS5wcm90b3R5cGUuY2dlbmV4cGdlbj1cbmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLm5ld0Jsb2NrKFwic3RhcnQgZm9yIFwiK2IpLGU9dGhpcy5uZXdCbG9jayhcInNraXAgZm9yIFwiK2IpO3RoaXMubmV3QmxvY2soXCJpZiBjbGVhbnVwIGZvciBcIitiKTt2YXIgZj10aGlzLm5ld0Jsb2NrKFwiZW5kIGZvciBcIitiKSxnPWFbYl07aWYoMD09PWIpdmFyIGg9XCIkbG9jLiRpdGVyMFwiO2Vsc2V7dmFyIG09dGhpcy52ZXhwcihnLml0ZXIpO2g9XCIkbG9jLlwiK3RoaXMuZ2Vuc3ltKFwiaXRlclwiKTtsKGgsXCI9XCIsXCJTay5hYnN0ci5pdGVyKFwiLG0sXCIpO1wiKX10aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZCk7dGhpcy5hbm5vdGF0ZVNvdXJjZShjKTtsKFwiJHJldCA9IFNrLmFic3RyLml0ZXJuZXh0KFwiLGgsdGhpcy51LmNhblN1c3BlbmQ/XCIsIHRydWVcIjpcIiwgZmFsc2VcIixcIik7XCIpO3RoaXMuX2NoZWNrU3VzcGVuc2lvbihjKTttPXRoaXMuX2dyKFwibmV4dFwiLFwiJHJldFwiKTt0aGlzLl9qdW1wdW5kZWYobSxmKTt0aGlzLnZleHByKGcudGFyZ2V0LFxubSk7dmFyIG49Zy5pZnM/Zy5pZnMubGVuZ3RoOjA7Zm9yKGg9MDtoPG47KytoKXRoaXMuYW5ub3RhdGVTb3VyY2UoZy5pZnNbaF0pLG09dGhpcy52ZXhwcihnLmlmc1toXSksdGhpcy5fanVtcGZhbHNlKG0sZCk7KytiPGEubGVuZ3RoJiZ0aGlzLmNnZW5leHBnZW4oYSxiLGMpO2I+PWEubGVuZ3RoJiYodGhpcy5hbm5vdGF0ZVNvdXJjZShjKSxhPXRoaXMudmV4cHIoYyksbChcInJldHVybiBbXCIsZSxcIi8qcmVzdW1lKi8sXCIsYSxcIi8qcmV0Ki9dO1wiKSx0aGlzLnNldEJsb2NrKGUpKTt0aGlzLl9qdW1wKGQpO3RoaXMuc2V0QmxvY2soZik7MT09PWImJmwoXCJyZXR1cm4gU2suYnVpbHRpbi5ub25lLm5vbmUkO1wiKX07YS5wcm90b3R5cGUuY2dlbmV4cD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmJ1aWxkY29kZW9iaihhLG5ldyBTay5idWlsdGluLnN0cihcIjxnZW5leHByPlwiKSxudWxsLG51bGwsZnVuY3Rpb24oYil7dGhpcy5jZ2VuZXhwZ2VuKGEuZ2VuZXJhdG9ycywwLGEuZWx0KX0pO2I9dGhpcy5fZ3IoXCJnZW5lclwiLFxuXCJTay5taXNjZXZhbC5jYWxsc2ltQXJyYXkoXCIsYixcIik7XCIpO2woYixcIi5naSRsb2NhbHMuJGl0ZXIwPVNrLmFic3RyLml0ZXIoXCIsdGhpcy52ZXhwcihhLmdlbmVyYXRvcnNbMF0uaXRlciksXCIpO1wiKTtyZXR1cm4gYn07YS5wcm90b3R5cGUuY2NsYXNzPWZ1bmN0aW9uKGEpe1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5DbGFzc0RlZik7dmFyIGI9dGhpcy52c2VxZXhwcihhLmRlY29yYXRvcl9saXN0KTt2YXIgYz10aGlzLnZzZXFleHByKGEuYmFzZXMpO3ZhciBkPXRoaXMuZW50ZXJTY29wZShhLm5hbWUsYSxhLmxpbmVubyk7dmFyIGU9dGhpcy5uZXdCbG9jayhcImNsYXNzIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2QrXCI9KGZ1bmN0aW9uICRcIithLm5hbWUuditcIiRjbGFzc19vdXRlcigkZ2xvYmFscywkbG9jYWxzLCRjZWxsKXt2YXIgJGdibD0kZ2xvYmFscywkbG9jPSRsb2NhbHM7JGZyZWU9JGdsb2JhbHM7XCI7dGhpcy51LnN3aXRjaENvZGUrPVxuXCIoZnVuY3Rpb24gJFwiK2EubmFtZS52K1wiJF9jbG9zdXJlKCRjZWxsKXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9XCJ2YXIgJGJsaz1cIitlK1wiLCRleGM9W10sJHJldD11bmRlZmluZWQsJHBvc3RmaW5hbGx5PXVuZGVmaW5lZCwkY3VyckxpbmVObz11bmRlZmluZWQsJGN1cnJDb2xObz11bmRlZmluZWQ7XCI7bnVsbCE9PVNrLmV4ZWNMaW1pdCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmKHRoaXMudS5zd2l0Y2hDb2RlKz1cImlmICh0eXBlb2YgU2subGFzdFlpZWxkID09PSAndW5kZWZpbmVkJykge1NrLmxhc3RZaWVsZCA9IERhdGUubm93KCl9XCIpO3RoaXMudS5zd2l0Y2hDb2RlKz1cIndoaWxlKHRydWUpe3RyeXtcIjt0aGlzLnUuc3dpdGNoQ29kZSs9dGhpcy5vdXRwdXRJbnRlcnJ1cHRUZXN0KCk7dGhpcy51LnN3aXRjaENvZGUrPVxuXCJzd2l0Y2goJGJsayl7XCI7dGhpcy51LnN1ZmZpeENvZGU9XCJ9fWNhdGNoKGVycil7IGlmICghKGVyciBpbnN0YW5jZW9mIFNrLmJ1aWx0aW4uQmFzZUV4Y2VwdGlvbikpIHsgZXJyID0gbmV3IFNrLmJ1aWx0aW4uRXh0ZXJuYWxFcnJvcihlcnIpOyB9IGVyci50cmFjZWJhY2sucHVzaCh7bGluZW5vOiAkY3VyckxpbmVObywgY29sbm86ICRjdXJyQ29sTm8sIGZpbGVuYW1lOiAnXCIrdGhpcy5maWxlbmFtZStcIid9KTsgaWYgKCRleGMubGVuZ3RoPjApIHsgJGVyciA9IGVycjsgJGJsaz0kZXhjLnBvcCgpOyBjb250aW51ZTsgfSBlbHNlIHsgdGhyb3cgZXJyOyB9fX1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9KS5jYWxsKG51bGwsICRjZWxsKTt9KTtcIjt0aGlzLnUucHJpdmF0ZV89YS5uYW1lO3RoaXMuY2JvZHkoYS5ib2R5LGEubmFtZSk7bChcInJldHVybjtcIik7dGhpcy5leGl0U2NvcGUoKTtsKFwiJHJldCA9IFNrLm1pc2NldmFsLmJ1aWxkQ2xhc3MoJGdibCxcIixkLFwiLFwiLGEubmFtZS4kcigpLnYsXG5cIixbXCIsYyxcIl0sICRjZWxsKTtcIik7Zm9yKGxldCBhIG9mIGIpbChcIiRyZXQgPSBTay5taXNjZXZhbC5jYWxsc2ltT3JTdXNwZW5kQXJyYXkoXCIsYSxcIiwgWyRyZXRdKTtcIiksdGhpcy5fY2hlY2tTdXNwZW5zaW9uKCk7dGhpcy5uYW1lb3AoYS5uYW1lLFNrLmFzdG5vZGVzLlN0b3JlLFwiJHJldFwiKX07YS5wcm90b3R5cGUuY2NvbnRpbnVlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucGVla0ZpbmFsbHlCbG9jaygpO2lmKDA9PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpdGhyb3cgbmV3IFNrLmJ1aWx0aW4uU3ludGF4RXJyb3IoXCInY29udGludWUnIG91dHNpZGUgbG9vcFwiLHRoaXMuZmlsZW5hbWUsYS5saW5lbm8pO2E9dGhpcy51LmNvbnRpbnVlQmxvY2tzW3RoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgtMV07U2suYXNzZXJ0cy5hc3NlcnQodGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aD09PXRoaXMudS5jb250aW51ZUJsb2Nrcy5sZW5ndGgpO2ImJmIuYnJlYWtEZXB0aD09dGhpcy51LmNvbnRpbnVlQmxvY2tzLmxlbmd0aD9cbmwoXCIkcG9zdGZpbmFsbHk9e2lzQnJlYWs6dHJ1ZSxnb3RvQmxvY2s6XCIsYSxcIn07XCIpOnRoaXMuX2p1bXAoYSl9O2EucHJvdG90eXBlLmNicmVhaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnBlZWtGaW5hbGx5QmxvY2soKTtpZigwPT09dGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidicmVhaycgb3V0c2lkZSBsb29wXCIsdGhpcy5maWxlbmFtZSxhLmxpbmVubyk7YT10aGlzLnUuYnJlYWtCbG9ja3NbdGhpcy51LmJyZWFrQmxvY2tzLmxlbmd0aC0xXTtiJiZiLmJyZWFrRGVwdGg9PXRoaXMudS5icmVha0Jsb2Nrcy5sZW5ndGg/bChcIiRwb3N0ZmluYWxseT17aXNCcmVhazp0cnVlLGdvdG9CbG9jazpcIixhLFwifTtcIik6dGhpcy5fanVtcChhKX07YS5wcm90b3R5cGUudnN0bXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnUubGluZW5vPWEubGluZW5vO3RoaXMudS5saW5lbm9TZXQ9ITE7dGhpcy51LmxvY2FsdGVtcHM9W107aWYoU2suZGVidWdnaW5nJiZcbnRoaXMudS5jYW5TdXNwZW5kKXt2YXIgYz10aGlzLm5ld0Jsb2NrKFwiZGVidWcgYnJlYWtwb2ludCBmb3IgbGluZSBcIithLmxpbmVubyk7bChcImlmIChTay5icmVha3BvaW50cygnXCIrdGhpcy5maWxlbmFtZStcIicsXCIrYS5saW5lbm8rXCIsXCIrYS5jb2xfb2Zmc2V0K1wiKSkge1wiLFwidmFyICRzdXNwID0gJHNhdmVTdXNwZW5zaW9uKHtkYXRhOiB7dHlwZTogJ1NrLmRlYnVnJ30sIHJlc3VtZTogZnVuY3Rpb24oKSB7fX0sICdcIit0aGlzLmZpbGVuYW1lK1wiJyxcIithLmxpbmVubytcIixcIithLmNvbF9vZmZzZXQrXCIpO1wiLFwiJHN1c3AuJGJsayA9IFwiK2MrXCI7XCIsXCIkc3VzcC5vcHRpb25hbCA9IHRydWU7XCIsXCJyZXR1cm4gJHN1c3A7XCIsXCJ9XCIpO3RoaXMuX2p1bXAoYyk7dGhpcy5zZXRCbG9jayhjKTt0aGlzLnUuZG9lc1N1c3BlbmQ9ITB9dGhpcy5hbm5vdGF0ZVNvdXJjZShhKTtzd2l0Y2goYS5jb25zdHJ1Y3Rvcil7Y2FzZSBTay5hc3Rub2Rlcy5GdW5jdGlvbkRlZjp0aGlzLmNmdW5jdGlvbihhLGIpO1xuYnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5DbGFzc0RlZjp0aGlzLmNjbGFzcyhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlJldHVybjppZih0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9jayl0aHJvdyBuZXcgU2suYnVpbHRpbi5TeW50YXhFcnJvcihcIidyZXR1cm4nIG91dHNpZGUgZnVuY3Rpb25cIix0aGlzLmZpbGVuYW1lLGEubGluZW5vKTtjPWEudmFsdWU/dGhpcy52ZXhwcihhLnZhbHVlKTpcIlNrLmJ1aWx0aW4ubm9uZS5ub25lJFwiOzA9PXRoaXMudS5maW5hbGx5QmxvY2tzLmxlbmd0aD9sKFwicmV0dXJuIFwiLGMsXCI7XCIpOihsKFwiJHBvc3RmaW5hbGx5PXtyZXR1cm5pbmc6XCIsYyxcIn07XCIpLHRoaXMuX2p1bXAodGhpcy5wZWVrRmluYWxseUJsb2NrKCkuYmxrKSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5EZWxldGU6dGhpcy52c2VxZXhwcihhLnRhcmdldHMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQXNzaWduOnZhciBkPWEudGFyZ2V0cy5sZW5ndGg7XG5jPXRoaXMudmV4cHIoYS52YWx1ZSk7Zm9yKGI9MDtiPGQ7KytiKXRoaXMudmV4cHIoYS50YXJnZXRzW2JdLGMpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuQW5uQXNzaWduOmM9dGhpcy52ZXhwcihhLnZhbHVlKTt0aGlzLnZleHByKGEudGFyZ2V0LGMpO3RoaXMudmV4cHIoYS5hbm5vdGF0aW9uKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkF1Z0Fzc2lnbjpyZXR1cm4gdGhpcy5jYXVnYXNzaWduKGEpO2Nhc2UgU2suYXN0bm9kZXMuUHJpbnQ6dGhpcy5jcHJpbnQoYSk7YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5Gb3I6cmV0dXJuIHRoaXMuY2ZvcihhKTtjYXNlIFNrLmFzdG5vZGVzLldoaWxlOnJldHVybiB0aGlzLmN3aGlsZShhKTtjYXNlIFNrLmFzdG5vZGVzLklmOnJldHVybiB0aGlzLmNpZihhKTtjYXNlIFNrLmFzdG5vZGVzLlJhaXNlOnJldHVybiB0aGlzLmNyYWlzZShhKTtjYXNlIFNrLmFzdG5vZGVzLlRyeTpyZXR1cm4gdGhpcy5jdHJ5KGEpO2Nhc2UgU2suYXN0bm9kZXMuV2l0aDpyZXR1cm4gdGhpcy5jd2l0aChhLFxuMCk7Y2FzZSBTay5hc3Rub2Rlcy5Bc3NlcnQ6cmV0dXJuIHRoaXMuY2Fzc2VydChhKTtjYXNlIFNrLmFzdG5vZGVzLkltcG9ydDpyZXR1cm4gdGhpcy5jaW1wb3J0KGEpO2Nhc2UgU2suYXN0bm9kZXMuSW1wb3J0RnJvbTpyZXR1cm4gdGhpcy5jZnJvbWltcG9ydChhKTtjYXNlIFNrLmFzdG5vZGVzLkdsb2JhbDpicmVhaztjYXNlIFNrLmFzdG5vZGVzLkV4cHI6dGhpcy52ZXhwcihhLnZhbHVlKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhc3M6YnJlYWs7Y2FzZSBTay5hc3Rub2Rlcy5CcmVhazp0aGlzLmNicmVhayhhKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkNvbnRpbnVlOnRoaXMuY2NvbnRpbnVlKGEpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuRGVidWdnZXI6bChcImRlYnVnZ2VyO1wiKTticmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlIGluIHZzdG10OiBcIitKU09OLnN0cmluZ2lmeShhKSl9fTthLnByb3RvdHlwZS52c2Vxc3RtdD1mdW5jdGlvbihhKXt2YXIgYjtcbmZvcihiPTA7YjxhLmxlbmd0aDsrK2IpdGhpcy52c3RtdChhW2JdKX07YS5wcm90b3R5cGUuaXNDZWxsPWZ1bmN0aW9uKGEpe2E9YihlKHRoaXMudS5wcml2YXRlXyxhKS52KTtyZXR1cm4gdGhpcy51LnN0ZS5nZXRTY29wZShhKT09PVNrLlNZTVRBQl9DT05TVFMuQ0VMTH07YS5wcm90b3R5cGUubmFtZW9wPWZ1bmN0aW9uKGEsYyxmKXtpZigoYz09PVNrLmFzdG5vZGVzLlN0b3JlfHxjPT09U2suYXN0bm9kZXMuQXVnU3RvcmV8fGM9PT1Tay5hc3Rub2Rlcy5EZWwpJiZcIl9fZGVidWdfX1wiPT09YS52KXRocm93IG5ldyBTay5idWlsdGluLlN5bnRheEVycm9yKFwiY2FuIG5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fXCIsdGhpcy5maWxlbmFtZSx0aGlzLnUubGluZW5vKTtTay5hc3NlcnRzLmFzc2VydChcIk5vbmVcIiE9PWEudik7aWYoXCJOb3RJbXBsZW1lbnRlZFwiPT09YS52KXJldHVyblwiU2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZC5Ob3RJbXBsZW1lbnRlZCRcIjt2YXIgZD1lKHRoaXMudS5wcml2YXRlXyxcbmEpLnY7ZD1iKGQpO3ZhciBnPTM7dmFyIGg9dGhpcy51LnN0ZS5nZXRTY29wZShkKTt2YXIgbT1udWxsO3N3aXRjaChoKXtjYXNlIFNrLlNZTVRBQl9DT05TVFMuRlJFRTptPVwiJGZyZWVcIjtnPTI7YnJlYWs7Y2FzZSBTay5TWU1UQUJfQ09OU1RTLkNFTEw6bT1cIiRjZWxsXCI7Zz0yO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5MT0NBTDp0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVNrLlNZTVRBQl9DT05TVFMuRnVuY3Rpb25CbG9ja3x8dGhpcy51LnN0ZS5nZW5lcmF0b3J8fChnPTApO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfSU1QTElDSVQ6dGhpcy51LnN0ZS5ibG9ja1R5cGU9PT1Tay5TWU1UQUJfQ09OU1RTLkZ1bmN0aW9uQmxvY2smJihnPTEpO2JyZWFrO2Nhc2UgU2suU1lNVEFCX0NPTlNUUy5HTE9CQUxfRVhQTElDSVQ6Zz0xfVNrLmFzc2VydHMuYXNzZXJ0KGh8fFwiX1wiPT09YS52LmNoYXJBdCgxKSk7YT1kO3RoaXMudS5zdGUuZ2VuZXJhdG9yfHx0aGlzLnUuc3RlLmJsb2NrVHlwZSE9PVxuU2suU1lNVEFCX0NPTlNUUy5GdW5jdGlvbkJsb2NrP2Q9XCIkbG9jLlwiK2Q6KDA9PT1nfHwzPT09ZykmJnRoaXMudS5sb2NhbG5hbWVzLnB1c2goZCk7c3dpdGNoKGcpe2Nhc2UgMDpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOmNhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGwoXCJpZiAoXCIsZCxcIiA9PT0gdW5kZWZpbmVkKSB7IHRocm93IG5ldyBTay5idWlsdGluLlVuYm91bmRMb2NhbEVycm9yKCdsb2NhbCB2YXJpYWJsZSBcXFxcJ1wiLGQsXCJcXFxcJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50Jyk7IH1cXG5cIiksZDtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkXCIpfWJyZWFrO2Nhc2UgMzpzd2l0Y2goYyl7Y2FzZSBTay5hc3Rub2Rlcy5Mb2FkOnJldHVybiB0aGlzLl9ncihcImxvYWRuYW1lXCIsZCxcblwiIT09dW5kZWZpbmVkP1wiLGQsXCI6U2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpO1wiKTtjYXNlIFNrLmFzdG5vZGVzLlN0b3JlOmwoZCxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlIFwiLGQsXCI7XCIpO2JyZWFrO2Nhc2UgU2suYXN0bm9kZXMuUGFyYW06cmV0dXJuIGQ7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWRcIil9YnJlYWs7Y2FzZSAxOnN3aXRjaChjKXtjYXNlIFNrLmFzdG5vZGVzLkxvYWQ6cmV0dXJuIHRoaXMuX2dyKFwibG9hZGdibFwiLFwiU2subWlzY2V2YWwubG9hZG5hbWUoJ1wiLGEsXCInLCRnYmwpXCIpO2Nhc2UgU2suYXN0bm9kZXMuU3RvcmU6bChcIiRnYmwuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLkRlbDpsKFwiZGVsZXRlICRnYmwuXCIsYSk7YnJlYWs7ZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ1bmhhbmRsZWQgY2FzZSBpbiBuYW1lIG9wX2dsb2JhbFwiKX1icmVhaztjYXNlIDI6c3dpdGNoKGMpe2Nhc2UgU2suYXN0bm9kZXMuTG9hZDpyZXR1cm4gbStcblwiLlwiK2E7Y2FzZSBTay5hc3Rub2Rlcy5TdG9yZTpsKG0sXCIuXCIsYSxcIj1cIixmLFwiO1wiKTticmVhaztjYXNlIFNrLmFzdG5vZGVzLlBhcmFtOnJldHVybiBhO2RlZmF1bHQ6U2suYXNzZXJ0cy5mYWlsKFwidW5oYW5kbGVkIGNhc2UgaW4gbmFtZSBvcF9kZXJlZlwiKX1icmVhaztkZWZhdWx0OlNrLmFzc2VydHMuZmFpbChcInVuaGFuZGxlZCBjYXNlXCIpfX07YS5wcm90b3R5cGUuZW50ZXJTY29wZT1mdW5jdGlvbihhLGIsZSxmKXt2YXIgZD1uZXcgYztkLnN0ZT10aGlzLnN0LmdldFN0c0ZvckFzdChiKTtkLm5hbWU9YTtkLmZpcnN0bGluZW5vPWU7ZC5jYW5TdXNwZW5kPWZ8fCExO3RoaXMudSYmdGhpcy51LnByaXZhdGVfJiYoZC5wcml2YXRlXz10aGlzLnUucHJpdmF0ZV8pO3RoaXMuc3RhY2sucHVzaCh0aGlzLnUpO3RoaXMuYWxsVW5pdHMucHVzaChkKTthPXRoaXMuZ2Vuc3ltKFwic2NvcGVcIik7ZC5zY29wZW5hbWU9YTt0aGlzLnU9ZDt0aGlzLnUuYWN0aXZhdGVTY29wZSgpO3RoaXMubmVzdGxldmVsKys7XG5yZXR1cm4gYX07YS5wcm90b3R5cGUuZXhpdFNjb3BlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51O3RoaXMubmVzdGxldmVsLS07KHRoaXMudT0wPD10aGlzLnN0YWNrLmxlbmd0aC0xP3RoaXMuc3RhY2sucG9wKCk6bnVsbCkmJnRoaXMudS5hY3RpdmF0ZVNjb3BlKCk7aWYoXCI8bW9kdWxlPlwiIT09YS5uYW1lLnYpe3ZhciBiPWEubmFtZS4kcigpLnY7Yj1iLnN1YnN0cmluZygxLGIubGVuZ3RoLTEpO2woYS5zY29wZW5hbWUsXCIuY29fbmFtZT1uZXcgU2suYnVpbHRpbnNbJ3N0ciddKCdcIixiLFwiJyk7XCIpO3RoaXMuc3RhY2subGVuZ3RoJiZcImNsYXNzXCI9PXRoaXMudS5zdGUuYmxvY2tUeXBlJiZsKGEuc2NvcGVuYW1lLFwiLmNvX3F1YWxuYW1lPW5ldyBTay5idWlsdGluc1snc3RyJ10oJ1wiK3RoaXMudS5uYW1lLnYrXCIuXCIrYitcIicpO1wiKX1mb3IodmFyIGMgaW4gYS5jb25zdHMpYS5jb25zdHMuaGFzT3duUHJvcGVydHkoYykmJihhLnN1ZmZpeENvZGUrPWMrXCIgPSBcIithLmNvbnN0c1tjXStcIjtcIil9O1xuYS5wcm90b3R5cGUuY2JvZHk9ZnVuY3Rpb24oYSxiKXt2YXIgYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKXRoaXMudnN0bXQoYVtjXSxiKX07YS5wcm90b3R5cGUuY3ByaW50PWZ1bmN0aW9uKGEpe3ZhciBiO1NrLmFzc2VydHMuYXNzZXJ0KGEgaW5zdGFuY2VvZiBTay5hc3Rub2Rlcy5QcmludCk7YS5kZXN0JiZ0aGlzLnZleHByKGEuZGVzdCk7dmFyIGM9YS52YWx1ZXMubGVuZ3RoO2ZvcihiPTA7YjxjOysrYilsKFwiJHJldCA9IFNrLm1pc2NldmFsLnByaW50XyhcIixcIm5ldyBTay5idWlsdGluc1snc3RyJ10oXCIsdGhpcy52ZXhwcihhLnZhbHVlc1tiXSksXCIpLnYpO1wiKSx0aGlzLl9jaGVja1N1c3BlbnNpb24oYSk7YS5ubCYmKGwoXCIkcmV0ID0gU2subWlzY2V2YWwucHJpbnRfKFwiLCdcIlxcXFxuXCIpOycpLHRoaXMuX2NoZWNrU3VzcGVuc2lvbihhKSl9O2EucHJvdG90eXBlLmNtb2Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbnRlclNjb3BlKG5ldyBTay5idWlsdGluLnN0cihcIjxtb2R1bGU+XCIpLFxuYSwwLHRoaXMuY2FuU3VzcGVuZCksYz10aGlzLm5ld0Jsb2NrKFwibW9kdWxlIGVudHJ5XCIpO3RoaXMudS5wcmVmaXhDb2RlPVwidmFyIFwiK2IrXCI9KGZ1bmN0aW9uKCRmb3JjZWdibCl7XCI7dGhpcy51LnZhckRlY2xzQ29kZT1cInZhciAkZ2JsID0gJGZvcmNlZ2JsIHx8IHt9LCAkYmxrPVwiK2MrXCIsJGV4Yz1bXSwkbG9jPSRnYmwsJGNlbGw9e30sJGVycj11bmRlZmluZWQ7JGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7dmFyICRyZXQ9dW5kZWZpbmVkLCRwb3N0ZmluYWxseT11bmRlZmluZWQsJGN1cnJMaW5lTm89dW5kZWZpbmVkLCRjdXJyQ29sTm89dW5kZWZpbmVkO1wiO251bGwhPT1Tay5leGVjTGltaXQmJih0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmICh0eXBlb2YgU2suZXhlY1N0YXJ0ID09PSAndW5kZWZpbmVkJykge1NrLmV4ZWNTdGFydCA9IERhdGUubm93KCl9XCIpO251bGwhPT1Tay55aWVsZExpbWl0JiZ0aGlzLnUuY2FuU3VzcGVuZCYmXG4odGhpcy51LnZhckRlY2xzQ29kZSs9XCJpZiAodHlwZW9mIFNrLmxhc3RZaWVsZCA9PT0gJ3VuZGVmaW5lZCcpIHtTay5sYXN0WWllbGQgPSBEYXRlLm5vdygpfVwiKTt0aGlzLnUudmFyRGVjbHNDb2RlKz1cImlmIChcIitiK1wiLiR3YWtpbmdTdXNwZW5zaW9uIT09dW5kZWZpbmVkKSB7ICR3YWtlRnJvbVN1c3BlbnNpb24oKTsgfWlmIChTay5yZXRhaW5HbG9iYWxzKSB7ICAgIGlmIChTay5nbG9iYWxzKSB7ICRnYmwgPSBTay5nbG9iYWxzOyBTay5nbG9iYWxzID0gJGdibDsgJGxvYyA9ICRnYmw7IH0gICAgaWYgKFNrLmdsb2JhbHMpIHsgJGdibCA9IFNrLmdsb2JhbHM7IFNrLmdsb2JhbHMgPSAkZ2JsOyAkbG9jID0gJGdibDsgJGxvYy5fX2ZpbGVfXz1uZXcgU2suYnVpbHRpbnMuc3RyKCdcIit0aGlzLmZpbGVuYW1lK1wiJyk7fSAgICBlbHNlIHsgU2suZ2xvYmFscyA9ICRnYmw7IH19IGVsc2UgeyBTay5nbG9iYWxzID0gJGdibDsgfVwiO3RoaXMudS5zd2l0Y2hDb2RlPVwid2hpbGUodHJ1ZSl7dHJ5e1wiO1xudGhpcy51LnN3aXRjaENvZGUrPXRoaXMub3V0cHV0SW50ZXJydXB0VGVzdCgpO3RoaXMudS5zd2l0Y2hDb2RlKz1cInN3aXRjaCgkYmxrKXtcIjt0aGlzLnUuc3VmZml4Q29kZT1cIn1cIjt0aGlzLnUuc3VmZml4Q29kZSs9XCJ9Y2F0Y2goZXJyKXsgaWYgKCEoZXJyIGluc3RhbmNlb2YgU2suYnVpbHRpbi5CYXNlRXhjZXB0aW9uKSkgeyBlcnIgPSBuZXcgU2suYnVpbHRpbi5FeHRlcm5hbEVycm9yKGVycik7IH0gZXJyLnRyYWNlYmFjay5wdXNoKHtsaW5lbm86ICRjdXJyTGluZU5vLCBjb2xubzogJGN1cnJDb2xObywgZmlsZW5hbWU6ICdcIit0aGlzLmZpbGVuYW1lK1wiJ30pOyBpZiAoJGV4Yy5sZW5ndGg+MCkgeyAkZXJyID0gZXJyOyAkYmxrPSRleGMucG9wKCk7IGNvbnRpbnVlOyB9IGVsc2UgeyB0aHJvdyBlcnI7IH19IH0gfSk7XCI7c3dpdGNoKGEuY29uc3RydWN0b3Ipe2Nhc2UgU2suYXN0bm9kZXMuTW9kdWxlOnRoaXMuY2JvZHkoYS5ib2R5KTtsKFwicmV0dXJuICRsb2M7XCIpO2JyZWFrO1xuZGVmYXVsdDpTay5hc3NlcnRzLmZhaWwoXCJ0b2RvOyB1bmhhbmRsZWQgY2FzZSBpbiBjb21waWxlck1vZFwiKX10aGlzLmV4aXRTY29wZSgpO3RoaXMucmVzdWx0LnB1c2godGhpcy5vdXRwdXRBbGxVbml0cygpKTtyZXR1cm4gYn07U2suY29tcGlsZT1mdW5jdGlvbihiLGMsZSxmKXtlPVNrLl9fZnV0dXJlX187U2suX19mdXR1cmVfXz1PYmplY3QuY3JlYXRlKFNrLl9fZnV0dXJlX18pO3ZhciBkPVNrLnBhcnNlKGMsYiksZz1Tay5hc3RGcm9tUGFyc2UoZC5jc3QsYyxkLmZsYWdzKTtkPWQuZmxhZ3M7dmFyIGg9U2suc3ltYm9sdGFibGUoZyxjKTtiPW5ldyBhKGMsaCxkLGYsYik7Yz1iLmNtb2QoZyk7U2suX19mdXR1cmVfXz1lO3JldHVybntmdW5jbmFtZTpcIiRjb21waWxlZG1vZFwiLGNvZGU6XCIkY29tcGlsZWRtb2QgPSBmdW5jdGlvbigpIHtcIitiLnJlc3VsdC5qb2luKFwiXCIpK1wiXFxucmV0dXJuIFwiK2MrXCI7fSgpO1wifX07U2suZXhwb3J0U3ltYm9sKFwiU2suY29tcGlsZVwiLFNrLmNvbXBpbGUpO1xuU2sucmVzZXRDb21waWxlcj1mdW5jdGlvbigpe1NrLmdlbnN5bWNvdW50PTB9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnJlc2V0Q29tcGlsZXJcIixTay5yZXNldENvbXBpbGVyKTtTay5maXhSZXNlcnZlZD1iO1NrLmV4cG9ydFN5bWJvbChcIlNrLmZpeFJlc2VydmVkXCIsU2suZml4UmVzZXJ2ZWQpO1NrLnVuZml4UmVzZXJ2ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvX1xcJHJ3XFwkJC8sXCJcIil9O1NrLmV4cG9ydFN5bWJvbChcIlNrLnVuZml4UmVzZXJ2ZWRcIixTay51bmZpeFJlc2VydmVkKTtTay5tYW5nbGVOYW1lPWU7U2suZXhwb3J0U3ltYm9sKFwiU2subWFuZ2xlTmFtZVwiLFNrLm1hbmdsZU5hbWUpO1NrLnJlc2VydmVkV29yZHNfPWg7U2suZXhwb3J0U3ltYm9sKFwiU2sucmVzZXJ2ZWRXb3Jkc19cIixTay5yZXNlcnZlZFdvcmRzXyl9LGZ1bmN0aW9uKG0scSl7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD12b2lkIDA7U2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWU9XG5mdW5jdGlvbihhLGMsYil7dmFyIGU9YS5yZXBsYWNlKC9cXC4vZyxcIi9cIiksZj1mdW5jdGlvbihhLGIpe3JldHVybiBTay5taXNjZXZhbC5jaGFpbihTay5taXNjZXZhbC50cnlDYXRjaChmdW5jdGlvbigpe3JldHVybiBTay5yZWFkKGEpfSxmdW5jdGlvbihhKXt9KSxmdW5jdGlvbihjKXtpZih2b2lkIDAhPT1jKXJldHVybiBuZXcgU2subWlzY2V2YWwuQnJlYWsoe2ZpbGVuYW1lOmEsY29kZTpjLHBhY2thZ2VQYXRoOmJ9KX0pfTt2b2lkIDA9PT1iJiYoYj1Tay5yZWFsc3lzcGF0aCk7cmV0dXJuIFNrLm1pc2NldmFsLml0ZXJGb3IoYi50cCRpdGVyKCksZnVuY3Rpb24oYSl7cmV0dXJuIFNrLm1pc2NldmFsLmNoYWluKGYoYS52K1wiL1wiK2UrYywhMSksZnVuY3Rpb24oYil7cmV0dXJuIGI/YjpmKGEuditcIi9cIitlK1wiL19faW5pdF9fXCIrYyxhLnYrXCIvXCIrZSl9KX0pfTtTay5pbXBvcnRTZXRVcFBhdGg9ZnVuY3Rpb24oYSl7aWYoIVNrLnJlYWxzeXNwYXRoKXt2YXIgYz1bbmV3IFNrLmJ1aWx0aW4uc3RyKFwic3JjL2J1aWx0aW5cIiksXG5uZXcgU2suYnVpbHRpbi5zdHIoXCJzcmMvbGliXCIpLG5ldyBTay5idWlsdGluLnN0cihcIi5cIildO2ZvcihhPTA7YTxTay5zeXNwYXRoLmxlbmd0aDsrK2EpYy5wdXNoKG5ldyBTay5idWlsdGluLnN0cihTay5zeXNwYXRoW2FdKSk7U2sucmVhbHN5c3BhdGg9bmV3IFNrLmJ1aWx0aW4ubGlzdChjKX19O1NrLmltcG9ydE1vZHVsZUludGVybmFsXz1mdW5jdGlvbihhLGMsYixlLGYsbCxoKXt2YXIgZCxnLG0sayxwPW51bGwscT12b2lkIDAhPT1mP2YudHAkZ2V0YXR0cihTay5idWlsdGluLnN0ci4kbmFtZSk6dm9pZCAwLEE9dm9pZCAwIT09cT9xLnYrXCIuXCI6XCJcIix0PXZvaWQgMCE9PWY/Zi50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRwYXRoKTp2b2lkIDA7U2suaW1wb3J0U2V0VXBQYXRoKGgpO2lmKGYmJiFxKXtpZihsKXJldHVybjt0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHRvIGltcG9ydCByZWxhdGl2ZSB0byBpbnZhbGlkIHBhY2thZ2UgKG5vIG5hbWUpXCIpO1xufXZvaWQgMD09PWImJihiPUErYSk7dmFyIHY9YS5zcGxpdChcIi5cIik7aWYoMTx2Lmxlbmd0aCl7dmFyIEI9di5zbGljZSgwLHYubGVuZ3RoLTEpLmpvaW4oXCIuXCIpO3A9U2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKEIsYyx2b2lkIDAsdm9pZCAwLGYsbCxoKX12YXIgRD1Tay5taXNjZXZhbC5jaGFpbihwLGZ1bmN0aW9uKG4pe3A9bjtnPVNrLnN5c21vZHVsZXMucXVpY2skbG9va3VwKG5ldyBTay5idWlsdGluLnN0cihiKSk7cmV0dXJuIHZvaWQgMCE9PWc/cHx8ZzpTay5taXNjZXZhbC5jaGFpbih2b2lkIDAsZnVuY3Rpb24oKXt2YXIgYj1hO2lmKDE8di5sZW5ndGgpe2lmKCFwKXJldHVybjttPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cihBK0IpKTtiPXZbdi5sZW5ndGgtMV07dD1tLnRwJGdldGF0dHIoU2suYnVpbHRpbi5zdHIuJHBhdGgpfWs9bmV3IFNrLmJ1aWx0aW4ubW9kdWxlO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgZSl7ZD1hK1wiLnB5XCI7dmFyIGM9XG5Tay5jb21waWxlKGUsZCxcImV4ZWNcIixoKX1lbHNlIGM9U2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoU2sub25CZWZvcmVJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkJlZm9yZUltcG9ydClyZXR1cm4gU2sub25CZWZvcmVJbXBvcnQoYSl9LGZ1bmN0aW9uKGMpe2lmKCExPT09Yyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihcIkltcG9ydGluZyBcIithK1wiIGlzIG5vdCBhbGxvd2VkXCIpO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyl0aHJvdyBuZXcgU2suYnVpbHRpbi5JbXBvcnRFcnJvcihjKTtyZXR1cm4gU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcIi5qc1wiLHQpfSxmdW5jdGlvbihhKXtyZXR1cm4gYT97ZnVuY25hbWU6XCIkYnVpbHRpbm1vZHVsZVwiLGNvZGU6YS5jb2RlLGZpbGVuYW1lOmEuZmlsZW5hbWUscGFja2FnZVBhdGg6YS5wYWNrYWdlUGF0aH06U2subWlzY2V2YWwuY2hhaW4oU2suaW1wb3J0U2VhcmNoUGF0aEZvck5hbWUoYixcblwiLnB5XCIsdCksZnVuY3Rpb24oYil7aWYoYT1iKXJldHVybiBTay5jb21waWxlKGEuY29kZSxhLmZpbGVuYW1lLFwiZXhlY1wiLGgpfSxmdW5jdGlvbihiKXtpZihiKXJldHVybiBiLnBhY2thZ2VQYXRoPWEucGFja2FnZVBhdGgsYn0pfSk7cmV0dXJuIGN9LGZ1bmN0aW9uKGEpe2lmKGEpe1NrLnN5c21vZHVsZXMubXAkYXNzX3N1YnNjcmlwdChuZXcgU2suYnVpbHRpbi5zdHIoYiksayk7dmFyIGU9ay4kanM9YS5jb2RlO251bGw9PWQmJihkPWEuZmlsZW5hbWUpO251bGwhPVNrLmRhdGVTZXQmJlNrLmRhdGVTZXR8fChlPVwiU2suZXhlY1N0YXJ0ID0gU2subGFzdFlpZWxkID0gbmV3IERhdGUoKTtcXG5cIithLmNvZGUsU2suZGF0ZVNldD0hMCk7aWYoYyl7dmFyIGY9ZnVuY3Rpb24oYSl7dmFyIGIsYz1Tay5qc19iZWF1dGlmeShhKS5zcGxpdChcIlxcblwiKTtmb3IoYj0xO2I8PWMubGVuZ3RoOysrYil7dmFyIGQ9KFwiXCIrYikubGVuZ3RoO2ZvcihhPVwiXCI7NT5kOysrZClhKz1cIiBcIjtjW2ItMV09XCIvKiBcIitcbmErYitcIiAqLyBcIitjW2ItMV19cmV0dXJuIGMuam9pbihcIlxcblwiKX07ZT1mKGUpO1NrLmRlYnVnb3V0KGUpfWUrPVwiXFxuXCIrYS5mdW5jbmFtZStcIjtcIjtlPVNrLmdsb2JhbC5ldmFsKGUpO2suJGQ9e19fbmFtZV9fOm5ldyBTay5idWlsdGluLnN0cihiKSxfX2RvY19fOlNrLmJ1aWx0aW4ubm9uZS5ub25lJCxfX3BhY2thZ2VfXzphLnBhY2thZ2VQYXRoP25ldyBTay5idWlsdGluLnN0cihiKTpCP25ldyBTay5idWlsdGluLnN0cihBK0IpOnE/cTpTay5idWlsdGluLm5vbmUubm9uZSR9O2EucGFja2FnZVBhdGgmJihrLiRkLl9fcGF0aF9fPW5ldyBTay5idWlsdGluLnR1cGxlKFtuZXcgU2suYnVpbHRpbi5zdHIoYS5wYWNrYWdlUGF0aCldKSk7cmV0dXJuIGUoay4kZCl9fSxmdW5jdGlvbihiKXt2YXIgYztpZih2b2lkIDA9PT1iKXtpZihsJiYhcClyZXR1cm47dGhyb3cgbmV3IFNrLmJ1aWx0aW4uSW1wb3J0RXJyb3IoXCJObyBtb2R1bGUgbmFtZWQgXCIrYSk7fWlmKGIhPT1rLiRkKXtmb3IoYyBpbiBrLiRkKWJbY118fFxuKGJbY109ay4kZFtjXSk7ay4kZD1ifWlmKFNrLm9uQWZ0ZXJJbXBvcnQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBTay5vbkFmdGVySW1wb3J0KXRyeXtTay5vbkFmdGVySW1wb3J0KGEpfWNhdGNoKFYpe31pZihwKXJldHVybiBtLnRwJHNldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKHZbdi5sZW5ndGgtMV0pLGspLHA7ZiYmZi50cCRzZXRhdHRyKG5ldyBTay5idWlsdGluLnN0cihhKSxrKTtyZXR1cm4ga30pfSk7cmV0dXJuIGg/RDpTay5taXNjZXZhbC5yZXRyeU9wdGlvbmFsU3VzcGVuc2lvbk9yVGhyb3coRCl9O1NrLmltcG9ydE1vZHVsZT1mdW5jdGlvbihhLGMsYil7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW49ZnVuY3Rpb24oYSxjLGIpe1NrLmRhdGVTZXQ9ITE7U2suZmlsZXNMb2FkZWQ9ITE7U2suc3lzbW9kdWxlcz1uZXcgU2suYnVpbHRpbi5kaWN0KFtdKTtTay5yZWFsc3lzcGF0aD1cbnZvaWQgMDtTay5yZXNldENvbXBpbGVyKCk7cmV0dXJuIFNrLmltcG9ydE1vZHVsZUludGVybmFsXyhhLGMsXCJfX21haW5fX1wiLHZvaWQgMCx2b2lkIDAsITEsYil9O1NrLmltcG9ydE1haW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtTay5kYXRlU2V0PSExO1NrLmZpbGVzTG9hZGVkPSExO1NrLnN5c21vZHVsZXM9bmV3IFNrLmJ1aWx0aW4uZGljdChbXSk7U2sucmVhbHN5c3BhdGg9dm9pZCAwO1NrLnJlc2V0Q29tcGlsZXIoKTtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fbWFpbl9fXCIsYix2b2lkIDAsITEsZSl9O1NrLmltcG9ydEJ1aWx0aW5XaXRoQm9keT1mdW5jdGlvbihhLGMsYixlKXtyZXR1cm4gU2suaW1wb3J0TW9kdWxlSW50ZXJuYWxfKGEsYyxcIl9fYnVpbHRpbl9fLlwiK2EsYix2b2lkIDAsITEsZSl9O1NrLmJ1aWx0aW4uX19pbXBvcnRfXz1mdW5jdGlvbihhLGMsYixlLGYpe3ZhciBsPVNrLmdsb2JhbHMsaDt2b2lkIDA9PT1mJiYoZj1Tay5fX2Z1dHVyZV9fLmFic29sdXRlX2ltcG9ydD9cbjA6LTEpO2lmKDAhPT1mJiZjLl9fcGFja2FnZV9fJiZjLl9fcGFja2FnZV9fIT09U2suYnVpbHRpbi5ub25lLm5vbmUkKXtpZigoaD1jLl9fcGFja2FnZV9fLnYpJiYwPGYpe2M9aC5zcGxpdChcIi5cIik7aWYoZi0xPj1jLmxlbmd0aCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wbGV2ZWwgcGFja2FnZVwiKTtjLmxlbmd0aC09Zi0xO2g9Yy5qb2luKFwiLlwiKX12YXIgZD1Tay5zeXNtb2R1bGVzLnF1aWNrJGxvb2t1cChuZXcgU2suYnVpbHRpbi5zdHIoaCkpfWlmKDA8ZiYmdm9pZCAwPT09ZCl0aHJvdyBuZXcgU2suYnVpbHRpbi5WYWx1ZUVycm9yKFwiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZVwiKTthLnNwbGl0KFwiLlwiKTtyZXR1cm4gU2subWlzY2V2YWwuY2hhaW4odm9pZCAwLGZ1bmN0aW9uKCl7aWYoMCE9PWYmJnZvaWQgMCE9PWQpcmV0dXJuXCJcIj09PWE/ZDpTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSxcbnZvaWQgMCxoK1wiLlwiK2Esdm9pZCAwLGQsLTE9PWYsITApfSxmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwPT09Yj8oaD1kPXZvaWQgMCxTay5pbXBvcnRNb2R1bGVJbnRlcm5hbF8oYSx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsITEsITApKTpifSxmdW5jdGlvbihiKXtpZihlJiYwIT09ZS5sZW5ndGgpe3ZhciBjO3ZhciBkPVNrLnN5c21vZHVsZXMubXAkc3Vic2NyaXB0KG5ldyBTay5idWlsdGluLnN0cigoaHx8XCJcIikrKGgmJmE/XCIuXCI6XCJcIikrYSkpO2ZvcihiPTA7YjxlLmxlbmd0aDtiKyspe3ZhciBmPWVbYl07XCIqXCIhPWYmJnZvaWQgMD09PWQudHAkZ2V0YXR0cihuZXcgU2suYnVpbHRpbi5zdHIoZikpJiYoYz1Tay5taXNjZXZhbC5jaGFpbihjLFNrLmltcG9ydE1vZHVsZUludGVybmFsXy5iaW5kKG51bGwsZix2b2lkIDAsdm9pZCAwLHZvaWQgMCxkLCEwLCEwKSkpfXJldHVybiBTay5taXNjZXZhbC5jaGFpbihjLGZ1bmN0aW9uKCl7U2suYXNzZXJ0cy5hc3NlcnQoZCk7cmV0dXJuIGR9KX1yZXR1cm4gYn0sXG5mdW5jdGlvbihhKXtsIT09U2suZ2xvYmFscyYmKFNrLmdsb2JhbHM9bCk7cmV0dXJuIGF9KX07U2suaW1wb3J0U3Rhcj1mdW5jdGlvbihhLGMsYil7aWYoYj1hLnRwJGdldGF0dHIobmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hbGxfX1wiKSkpZm9yKGxldCBlPVNrLmFic3RyLml0ZXIoYiksZj1lLnRwJGl0ZXJuZXh0KCk7dm9pZCAwIT09ZjtmPWUudHAkaXRlcm5leHQoKSljW2Yudl09U2suYWJzdHIuZ2F0dHIoYSxmKTtlbHNle2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYS4kZCk7Zm9yKGxldCBlIGluIGIpXCJfXCIhPWJbZV0uY2hhckF0KDApJiYoY1tiW2VdXT1hLiRkW2JbZV1dKX19O1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydE1haW5cIixTay5pbXBvcnRNYWluKTtTay5leHBvcnRTeW1ib2woXCJTay5pbXBvcnRNYWluV2l0aEJvZHlcIixTay5pbXBvcnRNYWluV2l0aEJvZHkpO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keVwiLFNrLmltcG9ydEJ1aWx0aW5XaXRoQm9keSk7XG5Tay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluLl9faW1wb3J0X19cIixTay5idWlsdGluLl9faW1wb3J0X18pO1NrLmV4cG9ydFN5bWJvbChcIlNrLmltcG9ydFN0YXJcIixTay5pbXBvcnRTdGFyKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnRpbVNvcnQ9ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3Q9bmV3IFNrLmJ1aWx0aW4ubGlzdChhLnYpO3RoaXMuTUlOX0dBTExPUD03O3RoaXMubGlzdGxlbmd0aD1jP2M6YS5zcSRsZW5ndGgoKX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5sdD1mdW5jdGlvbihhLGMpe3JldHVybiBTay5taXNjZXZhbC5yaWNoQ29tcGFyZUJvb2woYSxjLFwiTHRcIil9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubGU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4hdGhpcy5sdChjLGEpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLmJpbmFyeV9zb3J0PVxuZnVuY3Rpb24oYSxjKXt2YXIgYjtmb3IoYj1hLmJhc2UrYztiPGEuYmFzZSthLmxlbjtiKyspe3ZhciBlPWEuYmFzZTt2YXIgZj1iO2ZvcihjPWEuZ2V0aXRlbShmKTtlPGY7KXt2YXIgbD1lKyhmLWU+PjEpO3RoaXMubHQoYyxhLmdldGl0ZW0obCkpP2Y9bDplPWwrMX1Tay5hc3NlcnRzLmFzc2VydChlPT09Zik7Zm9yKGw9YjtsPmU7bC0tKWEuc2V0aXRlbShsLGEuZ2V0aXRlbShsLTEpKTthLnNldGl0ZW0oZSxjKX19O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUuY291bnRfcnVuPWZ1bmN0aW9uKGEpe3ZhciBjO2lmKDE+PWEubGVuKXt2YXIgYj1hLmxlbjt2YXIgZT0hMX1lbHNlIGlmKGI9Mix0aGlzLmx0KGEuZ2V0aXRlbShhLmJhc2UrMSksYS5nZXRpdGVtKGEuYmFzZSkpKWZvcihlPSEwLGM9YS5iYXNlKzI7YzxhLmJhc2UrYS5sZW47YysrKWlmKHRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKSliKys7ZWxzZSBicmVhaztlbHNlIGZvcihlPSExLGM9YS5iYXNlK1xuMjtjPGEuYmFzZSthLmxlbiYmIXRoaXMubHQoYS5nZXRpdGVtKGMpLGEuZ2V0aXRlbShjLTEpKTtjKyspYisrO3JldHVybntydW46bmV3IFNrLmJ1aWx0aW4ubGlzdFNsaWNlKGEubGlzdCxhLmJhc2UsYiksZGVzY2VuZGluZzplfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKCl7dmFyIGEsYz1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LDAsdGhpcy5saXN0bGVuZ3RoKTtpZighKDI+Yy5sZW4pKXt0aGlzLm1lcmdlX2luaXQoKTtmb3IoYT10aGlzLm1lcmdlX2NvbXB1dGVfbWlucnVuKGMubGVuKTswPGMubGVuOyl7dmFyIGI9dGhpcy5jb3VudF9ydW4oYyk7Yi5kZXNjZW5kaW5nJiZiLnJ1bi5yZXZlcnNlKCk7aWYoYi5ydW4ubGVuPGEpe3ZhciBlPWIucnVuLmxlbjtiLnJ1bi5sZW49YTxjLmxlbj9hOmMubGVuO3RoaXMuYmluYXJ5X3NvcnQoYi5ydW4sZSl9Yy5hZHZhbmNlKGIucnVuLmxlbik7dGhpcy5wZW5kaW5nLnB1c2goYi5ydW4pO1xudGhpcy5tZXJnZV9jb2xsYXBzZSgpfVNrLmFzc2VydHMuYXNzZXJ0KGMuYmFzZT09dGhpcy5saXN0bGVuZ3RoKTt0aGlzLm1lcmdlX2ZvcmNlX2NvbGxhcHNlKCk7U2suYXNzZXJ0cy5hc3NlcnQoMT09dGhpcy5wZW5kaW5nLmxlbmd0aCk7U2suYXNzZXJ0cy5hc3NlcnQoMD09PXRoaXMucGVuZGluZ1swXS5iYXNlKTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLnBlbmRpbmdbMF0ubGVuPT10aGlzLmxpc3RsZW5ndGgpfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5nYWxsb3A9ZnVuY3Rpb24oYSxjLGIsZSl7dmFyIGY7U2suYXNzZXJ0cy5hc3NlcnQoMDw9YiYmYjxjLmxlbik7dmFyIGw9dGhpcztlPWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbC5sZShhLGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBsLmx0KGEsYil9O3ZhciBoPWMuYmFzZStiO3ZhciBkPTA7dmFyIGc9MTtpZihlKGMuZ2V0aXRlbShoKSxhKSl7Zm9yKGY9Yy5sZW4tYjtnPGY7KWlmKGUoYy5nZXRpdGVtKGgrZyksXG5hKSl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19ZWxzZSBicmVhaztnPmYmJihnPWYpO2QrPWI7Zys9Yn1lbHNle2ZvcihmPWIrMTtnPGYmJiFlKGMuZ2V0aXRlbShoLWcpLGEpOyl7ZD1nO3RyeXtnPShnPDwxKSsxfWNhdGNoKG4pe2c9Zn19Zz5mJiYoZz1mKTtoPWItZDtkPWItZztnPWh9U2suYXNzZXJ0cy5hc3NlcnQoLTE8PWQ8Zzw9Yy5sZW4pO2ZvcihkKz0xO2Q8ZzspYj1kKyhnLWQ+PjEpLGUoYy5nZXRpdGVtKGMuYmFzZStiKSxhKT9kPWIrMTpnPWI7U2suYXNzZXJ0cy5hc3NlcnQoZD09Zyk7cmV0dXJuIGd9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfaW5pdD1mdW5jdGlvbigpe3RoaXMubWluX2dhbGxvcD10aGlzLk1JTl9HQUxMT1A7dGhpcy5wZW5kaW5nPVtdfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2xvPWZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZStcbmEubGVuPT1jLmJhc2UpO3ZhciBsPXRoaXMubWluX2dhbGxvcDt2YXIgaD1hLmJhc2U7YT1hLmNvcHlpdGVtcygpO3RyeXtpZih0aGlzLnNldGl0ZW0oaCxjLnBvcGxlZnQoKSksaCsrLDEhPWEubGVuJiYwIT09Yy5sZW4pZm9yKDs7KXtmb3IoZT1iPTA7OylpZih0aGlzLmx0KGMuZ2V0aXRlbShjLmJhc2UpLGEuZ2V0aXRlbShhLmJhc2UpKSl7dGhpcy5zZXRpdGVtKGgsYy5wb3BsZWZ0KCkpO2grKztpZigwPT09Yy5sZW4pcmV0dXJuO2UrKztiPTA7aWYoZT49bClicmVha31lbHNle3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31mb3IobCs9MTs7KXt0aGlzLm1pbl9nYWxsb3A9bC09MTxsO2I9dGhpcy5nYWxsb3AoYy5nZXRpdGVtKGMuYmFzZSksYSwwLCEwKTtmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYjtmKyspdGhpcy5zZXRpdGVtKGgsYS5nZXRpdGVtKGYpKSxoKys7YS5hZHZhbmNlKGIpO2lmKDE+PVxuYS5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGMucG9wbGVmdCgpKTtoKys7aWYoMD09PWMubGVuKXJldHVybjtlPXRoaXMuZ2FsbG9wKGEuZ2V0aXRlbShhLmJhc2UpLGMsMCwhMSk7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2U7ZisrKXRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSksaCsrO2MuYWR2YW5jZShlKTtpZigwPT09Yy5sZW4pcmV0dXJuO3RoaXMuc2V0aXRlbShoLGEucG9wbGVmdCgpKTtoKys7aWYoMT09YS5sZW4pcmV0dXJuO2lmKGI8dGhpcy5NSU5fR0FMTE9QJiZlPHRoaXMuTUlOX0dBTExPUClicmVhaztsKys7dGhpcy5taW5fZ2FsbG9wPWx9fX1maW5hbGx5e1NrLmFzc2VydHMuYXNzZXJ0KDA8PWEubGVuJiYwPD1jLmxlbik7Zm9yKGY9Yy5iYXNlO2Y8Yy5iYXNlK2MubGVuO2YrKyl0aGlzLnNldGl0ZW0oaCxjLmdldGl0ZW0oZikpLGgrKztmb3IoZj1hLmJhc2U7ZjxhLmJhc2UrYS5sZW47ZisrKXRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSksaCsrfX07U2suYnVpbHRpbi50aW1Tb3J0LnByb3RvdHlwZS5tZXJnZV9oaT1cbmZ1bmN0aW9uKGEsYyl7dmFyIGIsZSxmO1NrLmFzc2VydHMuYXNzZXJ0KDA8YS5sZW4mJjA8Yy5sZW4mJmEuYmFzZSthLmxlbj09Yy5iYXNlKTt2YXIgbD10aGlzLm1pbl9nYWxsb3A7dmFyIGg9Yy5iYXNlK2MubGVuO2M9Yy5jb3B5aXRlbXMoKTt0cnl7aWYoaC0tLHRoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSksMCE9PWEubGVuJiYxIT1jLmxlbilmb3IoOzspe2ZvcihlPWI9MDs7KXt2YXIgZD1hLmdldGl0ZW0oYS5iYXNlK2EubGVuLTEpO3ZhciBnPWMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSk7aWYodGhpcy5sdChnLGQpKXtoLS07dGhpcy5zZXRpdGVtKGgsZCk7YS5sZW4tLTtpZigwPT09YS5sZW4pcmV0dXJuO2IrKztlPTA7aWYoYj49bClicmVha31lbHNle2gtLTt0aGlzLnNldGl0ZW0oaCxnKTtjLmxlbi0tO2lmKDE9PWMubGVuKXJldHVybjtlKys7Yj0wO2lmKGU+PWwpYnJlYWt9fWZvcihsKz0xOzspe3RoaXMubWluX2dhbGxvcD1sLT0xPGw7Zz1jLmdldGl0ZW0oYy5iYXNlK1xuYy5sZW4tMSk7dmFyIG09dGhpcy5nYWxsb3AoZyxhLGEubGVuLTEsITApO2I9YS5sZW4tbTtmb3IoZj1hLmJhc2UrYS5sZW4tMTtmPmEuYmFzZSttLTE7Zi0tKWgtLSx0aGlzLnNldGl0ZW0oaCxhLmdldGl0ZW0oZikpO2EubGVuLT1iO2lmKDA9PT1hLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGMucG9wcmlnaHQoKSk7aWYoMT09Yy5sZW4pcmV0dXJuO2Q9YS5nZXRpdGVtKGEuYmFzZSthLmxlbi0xKTttPXRoaXMuZ2FsbG9wKGQsYyxjLmxlbi0xLCExKTtlPWMubGVuLW07Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UrbS0xO2YtLSloLS0sdGhpcy5zZXRpdGVtKGgsYy5nZXRpdGVtKGYpKTtjLmxlbi09ZTtpZigxPj1jLmxlbilyZXR1cm47aC0tO3RoaXMuc2V0aXRlbShoLGEucG9wcmlnaHQoKSk7aWYoMD09PWEubGVuKXJldHVybjtpZihiPHRoaXMuTUlOX0dBTExPUCYmZTx0aGlzLk1JTl9HQUxMT1ApYnJlYWs7bCsrO3RoaXMubWluX2dhbGxvcD1sfX19ZmluYWxseXtTay5hc3NlcnRzLmFzc2VydCgwPD1cbmEubGVuJiYwPD1jLmxlbik7Zm9yKGY9YS5iYXNlK2EubGVuLTE7Zj5hLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGEuZ2V0aXRlbShmKSk7Zm9yKGY9Yy5iYXNlK2MubGVuLTE7Zj5jLmJhc2UtMTtmLS0paC0tLHRoaXMuc2V0aXRlbShoLGMuZ2V0aXRlbShmKSl9fTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2F0PWZ1bmN0aW9uKGEpezA+YSYmKGE9dGhpcy5wZW5kaW5nLmxlbmd0aCthKTt2YXIgYz10aGlzLnBlbmRpbmdbYV07dmFyIGI9dGhpcy5wZW5kaW5nW2ErMV07U2suYXNzZXJ0cy5hc3NlcnQoMDxjLmxlbiYmMDxiLmxlbik7U2suYXNzZXJ0cy5hc3NlcnQoYy5iYXNlK2MubGVuPT1iLmJhc2UpO3RoaXMucGVuZGluZ1thXT1uZXcgU2suYnVpbHRpbi5saXN0U2xpY2UodGhpcy5saXN0LGMuYmFzZSxjLmxlbitiLmxlbik7dGhpcy5wZW5kaW5nLnNwbGljZShhKzEsMSk7YT10aGlzLmdhbGxvcChiLmdldGl0ZW0oYi5iYXNlKSxjLDAsITApO2MuYWR2YW5jZShhKTtcbjAhPT1jLmxlbiYmKGIubGVuPXRoaXMuZ2FsbG9wKGMuZ2V0aXRlbShjLmJhc2UrYy5sZW4tMSksYixiLmxlbi0xLCExKSwwIT09Yi5sZW4mJihjLmxlbjw9Yi5sZW4/dGhpcy5tZXJnZV9sbyhjLGIpOnRoaXMubWVyZ2VfaGkoYyxiKSkpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGVuZGluZzsxPGEubGVuZ3RoOylpZigzPD1hLmxlbmd0aCYmYVthLmxlbmd0aC0zXS5sZW48PWFbYS5sZW5ndGgtMl0ubGVuK2FbYS5sZW5ndGgtMV0ubGVuKWFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgaWYoYVthLmxlbmd0aC0yXS5sZW48PWFbYS5sZW5ndGgtMV0ubGVuKXRoaXMubWVyZ2VfYXQoLTIpO2Vsc2UgYnJlYWt9O1NrLmJ1aWx0aW4udGltU29ydC5wcm90b3R5cGUubWVyZ2VfZm9yY2VfY29sbGFwc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGE9XG50aGlzLnBlbmRpbmc7MTxhLmxlbmd0aDspMzw9YS5sZW5ndGgmJmFbYS5sZW5ndGgtM10ubGVuPGFbYS5sZW5ndGgtMV0ubGVuP3RoaXMubWVyZ2VfYXQoLTMpOnRoaXMubWVyZ2VfYXQoLTIpfTtTay5idWlsdGluLnRpbVNvcnQucHJvdG90eXBlLm1lcmdlX2NvbXB1dGVfbWlucnVuPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzY0PD1hOyljfD1hJjEsYT4+PTE7cmV0dXJuIGErY307U2suYnVpbHRpbi5saXN0U2xpY2U9ZnVuY3Rpb24oYSxjLGIpe3RoaXMubGlzdD1hO3RoaXMuYmFzZT1jO3RoaXMubGVuPWJ9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5jb3B5aXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJhc2UsYz10aGlzLmJhc2UrdGhpcy5sZW47U2suYXNzZXJ0cy5hc3NlcnQoMDw9YTw9Yyk7cmV0dXJuIG5ldyBTay5idWlsdGluLmxpc3RTbGljZShuZXcgU2suYnVpbHRpbi5saXN0KHRoaXMubGlzdC52LnNsaWNlKGEsYykpLDAsdGhpcy5sZW4pfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUuYWR2YW5jZT1cbmZ1bmN0aW9uKGEpe3RoaXMuYmFzZSs9YTt0aGlzLmxlbi09YTtTay5hc3NlcnRzLmFzc2VydCh0aGlzLmJhc2U8PXRoaXMubGlzdC5zcSRsZW5ndGgoKSl9O1NrLmJ1aWx0aW4ubGlzdFNsaWNlLnByb3RvdHlwZS5nZXRpdGVtPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxpc3QudlthXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnNldGl0ZW09ZnVuY3Rpb24oYSxjKXt0aGlzLmxpc3QudlthXT1jfTtTay5idWlsdGluLmxpc3RTbGljZS5wcm90b3R5cGUucG9wbGVmdD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGlzdC52W3RoaXMuYmFzZV07dGhpcy5iYXNlKys7dGhpcy5sZW4tLTtyZXR1cm4gYX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnBvcHJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5sZW4tLTtyZXR1cm4gdGhpcy5saXN0LnZbdGhpcy5iYXNlK3RoaXMubGVuXX07U2suYnVpbHRpbi5saXN0U2xpY2UucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGEsXG5jLGI9dGhpcy5saXN0LGU9dGhpcy5iYXNlLGY9ZSt0aGlzLmxlbi0xO2U8ZjspYT1iLnZbZl0sYz1iLnZbZV0sYi52W2VdPWEsYi52W2ZdPWMsZSsrLGYtLX07U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi5saXN0U2xpY2VcIixTay5idWlsdGluLmxpc3RTbGljZSk7U2suZXhwb3J0U3ltYm9sKFwiU2suYnVpbHRpbi50aW1Tb3J0XCIsU2suYnVpbHRpbi50aW1Tb3J0KX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN1cGVyXz1Tay5hYnN0ci5idWlsZE5hdGl2ZUNsYXNzKFwic3VwZXJcIix7Y29uc3RydWN0b3I6ZnVuY3Rpb24oYSxjKXtTay5hc3NlcnRzLmFzc2VydCh0aGlzIGluc3RhbmNlb2YgU2suYnVpbHRpbi5zdXBlcl8sXCJiYWQgY2FsbCB0byBzdXBlciwgdXNlICduZXcnXCIpO3RoaXMudHlwZT1hO3RoaXMub2JqPWM7aWYodm9pZCAwIT09YSYmIVNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhhKSl0aHJvdyBuZXcgU2suYnVpbHRpbi5UeXBlRXJyb3IoXCJtdXN0IGJlIHR5cGUsIG5vdCBcIitcblNrLmFic3RyLnR5cGVOYW1lKGEpKTt0aGlzLm9ial90eXBlPXZvaWQgMCE9PXRoaXMub2JqP3RoaXMuJHN1cGVyY2hlY2soYSx0aGlzLm9iaik6bnVsbH0sc2xvdHM6e3RwJGRvYzpcInN1cGVyKCkgLT4gc2FtZSBhcyBzdXBlcihfX2NsYXNzX18sIDxmaXJzdCBhcmd1bWVudD4pXFxuc3VwZXIodHlwZSkgLT4gdW5ib3VuZCBzdXBlciBvYmplY3RcXG5zdXBlcih0eXBlLCBvYmopIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNpbnN0YW5jZShvYmosIHR5cGUpXFxuc3VwZXIodHlwZSwgdHlwZTIpIC0+IGJvdW5kIHN1cGVyIG9iamVjdDsgcmVxdWlyZXMgaXNzdWJjbGFzcyh0eXBlMiwgdHlwZSlcXG5UeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XFxuY2xhc3MgQyhCKTpcXG4gICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcXG4gICAgICAgIHN1cGVyKCkubWV0aChhcmcpXFxuVGhpcyB3b3JrcyBmb3IgY2xhc3MgbWV0aG9kcyB0b286XFxuY2xhc3MgQyhCKTpcXG4gICAgQGNsYXNzbWV0aG9kXFxuICAgIGRlZiBjbWV0aChjbHMsIGFyZyk6XFxuICAgICAgICBzdXBlcigpLmNtZXRoKGFyZylcXG5cIixcbnRwJG5ldzpTay5nZW5lcmljLm5ldyx0cCRpbml0KGEsYyl7U2suYWJzdHIuY2hlY2tOb0t3YXJncyhcInN1cGVyXCIsYyk7U2suYWJzdHIuY2hlY2tBcmdzTGVuKFwic3VwZXJcIixhLDEsMik7Yz1hWzBdO2E9YVsxXTtpZighU2suYnVpbHRpbi5jaGVja0NsYXNzKGMpKXRocm93IG5ldyBTay5idWlsdGluLlR5cGVFcnJvcihcIm11c3QgYmUgdHlwZSwgbm90IFwiK1NrLmFic3RyLnR5cGVOYW1lKGMpKTt0aGlzLm9iaj1hO3RoaXMudHlwZT1jO251bGwhPXRoaXMub2JqJiYodGhpcy5vYmpfdHlwZT10aGlzLiRzdXBlcmNoZWNrKGMsdGhpcy5vYmopKX0sJHIoKXtyZXR1cm4gdGhpcy5vYmo/bmV3IFNrLmJ1aWx0aW4uc3RyKFwiPHN1cGVyOiA8Y2xhc3MgJ1wiK3RoaXMudHlwZS5wcm90b3R5cGUudHAkbmFtZStcIic+LCA8XCIrU2suYWJzdHIudHlwZU5hbWUodGhpcy5vYmopK1wiIG9iamVjdD4+XCIpOm5ldyBTay5idWlsdGluLnN0cihcIjxzdXBlcjogPGNsYXNzICdcIit0aGlzLnR5cGUucHJvdG90eXBlLnRwJG5hbWUrXG5cIic+LCBOVUxMPlwiKX0sdHAkZ2V0YXR0cihhLGMpe2xldCBiPXRoaXMub2JqX3R5cGU7aWYobnVsbD09YilyZXR1cm4gU2suZ2VuZXJpYy5nZXRBdHRyLmNhbGwodGhpcyxhLGMpO3ZhciBlPWIucHJvdG90eXBlLnRwJG1ybztjb25zdCBmPWUubGVuZ3RoO2lmKGE9PT1Tay5idWlsdGluLnN0ci4kY2xhc3MpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTtsZXQgbDtmb3IobD0wO2wrMTxmJiZ0aGlzLnR5cGUhPT1lW2xdO2wrKyk7bCsrO2lmKGw+PWYpcmV0dXJuIFNrLmdlbmVyaWMuZ2V0QXR0ci5jYWxsKHRoaXMsYSxjKTthPWEuJG1hbmdsZWQ7bGV0IGg7Zm9yKDtsPGY7KXtjPWVbbF0ucHJvdG90eXBlO2MuaGFzT3duUHJvcGVydHkoYSkmJihoPWNbYV0pO2lmKHZvaWQgMCE9PWgpcmV0dXJuIGU9aC50cCRkZXNjcl9nZXQsdm9pZCAwIT09ZSYmKGg9ZS5jYWxsKGgsdGhpcy5vYmo9PT1iP251bGw6dGhpcy5vYmosYikpLGg7bCsrfX0sdHAkZGVzY3JfZ2V0KGEsXG5jKXtpZihudWxsPT09YXx8bnVsbCE9dGhpcy5vYmopcmV0dXJuIHRoaXM7aWYodGhpcy5vYiR0eXBlIT09U2suYnVpbHRpbi5zdXBlcl8pcmV0dXJuIFNrLm1pc2NldmFsLmNhbGxzaW1PclN1c3BlbmRBcnJheSh0aGlzLm9iJHR5cGUsW3RoaXMudHlwZSxhXSk7e2M9dGhpcy4kc3VwZXJjaGVjayh0aGlzLnR5cGUsYSk7Y29uc3QgYj1uZXcgU2suYnVpbHRpbi5zdXBlcl87Yi50eXBlPXRoaXMudHlwZTtiLm9iaj1hO2Iub2JqX3R5cGU9YztyZXR1cm4gYn19fSxnZXRzZXRzOntfX3RoaXNjbGFzc19fOnskZ2V0KCl7cmV0dXJuIHRoaXMudHlwZX0sJGRvYzpcInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpXCJ9LF9fc2VsZl9fOnskZ2V0KCl7cmV0dXJuIHRoaXMub2JqfHxTay5idWlsdGluLm5vbmUubm9uZSR9LCRkb2M6XCJ0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn0sX19zZWxmX2NsYXNzX186eyRnZXQoKXtyZXR1cm4gdGhpcy5vYmpfdHlwZXx8U2suYnVpbHRpbi5ub25lLm5vbmUkfSxcbiRkb2M6XCJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmVcIn19LHByb3RvOnskc3VwZXJjaGVjayhhLGMpe2lmKFNrLmJ1aWx0aW4uY2hlY2tDbGFzcyhjKSYmYy4kaXNTdWJUeXBlKGEpKXJldHVybiBjO2lmKGMub2IkdHlwZS4kaXNTdWJUeXBlKGEpKXJldHVybiBjLm9iJHR5cGU7e2NvbnN0IGI9Yy50cCRnZXRhdHRyKFNrLmJ1aWx0aW4uc3RyLiRjbGFzcyk7aWYodm9pZCAwIT09YiYmYiE9PWMub2IkdHlwZSYmU2suYnVpbHRpbi5jaGVja0NsYXNzKGIpJiZiLiRpc1N1YlR5cGUoYSkpcmV0dXJuIGJ9dGhyb3cgbmV3IFNrLmJ1aWx0aW4uVHlwZUVycm9yKFwic3VwZXIodHlwZSwgb2JqKTogb2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlXCIpO319fSl9LGZ1bmN0aW9uKG0scSl7U2suYnVpbHRpbnM9e3JvdW5kOm51bGwsbGVuOm51bGwsbWluOm51bGwsbWF4Om51bGwsc3VtOm51bGwsYWJzOm51bGwsZmFiczpudWxsLFxub3JkOm51bGwsY2hyOm51bGwsaGV4Om51bGwsb2N0Om51bGwsYmluOm51bGwsZGlyOm51bGwscmVwcjpudWxsLG9wZW46bnVsbCxpc2luc3RhbmNlOm51bGwsaGFzaDpudWxsLGdldGF0dHI6bnVsbCxoYXNhdHRyOm51bGwsaWQ6bnVsbCxyZWR1Y2U6bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLnJlZHVjZSksc29ydGVkOm51bGwsYW55Om51bGwsYWxsOm51bGwsZW51bWVyYXRlOlNrLmJ1aWx0aW4uZW51bWVyYXRlLGZpbHRlcjpTay5idWlsdGluLmZpbHRlcl8sbWFwOlNrLmJ1aWx0aW4ubWFwXyxyYW5nZTpTay5idWlsdGluLnJhbmdlXyxyZXZlcnNlZDpTay5idWlsdGluLnJldmVyc2VkLHppcDpTay5idWlsdGluLnppcF8sQmFzZUV4Y2VwdGlvbjpTay5idWlsdGluLkJhc2VFeGNlcHRpb24sQXR0cmlidXRlRXJyb3I6U2suYnVpbHRpbi5BdHRyaWJ1dGVFcnJvcixWYWx1ZUVycm9yOlNrLmJ1aWx0aW4uVmFsdWVFcnJvcixFeGNlcHRpb246U2suYnVpbHRpbi5FeGNlcHRpb24sXG5aZXJvRGl2aXNpb25FcnJvcjpTay5idWlsdGluLlplcm9EaXZpc2lvbkVycm9yLEFzc2VydGlvbkVycm9yOlNrLmJ1aWx0aW4uQXNzZXJ0aW9uRXJyb3IsSW1wb3J0RXJyb3I6U2suYnVpbHRpbi5JbXBvcnRFcnJvcixJbmRlbnRhdGlvbkVycm9yOlNrLmJ1aWx0aW4uSW5kZW50YXRpb25FcnJvcixJbmRleEVycm9yOlNrLmJ1aWx0aW4uSW5kZXhFcnJvcixMb29rdXBFcnJvcjpTay5idWlsdGluLkxvb2t1cEVycm9yLEtleUVycm9yOlNrLmJ1aWx0aW4uS2V5RXJyb3IsVHlwZUVycm9yOlNrLmJ1aWx0aW4uVHlwZUVycm9yLFVuaWNvZGVEZWNvZGVFcnJvcjpTay5idWlsdGluLlVuaWNvZGVEZWNvZGVFcnJvcixVbmljb2RlRW5jb2RlRXJyb3I6U2suYnVpbHRpbi5Vbmljb2RlRW5jb2RlRXJyb3IsTmFtZUVycm9yOlNrLmJ1aWx0aW4uTmFtZUVycm9yLElPRXJyb3I6U2suYnVpbHRpbi5JT0Vycm9yLE5vdEltcGxlbWVudGVkRXJyb3I6U2suYnVpbHRpbi5Ob3RJbXBsZW1lbnRlZEVycm9yLFxuU3lzdGVtRXhpdDpTay5idWlsdGluLlN5c3RlbUV4aXQsT3ZlcmZsb3dFcnJvcjpTay5idWlsdGluLk92ZXJmbG93RXJyb3IsT3BlcmF0aW9uRXJyb3I6U2suYnVpbHRpbi5PcGVyYXRpb25FcnJvcixOZWdhdGl2ZVBvd2VyRXJyb3I6U2suYnVpbHRpbi5OZWdhdGl2ZVBvd2VyRXJyb3IsUnVudGltZUVycm9yOlNrLmJ1aWx0aW4uUnVudGltZUVycm9yLFJlY3Vyc2lvbkVycm9yOlNrLmJ1aWx0aW4uUmVjdXJzaW9uRXJyb3IsU3RvcEl0ZXJhdGlvbjpTay5idWlsdGluLlN0b3BJdGVyYXRpb24sU3ludGF4RXJyb3I6U2suYnVpbHRpbi5TeW50YXhFcnJvcixTeXN0ZW1FcnJvcjpTay5idWlsdGluLlN5c3RlbUVycm9yLGZsb2F0XyRydyQ6U2suYnVpbHRpbi5mbG9hdF8saW50XyRydyQ6U2suYnVpbHRpbi5pbnRfLGJvb2w6U2suYnVpbHRpbi5ib29sLGNvbXBsZXg6U2suYnVpbHRpbi5jb21wbGV4LGRpY3Q6U2suYnVpbHRpbi5kaWN0LGZpbGU6U2suYnVpbHRpbi5maWxlLGZyb3plbnNldDpTay5idWlsdGluLmZyb3plbnNldCxcblwiZnVuY3Rpb25cIjpTay5idWlsdGluLmZ1bmMsZ2VuZXJhdG9yOlNrLmJ1aWx0aW4uZ2VuZXJhdG9yLGxpc3Q6U2suYnVpbHRpbi5saXN0LGxvbmdfJHJ3JDpTay5idWlsdGluLmxuZyxtZXRob2Q6U2suYnVpbHRpbi5tZXRob2Qsb2JqZWN0OlNrLmJ1aWx0aW4ub2JqZWN0LHNsaWNlOlNrLmJ1aWx0aW4uc2xpY2Usc3RyOlNrLmJ1aWx0aW4uc3RyLHNldDpTay5idWlsdGluLnNldCx0dXBsZTpTay5idWlsdGluLnR1cGxlLHR5cGU6U2suYnVpbHRpbi50eXBlLGlucHV0Om51bGwscmF3X2lucHV0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5yYXdfaW5wdXQpLHNldGF0dHI6bnVsbCxqc2V2YWw6U2suYnVpbHRpbi5qc2V2YWwsanNtaWxsaXM6U2suYnVpbHRpbi5qc21pbGxpcyxxdWl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxleGl0Om5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5xdWl0KSxwcmludDpudWxsLGRpdm1vZDpudWxsLGZvcm1hdDpudWxsLFxuZ2xvYmFsczpudWxsLGlzc3ViY2xhc3M6bnVsbCxpdGVyOm51bGwsZXhlY2ZpbGU6U2suYnVpbHRpbi5leGVjZmlsZSxoZWxwOlNrLmJ1aWx0aW4uaGVscCxtZW1vcnl2aWV3OlNrLmJ1aWx0aW4ubWVtb3J5dmlldyxyZWxvYWQ6U2suYnVpbHRpbi5yZWxvYWQsc3VwZXJfJHJ3JDpTay5idWlsdGluLnN1cGVyXyx1bmljaHI6U2suYnVpbHRpbi51bmljaHIsdmFyczpTay5idWlsdGluLnZhcnMsYXBwbHlfJHJ3JDpTay5idWlsdGluLmFwcGx5XyxidWZmZXI6U2suYnVpbHRpbi5idWZmZXIsY29lcmNlOlNrLmJ1aWx0aW4uY29lcmNlLGludGVybjpTay5idWlsdGluLmludGVybixwcm9wZXJ0eTpTay5idWlsdGluLnByb3BlcnR5LGNsYXNzbWV0aG9kOlNrLmJ1aWx0aW4uY2xhc3NtZXRob2Qsc3RhdGljbWV0aG9kOlNrLmJ1aWx0aW4uc3RhdGljbWV0aG9kfTtTay5hYnN0ci5zZXRVcE1vZHVsZU1ldGhvZHMoXCJidWlsdGluc1wiLFNrLmJ1aWx0aW5zLHtfX2ltcG9ydF9fOnskbWV0aDpTay5idWlsdGluLl9faW1wb3J0X18sXG4kZmxhZ3M6e05hbWVkQXJnczpbXCJuYW1lXCIsXCJnbG9iYWxzXCIsXCJsb2NhbHNcIixcImZyb21saXN0XCIsXCJsZXZlbFwiXX0sJHRleHRzaWc6bnVsbCwkZG9jOlwiX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lLCBmcm9tbGlzdD0oKSwgbGV2ZWw9MCkgLT4gbW9kdWxlXFxuXFxuSW1wb3J0IGEgbW9kdWxlLiBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIHVzZSBieSB0aGUgUHl0aG9uXFxuaW50ZXJwcmV0ZXIgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2UsIGl0IGlzIGJldHRlciB0byB1c2VcXG5pbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIHRvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLlxcblxcblRoZSBnbG9iYWxzIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQ7XFxudGhleSBhcmUgbm90IG1vZGlmaWVkLiAgVGhlIGxvY2FscyBhcmd1bWVudCBpcyB1bnVzZWQuICBUaGUgZnJvbWxpc3RcXG5zaG91bGQgYmUgYSBsaXN0IG9mIG5hbWVzIHRvIGVtdWxhdGUgYGBmcm9tIG5hbWUgaW1wb3J0IC4uLicnLCBvciBhblxcbmVtcHR5IGxpc3QgdG8gZW11bGF0ZSBgYGltcG9ydCBuYW1lJycuXFxuV2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2UsIG5vdGUgdGhhdCBfX2ltcG9ydF9fKCdBLkInLCAuLi4pXFxucmV0dXJucyBwYWNrYWdlIEEgd2hlbiBmcm9tbGlzdCBpcyBlbXB0eSwgYnV0IGl0cyBzdWJtb2R1bGUgQiB3aGVuXFxuZnJvbWxpc3QgaXMgbm90IGVtcHR5LiAgVGhlIGxldmVsIGFyZ3VtZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG9cXG5wZXJmb3JtIGFic29sdXRlIG9yIHJlbGF0aXZlIGltcG9ydHM6IDAgaXMgYWJzb2x1dGUsIHdoaWxlIGEgcG9zaXRpdmUgbnVtYmVyXFxuaXMgdGhlIG51bWJlciBvZiBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cIn0sXG5hYnM6eyRtZXRoOlNrLmJ1aWx0aW4uYWJzLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC5cIn0sYWxsOnskbWV0aDpTay5idWlsdGluLmFsbCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8pXCIsJGRvYzpcIlJldHVybiBUcnVlIGlmIGJvb2woeCkgaXMgVHJ1ZSBmb3IgYWxsIHZhbHVlcyB4IGluIHRoZSBpdGVyYWJsZS5cXG5cXG5JZiB0aGUgaXRlcmFibGUgaXMgZW1wdHksIHJldHVybiBUcnVlLlwifSxhbnk6eyRtZXRoOlNrLmJ1aWx0aW4uYW55LCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLylcIiwkZG9jOlwiUmV0dXJuIFRydWUgaWYgYm9vbCh4KSBpcyBUcnVlIGZvciBhbnkgeCBpbiB0aGUgaXRlcmFibGUuXFxuXFxuSWYgdGhlIGl0ZXJhYmxlIGlzIGVtcHR5LCByZXR1cm4gRmFsc2UuXCJ9LFxuYXNjaWk6eyRtZXRoOlNrLmJ1aWx0aW4uYXNjaWksJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIGFuIEFTQ0lJLW9ubHkgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LlxcblxcbkFzIHJlcHIoKSwgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYW5cXG5vYmplY3QsIGJ1dCBlc2NhcGUgdGhlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnlcXG5yZXByKCkgdXNpbmcgXFxcXFxcXFx4LCBcXFxcXFxcXHUgb3IgXFxcXFxcXFxVIGVzY2FwZXMuIFRoaXMgZ2VuZXJhdGVzIGEgc3RyaW5nIHNpbWlsYXJcXG50byB0aGF0IHJldHVybmVkIGJ5IHJlcHIoKSBpbiBQeXRob24gMi5cIn0sYmluOnskbWV0aDpTay5idWlsdGluLmJpbiwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLlxcblxcbiAgID4+PiBiaW4oMjc5NjIwMilcXG4gICAnMGIxMDEwMTAxMDEwMTAxMDEwMTAxMDEwJ1wifSxcbmNhbGxhYmxlOnskbWV0aDpTay5idWlsdGluLmNhbGxhYmxlLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgaXMgY2FsbGFibGUgKGkuZS4sIHNvbWUga2luZCBvZiBmdW5jdGlvbikuXFxuXFxuTm90ZSB0aGF0IGNsYXNzZXMgYXJlIGNhbGxhYmxlLCBhcyBhcmUgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBhXFxuX19jYWxsX18oKSBtZXRob2QuXCJ9LGNocjp7JG1ldGg6U2suYnVpbHRpbi5jaHIsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIGksIC8pXCIsJGRvYzpcIlJldHVybiBhIFVuaWNvZGUgc3RyaW5nIG9mIG9uZSBjaGFyYWN0ZXIgd2l0aCBvcmRpbmFsIGk7IDAgPD0gaSA8PSAweDEwZmZmZi5cIn0sZGVsYXR0cjp7JG1ldGg6U2suYnVpbHRpbi5kZWxhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCBuYW1lLCAvKVwiLFxuJGRvYzpcIkRlbGV0ZXMgdGhlIG5hbWVkIGF0dHJpYnV0ZSBmcm9tIHRoZSBnaXZlbiBvYmplY3QuXFxuXFxuZGVsYXR0cih4LCAneScpIGlzIGVxdWl2YWxlbnQgdG8gYGBkZWwgeC55JydcIn0sZGlyOnskbWV0aDpTay5idWlsdGluLmRpciwkZmxhZ3M6e01pbkFyZ3M6MCxNYXhBcmdzOjF9LCR0ZXh0c2lnOm51bGwsJGRvYzpcImRpcihbb2JqZWN0XSkgLT4gbGlzdCBvZiBzdHJpbmdzXFxuXFxuSWYgY2FsbGVkIHdpdGhvdXQgYW4gYXJndW1lbnQsIHJldHVybiB0aGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUuXFxuRWxzZSwgcmV0dXJuIGFuIGFscGhhYmV0aXplZCBsaXN0IG9mIG5hbWVzIGNvbXByaXNpbmcgKHNvbWUgb2YpIHRoZSBhdHRyaWJ1dGVzXFxub2YgdGhlIGdpdmVuIG9iamVjdCwgYW5kIG9mIGF0dHJpYnV0ZXMgcmVhY2hhYmxlIGZyb20gaXQuXFxuSWYgdGhlIG9iamVjdCBzdXBwbGllcyBhIG1ldGhvZCBuYW1lZCBfX2Rpcl9fLCBpdCB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZVxcbnRoZSBkZWZhdWx0IGRpcigpIGxvZ2ljIGlzIHVzZWQgYW5kIHJldHVybnM6XFxuICBmb3IgYSBtb2R1bGUgb2JqZWN0OiB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcy5cXG4gIGZvciBhIGNsYXNzIG9iamVjdDogIGl0cyBhdHRyaWJ1dGVzLCBhbmQgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXNcXG4gICAgb2YgaXRzIGJhc2VzLlxcbiAgZm9yIGFueSBvdGhlciBvYmplY3Q6IGl0cyBhdHRyaWJ1dGVzLCBpdHMgY2xhc3MncyBhdHRyaWJ1dGVzLCBhbmRcXG4gICAgcmVjdXJzaXZlbHkgdGhlIGF0dHJpYnV0ZXMgb2YgaXRzIGNsYXNzJ3MgYmFzZSBjbGFzc2VzLlwifSxcbmRpdm1vZDp7JG1ldGg6U2suYnVpbHRpbi5kaXZtb2QsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCB4LCB5LCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIHR1cGxlICh4Ly95LCB4JXkpLiAgSW52YXJpYW50OiBkaXYqeSArIG1vZCA9PSB4LlwifSxldmFsXyRydyQ6eyRuYW1lOlwiZXZhbFwiLCRtZXRoOlNrLmJ1aWx0aW4uZXZhbF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBzb3VyY2UsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIC8pXCIsJGRvYzpcIkV2YWx1YXRlIHRoZSBnaXZlbiBzb3VyY2UgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFscyBhbmQgbG9jYWxzLlxcblxcblRoZSBzb3VyY2UgbWF5IGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFB5dGhvbiBleHByZXNzaW9uXFxub3IgYSBjb2RlIG9iamVjdCBhcyByZXR1cm5lZCBieSBjb21waWxlKCkuXFxuVGhlIGdsb2JhbHMgbXVzdCBiZSBhIGRpY3Rpb25hcnkgYW5kIGxvY2FscyBjYW4gYmUgYW55IG1hcHBpbmcsXFxuZGVmYXVsdGluZyB0byB0aGUgY3VycmVudCBnbG9iYWxzIGFuZCBsb2NhbHMuXFxuSWYgb25seSBnbG9iYWxzIGlzIGdpdmVuLCBsb2NhbHMgZGVmYXVsdHMgdG8gaXQuXCJ9LFxuZm9ybWF0OnskbWV0aDpTay5idWlsdGluLmZvcm1hdCwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYz0nJywgLylcIiwkZG9jOlwiUmV0dXJuIHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpXFxuXFxuZm9ybWF0X3NwZWMgZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZy5cXG5TZWUgdGhlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Ugc2VjdGlvbiBvZiBoZWxwKCdGT1JNQVRUSU5HJykgZm9yXFxuZGV0YWlscy5cIn0sZ2V0YXR0cjp7JG1ldGg6U2suYnVpbHRpbi5nZXRhdHRyLCRmbGFnczp7TWluQXJnczoyLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwiZ2V0YXR0cihvYmplY3QsIG5hbWVbLCBkZWZhdWx0XSkgLT4gdmFsdWVcXG5cXG5HZXQgYSBuYW1lZCBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3Q7IGdldGF0dHIoeCwgJ3knKSBpcyBlcXVpdmFsZW50IHRvIHgueS5cXG5XaGVuIGEgZGVmYXVsdCBhcmd1bWVudCBpcyBnaXZlbiwgaXQgaXMgcmV0dXJuZWQgd2hlbiB0aGUgYXR0cmlidXRlIGRvZXNuJ3RcXG5leGlzdDsgd2l0aG91dCBpdCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGF0IGNhc2UuXCJ9LFxuZ2xvYmFsczp7JG1ldGg6U2suYnVpbHRpbi5nbG9iYWxzLCRmbGFnczp7Tm9BcmdzOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY3VycmVudCBzY29wZSdzIGdsb2JhbCB2YXJpYWJsZXMuXFxuXFxuTk9URTogVXBkYXRlcyB0byB0aGlzIGRpY3Rpb25hcnkgKndpbGwqIGFmZmVjdCBuYW1lIGxvb2t1cHMgaW4gdGhlIGN1cnJlbnRcXG5nbG9iYWwgc2NvcGUgYW5kIHZpY2UtdmVyc2EuXCJ9LGhhc2F0dHI6eyRtZXRoOlNrLmJ1aWx0aW4uaGFzYXR0ciwkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjJ9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgbmFtZSwgLylcIiwkZG9jOlwiUmV0dXJuIHdoZXRoZXIgdGhlIG9iamVjdCBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhlIGdpdmVuIG5hbWUuXFxuXFxuVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcgZ2V0YXR0cihvYmosIG5hbWUpIGFuZCBjYXRjaGluZyBBdHRyaWJ1dGVFcnJvci5cIn0sXG5oYXNoOnskbWV0aDpTay5idWlsdGluLmhhc2gsJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LlxcblxcblR3byBvYmplY3RzIHRoYXQgY29tcGFyZSBlcXVhbCBtdXN0IGFsc28gaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBidXQgdGhlXFxucmV2ZXJzZSBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZS5cIn0saGV4OnskbWV0aDpTay5idWlsdGluLmhleCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IGhleCgxMjY0ODQzMClcXG4gICAnMHhjMGZmZWUnXCJ9LGlkOnskbWV0aDpTay5idWlsdGluLmlkLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiB0aGUgaWRlbnRpdHkgb2YgYW4gb2JqZWN0LlxcblxcblRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUgYW1vbmcgc2ltdWx0YW5lb3VzbHkgZXhpc3Rpbmcgb2JqZWN0cy5cXG4oQ1B5dGhvbiB1c2VzIHRoZSBvYmplY3QncyBtZW1vcnkgYWRkcmVzcy4pXCJ9LFxuaW5wdXQ6eyRtZXRoOlNrLmJ1aWx0aW4uaW5wdXQsJGZsYWdzOntNaW5BcmdzOjAsTWF4QXJnczoxfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBwcm9tcHQ9Tm9uZSwgLylcIiwkZG9jOlwiUmVhZCBhIHN0cmluZyBmcm9tIHN0YW5kYXJkIGlucHV0LiAgVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQuXFxuXFxuVGhlIHByb21wdCBzdHJpbmcsIGlmIGdpdmVuLCBpcyBwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dCB3aXRob3V0IGFcXG50cmFpbGluZyBuZXdsaW5lIGJlZm9yZSByZWFkaW5nIGlucHV0LlxcblxcbklmIHRoZSB1c2VyIGhpdHMgRU9GICgqbml4OiBDdHJsLUQsIFdpbmRvd3M6IEN0cmwtWitSZXR1cm4pLCByYWlzZSBFT0ZFcnJvci5cXG5PbiAqbml4IHN5c3RlbXMsIHJlYWRsaW5lIGlzIHVzZWQgaWYgYXZhaWxhYmxlLlwifSxpc2luc3RhbmNlOnskbWV0aDpTay5idWlsdGluLmlzaW5zdGFuY2UsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlLCAvKVwiLFxuJGRvYzpcIlJldHVybiB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIG9yIG9mIGEgc3ViY2xhc3MgdGhlcmVvZi5cXG5cXG5BIHR1cGxlLCBhcyBpbiBgYGlzaW5zdGFuY2UoeCwgKEEsIEIsIC4uLikpYGAsIG1heSBiZSBnaXZlbiBhcyB0aGUgdGFyZ2V0IHRvXFxuY2hlY2sgYWdhaW5zdC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBgaXNpbnN0YW5jZSh4LCBBKSBvciBpc2luc3RhbmNlKHgsIEIpXFxub3IgLi4uYGAgZXRjLlwifSxpc3N1YmNsYXNzOnskbWV0aDpTay5idWlsdGluLmlzc3ViY2xhc3MsJGZsYWdzOntNaW5BcmdzOjIsTWF4QXJnczoyfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBjbHMsIGNsYXNzX29yX3R1cGxlLCAvKVwiLCRkb2M6XCJSZXR1cm4gd2hldGhlciAnY2xzJyBpcyBhIGRlcml2ZWQgZnJvbSBhbm90aGVyIGNsYXNzIG9yIGlzIHRoZSBzYW1lIGNsYXNzLlxcblxcbkEgdHVwbGUsIGFzIGluIGBgaXNzdWJjbGFzcyh4LCAoQSwgQiwgLi4uKSlgYCwgbWF5IGJlIGdpdmVuIGFzIHRoZSB0YXJnZXQgdG9cXG5jaGVjayBhZ2FpbnN0LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYGBpc3N1YmNsYXNzKHgsIEEpIG9yIGlzc3ViY2xhc3MoeCwgQilcXG5vciAuLi5gYCBldGMuXCJ9LFxuaXRlcjp7JG1ldGg6U2suYnVpbHRpbi5pdGVyLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6Mn0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUgLylcIiwkZG9jOlwiaXRlcihpdGVyYWJsZSkgLT4gaXRlcmF0b3JcXG5pdGVyKGNhbGxhYmxlLCBzZW50aW5lbCkgLT4gaXRlcmF0b3JcXG5cXG5HZXQgYW4gaXRlcmF0b3IgZnJvbSBhbiBvYmplY3QuICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIGFyZ3VtZW50IG11c3RcXG5zdXBwbHkgaXRzIG93biBpdGVyYXRvciwgb3IgYmUgYSBzZXF1ZW5jZS5cXG5JbiB0aGUgc2Vjb25kIGZvcm0sIHRoZSBjYWxsYWJsZSBpcyBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyB0aGUgc2VudGluZWwuXCJ9LGxlbjp7JG1ldGg6U2suYnVpbHRpbi5sZW4sJGZsYWdzOntPbmVBcmc6ITB9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIG9iaiwgLylcIiwkZG9jOlwiUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBjb250YWluZXIuXCJ9LGxvY2Fsczp7JG1ldGg6U2suYnVpbHRpbi5sb2NhbHMsXG4kZmxhZ3M6e05vQXJnczohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgLylcIiwkZG9jOlwiUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjdXJyZW50IHNjb3BlJ3MgbG9jYWwgdmFyaWFibGVzLlxcblxcbk5PVEU6IFdoZXRoZXIgb3Igbm90IHVwZGF0ZXMgdG8gdGhpcyBkaWN0aW9uYXJ5IHdpbGwgYWZmZWN0IG5hbWUgbG9va3VwcyBpblxcbnRoZSBsb2NhbCBzY29wZSBhbmQgdmljZS12ZXJzYSBpcyAqaW1wbGVtZW50YXRpb24gZGVwZW5kZW50KiBhbmQgbm90XFxuY292ZXJlZCBieSBhbnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZ3VhcmFudGVlcy5cIn0sbWF4OnskbWV0aDpTay5idWlsdGluLm1heCwkZmxhZ3M6e0Zhc3RDYWxsOiEwfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJtYXgoaXRlcmFibGUsICpbLCBkZWZhdWx0PW9iaiwga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcbm1heChhcmcxLCBhcmcyLCAqYXJncywgKlssIGtleT1mdW5jXSkgLT4gdmFsdWVcXG5cXG5XaXRoIGEgc2luZ2xlIGl0ZXJhYmxlIGFyZ3VtZW50LCByZXR1cm4gaXRzIGJpZ2dlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgbGFyZ2VzdCBhcmd1bWVudC5cIn0sXG5taW46eyRtZXRoOlNrLmJ1aWx0aW4ubWluLCRmbGFnczp7RmFzdENhbGw6ITB9LCR0ZXh0c2lnOm51bGwsJGRvYzpcIm1pbihpdGVyYWJsZSwgKlssIGRlZmF1bHQ9b2JqLCBrZXk9ZnVuY10pIC0+IHZhbHVlXFxubWluKGFyZzEsIGFyZzIsICphcmdzLCAqWywga2V5PWZ1bmNdKSAtPiB2YWx1ZVxcblxcbldpdGggYSBzaW5nbGUgaXRlcmFibGUgYXJndW1lbnQsIHJldHVybiBpdHMgc21hbGxlc3QgaXRlbS4gVGhlXFxuZGVmYXVsdCBrZXl3b3JkLW9ubHkgYXJndW1lbnQgc3BlY2lmaWVzIGFuIG9iamVjdCB0byByZXR1cm4gaWZcXG50aGUgcHJvdmlkZWQgaXRlcmFibGUgaXMgZW1wdHkuXFxuV2l0aCB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybiB0aGUgc21hbGxlc3QgYXJndW1lbnQuXCJ9LG5leHQ6eyRuYW1lOlwibmV4dFwiLCRtZXRoOlNrLmJ1aWx0aW4ubmV4dF8sJGZsYWdzOntNaW5BcmdzOjEsTWF4QXJnczoyfSwkdGV4dHNpZzpudWxsLCRkb2M6XCJuZXh0KGl0ZXJhdG9yWywgZGVmYXVsdF0pXFxuXFxuUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgaXRlcmF0b3IuIElmIGRlZmF1bHQgaXMgZ2l2ZW4gYW5kIHRoZSBpdGVyYXRvclxcbmlzIGV4aGF1c3RlZCwgaXQgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiByYWlzaW5nIFN0b3BJdGVyYXRpb24uXCJ9LFxub2N0OnskbWV0aDpTay5idWlsdGluLm9jdCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgbnVtYmVyLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuXFxuXFxuICAgPj4+IG9jdCgzNDIzOTEpXFxuICAgJzBvMTIzNDU2NydcIn0sb3Blbjp7JG1ldGg6U2suYnVpbHRpbi5vcGVuLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M30sJHRleHRzaWc6bnVsbCwkZG9jOlwib3BlbihuYW1lWywgbW9kZVssIGJ1ZmZlcmluZ11dKSAtPiBmaWxlIG9iamVjdFxcblxcbk9wZW4gYSBmaWxlIHVzaW5nIHRoZSBmaWxlKCkgdHlwZSwgcmV0dXJucyBhIGZpbGUgb2JqZWN0LiAgVGhpcyBpcyB0aGVcXG5wcmVmZXJyZWQgd2F5IHRvIG9wZW4gYSBmaWxlLiAgU2VlIGZpbGUuX19kb2NfXyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi5cIn0sb3JkOnskbWV0aDpTay5idWlsdGluLm9yZCwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgYywgLylcIixcbiRkb2M6XCJSZXR1cm4gdGhlIFVuaWNvZGUgY29kZSBwb2ludCBmb3IgYSBvbmUtY2hhcmFjdGVyIHN0cmluZy5cIn0scG93OnskbWV0aDpTay5idWlsdGluLnBvdywkZmxhZ3M6e01pbkFyZ3M6MixNYXhBcmdzOjN9LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIHgsIHksIHo9Tm9uZSwgLylcIiwkZG9jOlwiRXF1aXZhbGVudCB0byB4Kip5ICh3aXRoIHR3byBhcmd1bWVudHMpIG9yIHgqKnkgJSB6ICh3aXRoIHRocmVlIGFyZ3VtZW50cylcXG5cXG5Tb21lIHR5cGVzLCBzdWNoIGFzIGludHMsIGFyZSBhYmxlIHRvIHVzZSBhIG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobSB3aGVuXFxuaW52b2tlZCB1c2luZyB0aGUgdGhyZWUgYXJndW1lbnQgZm9ybS5cIn0scHJpbnQ6eyRtZXRoOlNrLmJ1aWx0aW4ucHJpbnQsJGZsYWdzOntGYXN0Q2FsbDohMH0sJHRleHRzaWc6bnVsbCwkZG9jOlwicHJpbnQodmFsdWUsIC4uLiwgc2VwPScgJywgZW5kPSdcXFxcbicsIGZpbGU9c3lzLnN0ZG91dCwgZmx1c2g9RmFsc2UpXFxuXFxuUHJpbnRzIHRoZSB2YWx1ZXMgdG8gYSBzdHJlYW0sIG9yIHRvIHN5cy5zdGRvdXQgYnkgZGVmYXVsdC5cXG5PcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czpcXG5maWxlOiAgYSBmaWxlLWxpa2Ugb2JqZWN0IChzdHJlYW0pOyBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBzeXMuc3Rkb3V0LlxcbnNlcDogICBzdHJpbmcgaW5zZXJ0ZWQgYmV0d2VlbiB2YWx1ZXMsIGRlZmF1bHQgYSBzcGFjZS5cXG5lbmQ6ICAgc3RyaW5nIGFwcGVuZGVkIGFmdGVyIHRoZSBsYXN0IHZhbHVlLCBkZWZhdWx0IGEgbmV3bGluZS5cXG5mbHVzaDogd2hldGhlciB0byBmb3JjaWJseSBmbHVzaCB0aGUgc3RyZWFtLlwifSxcbnJlcHI6eyRtZXRoOlNrLmJ1aWx0aW4ucmVwciwkZmxhZ3M6e09uZUFyZzohMH0sJHRleHRzaWc6XCIoJG1vZHVsZSwgb2JqLCAvKVwiLCRkb2M6XCJSZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cXG5cXG5Gb3IgbWFueSBvYmplY3QgdHlwZXMsIGluY2x1ZGluZyBtb3N0IGJ1aWx0aW5zLCBldmFsKHJlcHIob2JqKSkgPT0gb2JqLlwifSxyb3VuZDp7JG1ldGg6U2suYnVpbHRpbi5yb3VuZCwkZmxhZ3M6e05hbWVkQXJnczpbXCJudW1iZXJcIixcIm5kaWdpdHNcIl19LCR0ZXh0c2lnOlwiKCRtb2R1bGUsIC8sIG51bWJlciwgbmRpZ2l0cz1Ob25lKVwiLCRkb2M6XCJSb3VuZCBhIG51bWJlciB0byBhIGdpdmVuIHByZWNpc2lvbiBpbiBkZWNpbWFsIGRpZ2l0cy5cXG5cXG5UaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIgaWYgbmRpZ2l0cyBpcyBvbWl0dGVkIG9yIE5vbmUuICBPdGhlcndpc2VcXG50aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBudW1iZXIuICBuZGlnaXRzIG1heSBiZSBuZWdhdGl2ZS5cIn0sXG5zZXRhdHRyOnskbWV0aDpTay5idWlsdGluLnNldGF0dHIsJGZsYWdzOntNaW5BcmdzOjMsTWF4QXJnczozfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIG5hbWUsIHZhbHVlLCAvKVwiLCRkb2M6XCJTZXRzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLlxcblxcbnNldGF0dHIoeCwgJ3knLCB2KSBpcyBlcXVpdmFsZW50IHRvIGBgeC55ID0gdicnXCJ9LHNvcnRlZDp7JG1ldGg6U2suYnVpbHRpbi5zb3J0ZWQsJGZsYWdzOntOYW1lZEFyZ3M6W251bGwsXCJjbXBcIixcImtleVwiLFwicmV2ZXJzZVwiXSxEZWZhdWx0czpbU2suYnVpbHRpbi5ub25lLm5vbmUkLFNrLmJ1aWx0aW4ubm9uZS5ub25lJCxTay5idWlsdGluLmJvb2wuZmFsc2UkXX0sJHRleHRzaWc6XCIoJG1vZHVsZSwgaXRlcmFibGUsIC8sICosIGtleT1Ob25lLCByZXZlcnNlPUZhbHNlKVwiLCRkb2M6XCJSZXR1cm4gYSBuZXcgbGlzdCBjb250YWluaW5nIGFsbCBpdGVtcyBmcm9tIHRoZSBpdGVyYWJsZSBpbiBhc2NlbmRpbmcgb3JkZXIuXFxuXFxuQSBjdXN0b20ga2V5IGZ1bmN0aW9uIGNhbiBiZSBzdXBwbGllZCB0byBjdXN0b21pemUgdGhlIHNvcnQgb3JkZXIsIGFuZCB0aGVcXG5yZXZlcnNlIGZsYWcgY2FuIGJlIHNldCB0byByZXF1ZXN0IHRoZSByZXN1bHQgaW4gZGVzY2VuZGluZyBvcmRlci5cIn0sXG5zdW06eyRtZXRoOlNrLmJ1aWx0aW4uc3VtLCRmbGFnczp7TmFtZWRBcmdzOltudWxsLFwic3RhcnRcIl0sRGVmYXVsdHM6W25ldyBTay5idWlsdGluLmludF8oMCldfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBpdGVyYWJsZSwgLywgc3RhcnQ9MClcIiwkZG9jOlwiUmV0dXJuIHRoZSBzdW0gb2YgYSAnc3RhcnQnIHZhbHVlIChkZWZhdWx0OiAwKSBwbHVzIGFuIGl0ZXJhYmxlIG9mIG51bWJlcnNcXG5cXG5XaGVuIHRoZSBpdGVyYWJsZSBpcyBlbXB0eSwgcmV0dXJuIHRoZSBzdGFydCB2YWx1ZS5cXG5UaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHNwZWNpZmljYWxseSBmb3IgdXNlIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIG1heVxcbnJlamVjdCBub24tbnVtZXJpYyB0eXBlcy5cIn0sdmFyczp7JG1ldGg6U2suYnVpbHRpbi52YXJzLCRmbGFnczp7TWluQXJnczowLE1heEFyZ3M6MX0sJHRleHRzaWc6bnVsbCwkZG9jOlwidmFycyhbb2JqZWN0XSkgLT4gZGljdGlvbmFyeVxcblxcbldpdGhvdXQgYXJndW1lbnRzLCBlcXVpdmFsZW50IHRvIGxvY2FscygpLlxcbldpdGggYW4gYXJndW1lbnQsIGVxdWl2YWxlbnQgdG8gb2JqZWN0Ll9fZGljdF9fLlwifX0pO1xuU2suc2V0dXBPYmplY3RzPWZ1bmN0aW9uKGEpe2E/KFNrLmJ1aWx0aW5zLmZpbHRlcj1Tay5idWlsdGluLmZpbHRlcl8sU2suYnVpbHRpbnMubWFwPVNrLmJ1aWx0aW4ubWFwXyxTay5idWlsdGlucy56aXA9U2suYnVpbHRpbi56aXBfLFNrLmJ1aWx0aW5zLnJhbmdlPVNrLmJ1aWx0aW4ucmFuZ2VfLGRlbGV0ZSBTay5idWlsdGlucy54cmFuZ2UsZGVsZXRlIFNrLmJ1aWx0aW5zLlN0YW5kYXJkRXJyb3IsZGVsZXRlIFNrLmJ1aWx0aW5zLnVuaWNvZGUsZGVsZXRlIFNrLmJ1aWx0aW5zLmJhc2VzdHJpbmcsZGVsZXRlIFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JCxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTay5idWlsdGluLnN0cih0aGlzLnYudG9TdHJpbmcoKSl9LGRlbGV0ZSBTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cixkZWxldGUgU2suYnVpbHRpbi5ib29sLnByb3RvdHlwZS50cCRzdHIsZGVsZXRlIFNrLmJ1aWx0aW5zLnJhd19pbnB1dCxcbmRlbGV0ZSBTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlLFNrLmJ1aWx0aW5zLmJ5dGVzPVNrLmJ1aWx0aW4uYnl0ZXMsU2suYnVpbHRpbnMuYXNjaWk9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLmFzY2lpLCRmbGFnczp7T25lQXJnOiEwfSwkdGV4dHNpZzpcIigkbW9kdWxlLCBvYmosIC8pXCIsJGRvYzpcIlJldHVybiBhbiBBU0NJSS1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC5cXG5cXG5BcyByZXByKCksIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFuXFxub2JqZWN0LCBidXQgZXNjYXBlIHRoZSBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5XFxucmVwcigpIHVzaW5nIFxcXFxcXFxceCwgXFxcXFxcXFx1IG9yIFxcXFxcXFxcVSBlc2NhcGVzLiBUaGlzIGdlbmVyYXRlcyBhIHN0cmluZyBzaW1pbGFyXFxudG8gdGhhdCByZXR1cm5lZCBieSByZXByKCkgaW4gUHl0aG9uIDIuXCJ9LFxubnVsbCxcImJ1aWx0aW5zXCIpKTooU2suYnVpbHRpbnMucmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnJhbmdlLCRuYW1lOlwicmFuZ2VcIiwkZmxhZ3M6e01pbkFyZ3M6MSxNYXhBcmdzOjN9fSx2b2lkIDAsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy54cmFuZ2U9bmV3IFNrLmJ1aWx0aW4uc2tfbWV0aG9kKHskbWV0aDpTay5idWlsdGluLnhyYW5nZSwkbmFtZTpcInhyYW5nZVwiLCRmbGFnczp7TWluQXJnczoxLE1heEFyZ3M6M319LG51bGwsXCJidWlsdGluc1wiKSxTay5idWlsdGlucy5maWx0ZXI9bmV3IFNrLmJ1aWx0aW4uZnVuYyhTay5idWlsdGluLmZpbHRlciksU2suYnVpbHRpbnMubWFwPW5ldyBTay5idWlsdGluLmZ1bmMoU2suYnVpbHRpbi5tYXApLFNrLmJ1aWx0aW5zLnppcD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4uemlwKSxTay5idWlsdGlucy5TdGFuZGFyZEVycm9yPVNrLmJ1aWx0aW4uRXhjZXB0aW9uLFNrLmJ1aWx0aW5zLnVuaWNvZGU9XG5Tay5idWlsdGluLnN0cixTay5idWlsdGlucy5iYXNlc3RyaW5nPVNrLmJ1aWx0aW4uc3RyLFNrLmJ1aWx0aW5zLmxvbmdfJHJ3JD1Tay5idWlsdGluLmxuZyxTay5idWlsdGluLmludF8ucHJvdG90eXBlLiRyPWZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnY7cmV0dXJuXCJudW1iZXJcIj09PXR5cGVvZiBhP25ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkpOm5ldyBTay5idWlsdGluLnN0cihhLnRvU3RyaW5nKCkrXCJMXCIpfSxTay5idWlsdGluLmludF8ucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiBuZXcgU2suYnVpbHRpbi5zdHIodGhpcy52LnRvU3RyaW5nKCkpfSxTay5idWlsdGluLmJvb2wucHJvdG90eXBlLnRwJHN0cj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyKCl9LFNrLmJ1aWx0aW5zLnJhd19pbnB1dD1uZXcgU2suYnVpbHRpbi5mdW5jKFNrLmJ1aWx0aW4ucmF3X2lucHV0KSxTay5idWlsdGluLnN0ci5wcm90b3R5cGUuZGVjb2RlPVNrLmJ1aWx0aW4uc3RyLiRweTJkZWNvZGUsXG5kZWxldGUgU2suYnVpbHRpbnMuYnl0ZXMsZGVsZXRlIFNrLmJ1aWx0aW5zLmFzY2lpKX07U2suZXhwb3J0U3ltYm9sKFwiU2suc2V0dXBPYmplY3RzXCIsU2suc2V0dXBPYmplY3RzKTtTay5leHBvcnRTeW1ib2woXCJTay5idWlsdGluc1wiLFNrLmJ1aWx0aW5zKX0sZnVuY3Rpb24obSxxKXtTay5idWlsdGluLnN0ci4kZW1wdHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbXB0eXN0cj1Tay5idWlsdGluLnN0ci4kZW1wdHk7U2suYnVpbHRpbi5zdHIuJHV0Zjg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwidXRmLThcIik7U2suYnVpbHRpbi5zdHIuJGFzY2lpPW5ldyBTay5idWlsdGluLnN0cihcImFzY2lpXCIpO1NrLmJ1aWx0aW4uc3RyLiRkZWZhdWx0X2ZhY3Rvcnk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiZGVmYXVsdF9mYWN0b3J5XCIpO1NrLmJ1aWx0aW4uc3RyLiRpbWFnPW5ldyBTay5idWlsdGluLnN0cihcImltYWdcIik7U2suYnVpbHRpbi5zdHIuJHJlYWw9bmV3IFNrLmJ1aWx0aW4uc3RyKFwicmVhbFwiKTtcblNrLmJ1aWx0aW4uc3RyLiRhYnM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19hYnNfX1wiKTtTay5idWlsdGluLnN0ci4kYnl0ZXM9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19ieXRlc19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjYWxsPW5ldyBTay5idWlsdGluLnN0cihcIl9fY2FsbF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjbGFzcz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NsYXNzX19cIik7U2suYnVpbHRpbi5zdHIuJGNtcD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NtcF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb21wbGV4PW5ldyBTay5idWlsdGluLnN0cihcIl9fY29tcGxleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRjb250YWlucz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2NvbnRhaW5zX19cIik7U2suYnVpbHRpbi5zdHIuJGNvcHk9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19jb3B5X19cIik7U2suYnVpbHRpbi5zdHIuJGRpY3Q9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19kaWN0X19cIik7U2suYnVpbHRpbi5zdHIuJGRpcj1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZGlyX19cIik7U2suYnVpbHRpbi5zdHIuJGRvYz1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2RvY19fXCIpO1NrLmJ1aWx0aW4uc3RyLiRlbnRlcj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2VudGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGVxPW5ldyBTay5idWlsdGluLnN0cihcIl9fZXFfX1wiKTtTay5idWlsdGluLnN0ci4kZXhpdD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2V4aXRfX1wiKTtTay5idWlsdGluLnN0ci4kaW5kZXg9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pbmRleF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbml0PW5ldyBTay5idWlsdGluLnN0cihcIl9faW5pdF9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRpbnRfPW5ldyBTay5idWlsdGluLnN0cihcIl9faW50X19cIik7U2suYnVpbHRpbi5zdHIuJGl0ZXI9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19pdGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGZpbGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19maWxlX19cIik7U2suYnVpbHRpbi5zdHIuJGZsb2F0Xz1cbm5ldyBTay5idWlsdGluLnN0cihcIl9fZmxvYXRfX1wiKTtTay5idWlsdGluLnN0ci4kZm9ybWF0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZm9ybWF0X19cIik7U2suYnVpbHRpbi5zdHIuJGdlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2VfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2dldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kZ2V0YXR0cmlidXRlPW5ldyBTay5idWlsdGluLnN0cihcIl9fZ2V0YXR0cmlidXRlX19cIik7U2suYnVpbHRpbi5zdHIuJGdldGl0ZW09bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19nZXRpdGVtX19cIik7U2suYnVpbHRpbi5zdHIuJGd0PW5ldyBTay5idWlsdGluLnN0cihcIl9fZ3RfX1wiKTtTay5idWlsdGluLnN0ci4ka2V5cz1uZXcgU2suYnVpbHRpbi5zdHIoXCJrZXlzXCIpO1NrLmJ1aWx0aW4uc3RyLiRsZT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlX19cIik7U2suYnVpbHRpbi5zdHIuJGxlbj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX2xlbl9fXCIpO1xuU2suYnVpbHRpbi5zdHIuJGxlbmd0aF9oaW50PW5ldyBTay5idWlsdGluLnN0cihcIl9fbGVuZ3RoX2hpbnRfX1wiKTtTay5idWlsdGluLnN0ci4kbG9hZGVyPW5ldyBTay5idWlsdGluLnN0cihcIl9fbG9hZGVyX19cIik7U2suYnVpbHRpbi5zdHIuJGx0PW5ldyBTay5idWlsdGluLnN0cihcIl9fbHRfX1wiKTtTay5idWlsdGluLnN0ci4kbW9kdWxlPW5ldyBTay5idWlsdGluLnN0cihcIl9fbW9kdWxlX19cIik7U2suYnVpbHRpbi5zdHIuJG1pc3Npbmc9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19taXNzaW5nX19cIik7U2suYnVpbHRpbi5zdHIuJG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uYW1lX19cIik7U2suYnVpbHRpbi5zdHIuJG5lPW5ldyBTay5idWlsdGluLnN0cihcIl9fbmVfX1wiKTtTay5idWlsdGluLnN0ci4kbmV3PW5ldyBTay5idWlsdGluLnN0cihcIl9fbmV3X19cIik7U2suYnVpbHRpbi5zdHIuJG5leHQ9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19uZXh0X19cIik7U2suYnVpbHRpbi5zdHIuJHBhdGg9XG5uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3BhdGhfX1wiKTtTay5idWlsdGluLnN0ci4kcXVhbG5hbWU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwiX19xdWFsbmFtZV9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXByPW5ldyBTay5idWlsdGluLnN0cihcIl9fcmVwcl9fXCIpO1NrLmJ1aWx0aW4uc3RyLiRyZXZlcnNlZD1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3JldmVyc2VkX19cIik7U2suYnVpbHRpbi5zdHIuJHJvdW5kPW5ldyBTay5idWlsdGluLnN0cihcIl9fcm91bmRfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0YXR0cj1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGF0dHJfX1wiKTtTay5idWlsdGluLnN0ci4kc2V0aXRlbT1uZXcgU2suYnVpbHRpbi5zdHIoXCJfX3NldGl0ZW1fX1wiKTtTay5idWlsdGluLnN0ci4kc3RyPW5ldyBTay5idWlsdGluLnN0cihcIl9fc3RyX19cIik7U2suYnVpbHRpbi5zdHIuJHRydW5jPW5ldyBTay5idWlsdGluLnN0cihcIl9fdHJ1bmNfX1wiKTtTay5idWlsdGluLnN0ci4kd3JpdGU9bmV3IFNrLmJ1aWx0aW4uc3RyKFwid3JpdGVcIik7XG5Tay5taXNjZXZhbC5vcDJtZXRob2RfPXtFcTpTay5idWlsdGluLnN0ci4kZXEsTm90RXE6U2suYnVpbHRpbi5zdHIuJG5lLEd0OlNrLmJ1aWx0aW4uc3RyLiRndCxHdEU6U2suYnVpbHRpbi5zdHIuJGdlLEx0OlNrLmJ1aWx0aW4uc3RyLiRsdCxMdEU6U2suYnVpbHRpbi5zdHIuJGxlfX1dKTt9KS5jYWxsKHRoaXMgfHwgd2luZG93KVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1za3VscHQubWluLmpzLm1hcCIsIi8qXG5UaGUgVGltZWRBY3RpdmVjb2RlIGNsYXNzZXMgYXJlIGEgZ3JlYXQgZXhhbXBsZSBvZiB3aGVyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSB3b3VsZCBiZSB1c2VmdWxcbkJ1dCBzaW5jZSBKYXZhc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2UgdXNlIHRoZSBtaXhpbiBwYXR0ZXJuLlxuXG4qL1xuaW1wb3J0IExpdmVDb2RlIGZyb20gXCIuL2xpdmVjb2RlXCI7XG5pbXBvcnQgeyBBY3RpdmVDb2RlIH0gZnJvbSBcIi4vYWN0aXZlY29kZVwiO1xuaW1wb3J0IEpTQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX2pzXCI7XG5pbXBvcnQgSFRNTEFjdGl2ZUNvZGUgZnJvbSBcIi4vYWN0aXZlY29kZV9odG1sXCI7XG5pbXBvcnQgU1FMQWN0aXZlQ29kZSBmcm9tIFwiLi9hY3RpdmVjb2RlX3NxbFwiO1xuaW1wb3J0IEJyeXRob25BY3RpdmVDb2RlIGZyb20gXCIuL2FjdGl2ZWNvZGVfYnJ5dGhvbi5qc1wiO1xuXG52YXIgVGltZWRBY3RpdmVDb2RlTWl4aW4gPSB7XG4gICAgdGltZWRJbml0OiBhc3luYyBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICB0aGlzLmlzVGltZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSGlzdG9yeVNjcnViYmVyKHRydWUpOyAvLyBwb3NpdGlvbiBsYXN0XG4gICAgICAgIHRoaXMubmVlZHNSZWluaXRpYWxpemF0aW9uID0gdHJ1ZTsgLy8gdGhlIHJ1biBidXR0b24gY2xpY2sgbGlzdGVuZXIgbmVlZHMgdG8gYmUgcmVpbml0aWFsaXplZFxuICAgICAgICB0aGlzLmNvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKFwidGltZWRDb21wb25lbnRcIik7XG4gICAgICAgIHdpbmRvdy5lZExpc3RbdGhpcy5kaXZpZF0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGlkZUJ1dHRvbnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGJ1dHRvbkxpc3QgPSBbXG4gICAgICAgICAgICB0aGlzLnNhdmVCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmdyYWRlQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93SGlkZUJ1dHQsXG4gICAgICAgICAgICB0aGlzLmNvYWNoQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5hdEJ1dHRvbixcbiAgICAgICAgXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25MaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmIGJ1dHRvbkxpc3RbaV0gIT09IG51bGwpXG4gICAgICAgICAgICAgICAgJChidXR0b25MaXN0W2ldKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gYmplIC0gbm90IG5lZWRlZCBhbnltb3JlXG4gICAgcmVuZGVyVGltZWRJY29uOiBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIC8vIHJlbmRlcnMgdGhlIGNsb2NrIGljb24gb24gdGltZWQgY29tcG9uZW50cy4gICAgVGhlIGNvbXBvbmVudCBwYXJhbWV0ZXJcbiAgICAgICAgLy8gaXMgdGhlIGVsZW1lbnQgdGhhdCB0aGUgaWNvbiBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXG4gICAgICAgIHZhciB0aW1lSWNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZhciB0aW1lSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7XG4gICAgICAgICQodGltZUljb24pLmF0dHIoe1xuICAgICAgICAgICAgc3JjOiBcIi4uL19zdGF0aWMvY2xvY2sucG5nXCIsXG4gICAgICAgICAgICBzdHlsZTogXCJ3aWR0aDoxNXB4O2hlaWdodDoxNXB4XCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aW1lSWNvbkRpdi5jbGFzc05hbWUgPSBcInRpbWVUaXBcIjtcbiAgICAgICAgdGltZUljb25EaXYudGl0bGUgPSBcIlwiO1xuICAgICAgICB0aW1lSWNvbkRpdi5hcHBlbmRDaGlsZCh0aW1lSWNvbik7XG4gICAgICAgICQoY29tcG9uZW50KS5wcmVwZW5kKHRpbWVJY29uRGl2KTtcbiAgICB9LFxuXG4gICAgY2hlY2tDb3JyZWN0VGltZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcGN0X2NvcnJlY3QgaXMgc2V0IGJ5IHRoZSB1bml0dGVzdC9ndWkucHkgbW9kdWxlIGluIHNrdWxwdC5cbiAgICAgICAgLy8gaXQgcmVsaWVzIG9uIGZpbmRpbmcgdGhpcyBvYmplY3QgaW4gdGhlIGVkTGlzdFxuICAgICAgICBpZiAodGhpcy5pc0Fuc3dlcmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wY3RfY29ycmVjdCA+PSAxMDAuMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlRcIjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiRlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwiSVwiOyAvLyB3ZSBpZ25vcmUgdGhpcyBpbiB0aGUgZ3JhZGluZyBpZiBubyB1bml0dGVzdHNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBoaWRlRmVlZGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzLm91dHB1dCkuY3NzKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICB9LFxuXG4gICAgcmVpbml0aWFsaXplTGlzdGVuZXJzOiBmdW5jdGlvbiAodGFrZW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYXR0YWNoaW5nIHJ1bmJ1dHRvbmhhbmRsZXJcIik7XG4gICAgICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5vbmNsaWNrID0gdGhpcy5ydW5CdXR0b25IYW5kZXIuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAkKHRoaXMuY29kZURpdikuc2hvdygpO1xuICAgICAgICB0aGlzLnJ1bkJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAkKHRoaXMuY29kZURpdikucmVtb3ZlQ2xhc3MoXCJhYy1kaXNhYmxlZFwiKTtcbiAgICAgICAgdGhpcy5lZGl0b3IucmVmcmVzaCgpO1xuICAgICAgICAkKHRoaXMuaGlzdEJ1dHRvbikuY2xpY2sodGhpcy5hZGRIaXN0b3J5U2NydWJiZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlTY3J1YmJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgJCh0aGlzLmhpc3RvcnlTY3J1YmJlcikuc2xpZGVyKHtcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBzbGlkZTogdGhpcy5zbGlkZWl0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgY2hhbmdlOiB0aGlzLnNsaWRlaXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWtlbikge1xuICAgICAgICAgICAgJChgIyR7dGhpcy5kaXZpZH1fdW5pdF9yZXN1bHRzYCkuc2hvdygpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBUaW1lZExpdmVDb2RlIGV4dGVuZHMgTGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZExpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRBY3RpdmVDb2RlIGV4dGVuZHMgQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXRDb21wbGV0ZSA9IHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cblxuICAgIC8vIGZvciB0aW1lZCBleGFtcyB3ZSBuZWVkIHRvIGNhbGwgcnVuUHJvZyBhbmQgdGVsbCBpdCB0aGF0IHRoZXJlIGlzXG4gICAgLy8gbm8gR1VJIGZvciBzbGlkZXJzIG9yIG90aGVyIHRoaW5ncy5cbiAgICAvLyB0aGUgYW5zd2Vycy5cbiAgICBhc3luYyBjaGVja0N1cnJlbnRBbnN3ZXIoKSB7XG4gICAgICAgIGxldCBub1VJID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50aW1lZEluaXRDb21wbGV0ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNBbnN3ZXJlZCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW5Qcm9nKG5vVUksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihUaW1lZEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEpTQWN0aXZlQ29kZSBleHRlbmRzIEpTQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEpTQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcblxuZXhwb3J0IGNsYXNzIFRpbWVkSFRNTEFjdGl2ZUNvZGUgZXh0ZW5kcyBIVE1MQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZEhUTUxBY3RpdmVDb2RlLnByb3RvdHlwZSwgVGltZWRBY3RpdmVDb2RlTWl4aW4pO1xuXG5leHBvcnQgY2xhc3MgVGltZWRTUUxBY3RpdmVDb2RlIGV4dGVuZHMgU1FMQWN0aXZlQ29kZSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy50aW1lZEluaXQob3B0cyk7XG4gICAgfVxufVxuT2JqZWN0LmFzc2lnbihUaW1lZFNRTEFjdGl2ZUNvZGUucHJvdG90eXBlLCBUaW1lZEFjdGl2ZUNvZGVNaXhpbik7XG5cbmV4cG9ydCBjbGFzcyBUaW1lZEJyeXRob25BY3RpdmVDb2RlIGV4dGVuZHMgQnJ5dGhvbkFjdGl2ZUNvZGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMudGltZWRJbml0KG9wdHMpO1xuICAgIH1cbn1cbk9iamVjdC5hc3NpZ24oVGltZWRCcnl0aG9uQWN0aXZlQ29kZS5wcm90b3R5cGUsIFRpbWVkQWN0aXZlQ29kZU1peGluKTtcbiIsIi8qXG5cbmhpZ2hsaWdodCB2NFxuXG5IaWdobGlnaHRzIGFyYml0cmFyeSB0ZXJtcy5cblxuPGh0dHA6Ly9qb2hhbm5idXJrYXJkLmRlL2Jsb2cvcHJvZ3JhbW1pbmcvamF2YXNjcmlwdC9oaWdobGlnaHQtamF2YXNjcmlwdC10ZXh0LWhpZ2xpZ2h0aW5nLWpxdWVyeS1wbHVnaW4uaHRtbD5cblxuTUlUIGxpY2Vuc2UuXG5cbkpvaGFubiBCdXJrYXJkXG48aHR0cDovL2pvaGFubmJ1cmthcmQuZGU+XG48bWFpbHRvOmpiQGVhaW8uY29tPlxuXG4qL1xuXG5qUXVlcnkuZm4uaGlnaGxpZ2h0ID0gZnVuY3Rpb24ocGF0KSB7XG4gZnVuY3Rpb24gaW5uZXJIaWdobGlnaHQobm9kZSwgcGF0KSB7XG4gIHZhciBza2lwID0gMDtcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykge1xuICAgdmFyIHBvcyA9IG5vZGUuZGF0YS50b1VwcGVyQ2FzZSgpLmluZGV4T2YocGF0KTtcbiAgIGlmIChwb3MgPj0gMCkge1xuICAgIHZhciBzcGFubm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBzcGFubm9kZS5jbGFzc05hbWUgPSAnaGlnaGxpZ2h0JztcbiAgICB2YXIgbWlkZGxlYml0ID0gbm9kZS5zcGxpdFRleHQocG9zKTtcbiAgICB2YXIgZW5kYml0ID0gbWlkZGxlYml0LnNwbGl0VGV4dChwYXQubGVuZ3RoKTtcbiAgICB2YXIgbWlkZGxlY2xvbmUgPSBtaWRkbGViaXQuY2xvbmVOb2RlKHRydWUpO1xuICAgIHNwYW5ub2RlLmFwcGVuZENoaWxkKG1pZGRsZWNsb25lKTtcbiAgICBtaWRkbGViaXQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoc3Bhbm5vZGUsIG1pZGRsZWJpdCk7XG4gICAgc2tpcCA9IDE7XG4gICB9XG4gIH1cbiAgZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIG5vZGUuY2hpbGROb2RlcyAmJiAhLyhzY3JpcHR8c3R5bGUpL2kudGVzdChub2RlLnRhZ05hbWUpKSB7XG4gICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgIGkgKz0gaW5uZXJIaWdobGlnaHQobm9kZS5jaGlsZE5vZGVzW2ldLCBwYXQpO1xuICAgfVxuICB9XG4gIHJldHVybiBza2lwO1xuIH1cbiByZXR1cm4gdGhpcy5sZW5ndGggJiYgcGF0ICYmIHBhdC5sZW5ndGggPyB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gIGlubmVySGlnaGxpZ2h0KHRoaXMsIHBhdC50b1VwcGVyQ2FzZSgpKTtcbiB9KSA6IHRoaXM7XG59O1xuXG5qUXVlcnkuZm4ucmVtb3ZlSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKSB7XG4gcmV0dXJuIHRoaXMuZmluZChcInNwYW4uaGlnaGxpZ2h0XCIpLmVhY2goZnVuY3Rpb24oKSB7XG4gIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLm5vZGVOYW1lO1xuICB3aXRoICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgIHJlcGxhY2VDaGlsZCh0aGlzLmZpcnN0Q2hpbGQsIHRoaXMpO1xuICAgbm9ybWFsaXplKCk7XG4gIH1cbiB9KS5lbmQoKTtcbn07XG4iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/runestone/dist/runtime.bundle.js b/runestone/dist/runtime.bundle.js index e4f1a1700..7f413db17 100644 --- a/runestone/dist/runtime.bundle.js +++ b/runestone/dist/runtime.bundle.js @@ -107,7 +107,7 @@ /******/ // This function allow to reference async chunks /******/ __webpack_require__.u = (chunkId) => { /******/ // return url for filenames based on template -/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"922295b773b3a84c3652","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + ""; +/******/ return "" + chunkId + ".bundle.js?v=" + {"vendors-node_modules_codemirror_mode_clike_clike_js-node_modules_codemirror_mode_javascript_j-ea0e03":"72d5b835b0f012e4faeb","vendors-node_modules_codemirror_mode_htmlmixed_htmlmixed_js-node_modules_handsontable_es_inde-1af827":"d503479c13820d9365ef","runestone_common_js_runestonebase_js":"c75250ad0dccea19bebf","runestone_codelens_js_pytutor-embed_bundle_js":"deb8f2f247c5f5984b7f","node_modules_moment_locale_sync_recursive_-runestone_activecode_js_acfactory_js":"53a19119f0c683ec9edd","runestone_clickableArea_js_timedclickable_js":"46bba3f29372278e5ca6","runestone_codelens_js_codelens_js":"c95e8bfecd8a67d35858","runestone_datafile_js_datafile_js":"6504816b693b4fbd0ad0","runestone_dragndrop_js_timeddnd_js":"c1868fefbd55f59a3fb4","runestone_fitb_js_timedfitb_js":"a21027361ba218ca9469","runestone_khanex_js_khanex_js":"48ca28e2bdcb2e2b8873","runestone_lp_js_lp_js":"a090d19da37a3e0d1b73","runestone_mchoice_js_timedmc_js":"e750cc1dc92a20232c4c","runestone_parsons_js_timedparsons_js":"43cb72263fef1b7b309a","runestone_poll_js_poll_js":"68474b8af3c1d20134ae","runestone_quizly_js_quizly_js":"f98c8ac098e2d06dbf4b","runestone_reveal_js_reveal_js":"55966c908800091f205a","runestone_selectquestion_js_selectone_js":"802042f9ff57544b5881","runestone_shortanswer_js_timed_shortanswer_js":"f225aa55d4c2630b36a7","runestone_showeval_js_showEval_js":"53ffdb3261ed8fcbceef","vendors-node_modules_jexcel_dist_jexcel_js-node_modules_jexcel_dist_jexcel_css":"4dff04ac5c1ef0786178","runestone_spreadsheet_js_spreadsheet_js":"6bd6316da3765f3c49bb","runestone_tabbedStuff_js_tabbedstuff_js":"33003997cbed4c38dc7a","runestone_timed_js_timed_js":"30c4f6e6bd7adec59614","vendors-node_modules_wavedrom_lib_process-all_js-node_modules_wavedrom_lib_wave-skin_js":"71f72eb02ec15779de1b","runestone_wavedrom_js_wavedrom_js":"7394bc1582ad34cdce1a","runestone_webwork_js_webwork_js":"754ac28092a8179f722c","runestone_video_js_runestonevideo_js":"bcdbd3d36584c9c528d0"}[chunkId] + ""; /******/ }; /******/ })(); /******/ @@ -316,4 +316,4 @@ /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj1hODU5ZWRlMzBjNmY3ODg1OTBlOCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiOTIyMjk1Yjc3M2IzYTg0YzM2NTJcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgamF2YXNjcmlwdCBjaHVuayBmaWxlbmFtZSIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9nZXQgbWluaS1jc3MgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9sb2FkIHNjcmlwdCIsIndlYnBhY2s6Ly9XZWJDb21wb25lbnRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL1dlYkNvbXBvbmVudHMvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vV2ViQ29tcG9uZW50cy93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7Ozs7O1dDNUJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsOEJBQThCLHdDQUF3QztXQUN0RTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7V0FDQTtXQUNBLGlCQUFpQixxQkFBcUI7V0FDdEM7V0FDQTtXQUNBLElBQUk7V0FDSjtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRTs7Ozs7V0MzQkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQyxZQUFZO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHdDQUF3Qyx5Q0FBeUM7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQSwwQ0FBMEMsODVEQUE4NUQ7V0FDeDhELEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ0pBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGO1dBQ0E7V0FDQSxDQUFDLEk7Ozs7O1dDUEQsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxzQkFBc0IsNEJBQTRCLFFBQVE7V0FDMUQ7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLG9CQUFvQjtXQUNwQztXQUNBLGtHQUFrRyxZQUFZLE9BQU87V0FDckg7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0VBQWtFLGtDQUFrQztXQUNwRztXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQ3pDQTtXQUNBO1dBQ0E7V0FDQSxzREFBc0Qsa0JBQWtCO1dBQ3hFO1dBQ0EsK0NBQStDLGNBQWM7V0FDN0QsRTs7Ozs7V0NOQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esa0M7Ozs7O1dDZkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBLGdDQUFnQzs7V0FFaEM7V0FDQTtXQUNBO1dBQ0EsSUFBSTtXQUNKO1dBQ0E7V0FDQTtXQUNBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxLQUFLO1dBQ0w7V0FDQTtXQUNBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBOztXQUVBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsTUFBTSxvQkFBb0I7V0FDMUI7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0EsNEciLCJmaWxlIjoicnVudGltZS5idW5kbGUuanM/dj0xNjU0YmJkZTczZTEyYTMzNjZlYiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdGxvYWRlZDogZmFsc2UsXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuXHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZiA9IHt9O1xuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIG9ubHkgdGhlIGVudHJ5IGNodW5rLlxuLy8gVGhlIGNodW5rIGxvYWRpbmcgZnVuY3Rpb24gZm9yIGFkZGl0aW9uYWwgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmUgPSAoY2h1bmtJZCkgPT4ge1xuXHRyZXR1cm4gUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5mKS5yZWR1Y2UoKHByb21pc2VzLCBrZXkpID0+IHtcblx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmZba2V5XShjaHVua0lkLCBwcm9taXNlcyk7XG5cdFx0cmV0dXJuIHByb21pc2VzO1xuXHR9LCBbXSkpO1xufTsiLCIvLyBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIHJlZmVyZW5jZSBhc3luYyBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5idW5kbGUuanM/dj1cIiArIHtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2NvZGVtaXJyb3JfbW9kZV9jbGlrZV9jbGlrZV9qcy1ub2RlX21vZHVsZXNfY29kZW1pcnJvcl9tb2RlX2phdmFzY3JpcHRfai1lYTBlMDNcIjpcIjcyZDViODM1YjBmMDEyZTRmYWViXCIsXCJ2ZW5kb3JzLW5vZGVfbW9kdWxlc19jb2RlbWlycm9yX21vZGVfaHRtbG1peGVkX2h0bWxtaXhlZF9qcy1ub2RlX21vZHVsZXNfaGFuZHNvbnRhYmxlX2VzX2luZGUtMWFmODI3XCI6XCJkNTAzNDc5YzEzODIwZDkzNjVlZlwiLFwicnVuZXN0b25lX2NvbW1vbl9qc19ydW5lc3RvbmViYXNlX2pzXCI6XCJjNzUyNTBhZDBkY2NlYTE5YmViZlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX3B5dHV0b3ItZW1iZWRfYnVuZGxlX2pzXCI6XCJkZWI4ZjJmMjQ3YzVmNTk4NGI3ZlwiLFwibm9kZV9tb2R1bGVzX21vbWVudF9sb2NhbGVfc3luY19yZWN1cnNpdmVfLXJ1bmVzdG9uZV9hY3RpdmVjb2RlX2pzX2FjZmFjdG9yeV9qc1wiOlwiNTNhMTkxMTlmMGM2ODNlYzllZGRcIixcInJ1bmVzdG9uZV9jbGlja2FibGVBcmVhX2pzX3RpbWVkY2xpY2thYmxlX2pzXCI6XCI0NmJiYTNmMjkzNzIyNzhlNWNhNlwiLFwicnVuZXN0b25lX2NvZGVsZW5zX2pzX2NvZGVsZW5zX2pzXCI6XCJjOTVlOGJmZWNkOGE2N2QzNTg1OFwiLFwicnVuZXN0b25lX2RhdGFmaWxlX2pzX2RhdGFmaWxlX2pzXCI6XCI2NTA0ODE2YjY5M2I0ZmJkMGFkMFwiLFwicnVuZXN0b25lX2RyYWduZHJvcF9qc190aW1lZGRuZF9qc1wiOlwiYzE4NjhmZWZiZDU1ZjU5YTNmYjRcIixcInJ1bmVzdG9uZV9maXRiX2pzX3RpbWVkZml0Yl9qc1wiOlwiYTIxMDI3MzYxYmEyMThjYTk0NjlcIixcInJ1bmVzdG9uZV9raGFuZXhfanNfa2hhbmV4X2pzXCI6XCI0OGNhMjhlMmJkY2IyZTJiODg3M1wiLFwicnVuZXN0b25lX2xwX2pzX2xwX2pzXCI6XCJhMDkwZDE5ZGEzN2EzZTBkMWI3M1wiLFwicnVuZXN0b25lX21jaG9pY2VfanNfdGltZWRtY19qc1wiOlwiZTc1MGNjMWRjOTJhMjAyMzJjNGNcIixcInJ1bmVzdG9uZV9wYXJzb25zX2pzX3RpbWVkcGFyc29uc19qc1wiOlwiNDNjYjcyMjYzZmVmMWI3YjMwOWFcIixcInJ1bmVzdG9uZV9wb2xsX2pzX3BvbGxfanNcIjpcIjY4NDc0YjhhZjNjMWQyMDEzNGFlXCIsXCJydW5lc3RvbmVfcXVpemx5X2pzX3F1aXpseV9qc1wiOlwiZjk4YzhhYzA5OGUyZDA2ZGJmNGJcIixcInJ1bmVzdG9uZV9yZXZlYWxfanNfcmV2ZWFsX2pzXCI6XCI1NTk2NmM5MDg4MDAwOTFmMjA1YVwiLFwicnVuZXN0b25lX3NlbGVjdHF1ZXN0aW9uX2pzX3NlbGVjdG9uZV9qc1wiOlwiODAyMDQyZjlmZjU3NTQ0YjU4ODFcIixcInJ1bmVzdG9uZV9zaG9ydGFuc3dlcl9qc190aW1lZF9zaG9ydGFuc3dlcl9qc1wiOlwiZjIyNWFhNTVkNGMyNjMwYjM2YTdcIixcInJ1bmVzdG9uZV9zaG93ZXZhbF9qc19zaG93RXZhbF9qc1wiOlwiNTNmZmRiMzI2MWVkOGZjYmNlZWZcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2pleGNlbF9kaXN0X2pleGNlbF9qcy1ub2RlX21vZHVsZXNfamV4Y2VsX2Rpc3RfamV4Y2VsX2Nzc1wiOlwiNGRmZjA0YWM1YzFlZjA3ODYxNzhcIixcInJ1bmVzdG9uZV9zcHJlYWRzaGVldF9qc19zcHJlYWRzaGVldF9qc1wiOlwiNmJkNjMxNmRhMzc2NWYzYzQ5YmJcIixcInJ1bmVzdG9uZV90YWJiZWRTdHVmZl9qc190YWJiZWRzdHVmZl9qc1wiOlwiMzMwMDM5OTdjYmVkNGMzOGRjN2FcIixcInJ1bmVzdG9uZV90aW1lZF9qc190aW1lZF9qc1wiOlwiMzBjNGY2ZTZiZDdhZGVjNTk2MTRcIixcInZlbmRvcnMtbm9kZV9tb2R1bGVzX3dhdmVkcm9tX2xpYl9wcm9jZXNzLWFsbF9qcy1ub2RlX21vZHVsZXNfd2F2ZWRyb21fbGliX3dhdmUtc2tpbl9qc1wiOlwiNzFmNzJlYjAyZWMxNTc3OWRlMWJcIixcInJ1bmVzdG9uZV93YXZlZHJvbV9qc193YXZlZHJvbV9qc1wiOlwiNzM5NGJjMTU4MmFkMzRjZGNlMWFcIixcInJ1bmVzdG9uZV93ZWJ3b3JrX2pzX3dlYndvcmtfanNcIjpcIjc1NGFjMjgwOTJhODE3OWY3MjJjXCIsXCJydW5lc3RvbmVfdmlkZW9fanNfcnVuZXN0b25ldmlkZW9fanNcIjpcImJjZGJkM2QzNjU4NGM5YzUyOGQwXCJ9W2NodW5rSWRdICsgXCJcIjtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYWxsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5taW5pQ3NzRiA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgaW5Qcm9ncmVzcyA9IHt9O1xudmFyIGRhdGFXZWJwYWNrUHJlZml4ID0gXCJXZWJDb21wb25lbnRzOlwiO1xuLy8gbG9hZFNjcmlwdCBmdW5jdGlvbiB0byBsb2FkIGEgc2NyaXB0IHZpYSBzY3JpcHQgdGFnXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmwgPSAodXJsLCBkb25lLCBrZXksIGNodW5rSWQpID0+IHtcblx0aWYoaW5Qcm9ncmVzc1t1cmxdKSB7IGluUHJvZ3Jlc3NbdXJsXS5wdXNoKGRvbmUpOyByZXR1cm47IH1cblx0dmFyIHNjcmlwdCwgbmVlZEF0dGFjaDtcblx0aWYoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpO1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzY3JpcHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgcyA9IHNjcmlwdHNbaV07XG5cdFx0XHRpZihzLmdldEF0dHJpYnV0ZShcInNyY1wiKSA9PSB1cmwgfHwgcy5nZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIikgPT0gZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpIHsgc2NyaXB0ID0gczsgYnJlYWs7IH1cblx0XHR9XG5cdH1cblx0aWYoIXNjcmlwdCkge1xuXHRcdG5lZWRBdHRhY2ggPSB0cnVlO1xuXHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXG5cdFx0c2NyaXB0LmNoYXJzZXQgPSAndXRmLTgnO1xuXHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuXHRcdGlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLm5jKSB7XG5cdFx0XHRzY3JpcHQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgX193ZWJwYWNrX3JlcXVpcmVfXy5uYyk7XG5cdFx0fVxuXHRcdHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXdlYnBhY2tcIiwgZGF0YVdlYnBhY2tQcmVmaXggKyBrZXkpO1xuXHRcdHNjcmlwdC5zcmMgPSB1cmw7XG5cdH1cblx0aW5Qcm9ncmVzc1t1cmxdID0gW2RvbmVdO1xuXHR2YXIgb25TY3JpcHRDb21wbGV0ZSA9IChwcmV2LCBldmVudCkgPT4ge1xuXHRcdC8vIGF2b2lkIG1lbSBsZWFrcyBpbiBJRS5cblx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHR2YXIgZG9uZUZucyA9IGluUHJvZ3Jlc3NbdXJsXTtcblx0XHRkZWxldGUgaW5Qcm9ncmVzc1t1cmxdO1xuXHRcdHNjcmlwdC5wYXJlbnROb2RlICYmIHNjcmlwdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG5cdFx0ZG9uZUZucyAmJiBkb25lRm5zLmZvckVhY2goKGZuKSA9PiAoZm4oZXZlbnQpKSk7XG5cdFx0aWYocHJldikgcmV0dXJuIHByZXYoZXZlbnQpO1xuXHR9XG5cdDtcblx0dmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KG9uU2NyaXB0Q29tcGxldGUuYmluZChudWxsLCB1bmRlZmluZWQsIHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KSwgMTIwMDAwKTtcblx0c2NyaXB0Lm9uZXJyb3IgPSBvblNjcmlwdENvbXBsZXRlLmJpbmQobnVsbCwgc2NyaXB0Lm9uZXJyb3IpO1xuXHRzY3JpcHQub25sb2FkID0gb25TY3JpcHRDb21wbGV0ZS5iaW5kKG51bGwsIHNjcmlwdC5vbmxvYWQpO1xuXHRuZWVkQXR0YWNoICYmIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbn07IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsInZhciBzY3JpcHRVcmw7XG5pZiAoX193ZWJwYWNrX3JlcXVpcmVfXy5nLmltcG9ydFNjcmlwdHMpIHNjcmlwdFVybCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbiArIFwiXCI7XG52YXIgZG9jdW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuZG9jdW1lbnQ7XG5pZiAoIXNjcmlwdFVybCAmJiBkb2N1bWVudCkge1xuXHRpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdClcblx0XHRzY3JpcHRVcmwgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHNjcmlwdFVybCA9IHNjcmlwdHNbc2NyaXB0cy5sZW5ndGggLSAxXS5zcmNcblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiLy8gbm8gYmFzZVVSSVxuXG4vLyBvYmplY3QgdG8gc3RvcmUgbG9hZGVkIGFuZCBsb2FkaW5nIGNodW5rc1xuLy8gdW5kZWZpbmVkID0gY2h1bmsgbm90IGxvYWRlZCwgbnVsbCA9IGNodW5rIHByZWxvYWRlZC9wcmVmZXRjaGVkXG4vLyBbcmVzb2x2ZSwgcmVqZWN0LCBQcm9taXNlXSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdFwicnVudGltZVwiOiAwXG59O1xuXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaiA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgPyBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gOiB1bmRlZmluZWQ7XG5cdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSB7IC8vIDAgbWVhbnMgXCJhbHJlYWR5IGluc3RhbGxlZFwiLlxuXG5cdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuXHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhKSB7XG5cdFx0XHRcdHByb21pc2VzLnB1c2goaW5zdGFsbGVkQ2h1bmtEYXRhWzJdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmKFwicnVudGltZVwiICE9IGNodW5rSWQpIHtcblx0XHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG5cdFx0XHRcdFx0dmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiAoaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gW3Jlc29sdmUsIHJlamVjdF0pKTtcblx0XHRcdFx0XHRwcm9taXNlcy5wdXNoKGluc3RhbGxlZENodW5rRGF0YVsyXSA9IHByb21pc2UpO1xuXG5cdFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuXHRcdFx0XHRcdHZhciB1cmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCk7XG5cdFx0XHRcdFx0Ly8gY3JlYXRlIGVycm9yIGJlZm9yZSBzdGFjayB1bndvdW5kIHRvIGdldCB1c2VmdWwgc3RhY2t0cmFjZSBsYXRlclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IG5ldyBFcnJvcigpO1xuXHRcdFx0XHRcdHZhciBsb2FkaW5nRW5kZWQgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhpbnN0YWxsZWRDaHVua3MsIGNodW5rSWQpKSB7XG5cdFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rRGF0YSA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcblx0XHRcdFx0XHRcdFx0aWYoaW5zdGFsbGVkQ2h1bmtEYXRhICE9PSAwKSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBlcnJvclR5cGUgPSBldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2xvYWQnID8gJ21pc3NpbmcnIDogZXZlbnQudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlYWxTcmMgPSBldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnNyYztcblx0XHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLm5hbWUgPSAnQ2h1bmtMb2FkRXJyb3InO1xuXHRcdFx0XHRcdFx0XHRcdGVycm9yLnR5cGUgPSBlcnJvclR5cGU7XG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG5cdFx0XHRcdFx0XHRcdFx0aW5zdGFsbGVkQ2h1bmtEYXRhWzFdKGVycm9yKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5sKHVybCwgbG9hZGluZ0VuZGVkLCBcImNodW5rLVwiICsgY2h1bmtJZCwgY2h1bmtJZCk7XG5cdFx0XHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAwO1xuXHRcdFx0fVxuXHRcdH1cbn07XG5cbi8vIG5vIHByZWZldGNoaW5nXG5cbi8vIG5vIHByZWxvYWRlZFxuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0XG5cbl9fd2VicGFja19yZXF1aXJlX18uTy5qID0gKGNodW5rSWQpID0+IChpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPT09IDApO1xuXG4vLyBpbnN0YWxsIGEgSlNPTlAgY2FsbGJhY2sgZm9yIGNodW5rIGxvYWRpbmdcbnZhciB3ZWJwYWNrSnNvbnBDYWxsYmFjayA9IChwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiwgZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHQvLyBhZGQgXCJtb3JlTW9kdWxlc1wiIHRvIHRoZSBtb2R1bGVzIG9iamVjdCxcblx0Ly8gdGhlbiBmbGFnIGFsbCBcImNodW5rSWRzXCIgYXMgbG9hZGVkIGFuZCBmaXJlIGNhbGxiYWNrXG5cdHZhciBtb2R1bGVJZCwgY2h1bmtJZCwgaSA9IDA7XG5cdGZvcihtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSB2YXIgcmVzdWx0ID0gcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0aWYocGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24pIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuXHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSgpO1xuXHRcdH1cblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMDtcblx0fVxuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHJlc3VsdCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rV2ViQ29tcG9uZW50c1wiXSA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtXZWJDb21wb25lbnRzXCJdIHx8IFtdO1xuY2h1bmtMb2FkaW5nR2xvYmFsLmZvckVhY2god2VicGFja0pzb25wQ2FsbGJhY2suYmluZChudWxsLCAwKSk7XG5jaHVua0xvYWRpbmdHbG9iYWwucHVzaCA9IHdlYnBhY2tKc29ucENhbGxiYWNrLmJpbmQobnVsbCwgY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/runestone/dist/webpack_static_imports.json b/runestone/dist/webpack_static_imports.json index fbe63f012..1586a2174 100644 --- a/runestone/dist/webpack_static_imports.json +++ b/runestone/dist/webpack_static_imports.json @@ -1 +1 @@ -{"js":["runtime.bundle.js?v=a859ede30c6f788590e8","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]} \ No newline at end of file +{"js":["runtime.bundle.js?v=1654bbde73e12a3366eb","vendors-node_modules_bootstrap_dist_js_bootstrap_js-node_modules_jquery-ui_jquery-ui_js-node_-e60694.bundle.js?v=02c928219c61d5ca913a","runestone.bundle.js?v=db4b57b8df6b9b8f470a"],"css":[]} \ No newline at end of file